Member 13769780 Ответов: 1

Импорт данных из нескольких листов excel с помощью служб SSIS


У меня есть ниже код c sharp в компоненте скрипта(преобразование) в пакете ssis, который будет загружать данные с одного листа из каждой книги. Теперь требования изменились и у меня есть более 15 книг excel, которые имеют несколько листов, и мне нужно автоматизировать перенос этих данных в таблицу SQL server.

Есть ли способ извлекать данные из Excel только с определенных листов? Похоже, что он полагается на имя листа в качестве источника данных, например ExcelworkbookA имеет 7 шетов, но нуждается в данных только с трех листов.
Кто-нибудь посоветует мне, как изменить приведенный ниже код, чтобы разрешить несколько листов из exceworkbooks


#справка по региону: введение в компонент скрипта
/* Компонент сценария позволяет выполнять практически любую операцию, которая может быть выполнена в
* приложение .Net в контексте потока данных служб Integration Services.
*
* Раскройте другие регионы, которые имеют префиксы "Help", чтобы найти примеры конкретных способов использования
* Функции служб Integration Services в этом компоненте скрипта. */
#endregion

#пространства имен регионов
использование системы;
использование System.Data;
использование Microsoft.SqlServer.Dts.Pipeline.Обертка;
с помощью Microsoft.От SQLServer.ДЦ.Во время выполнения.Обертка;
использование System.Data.Для oledb;
использование системы.Окна.Формы;
использование Excel = Microsoft.Офис.Взаимодействие.Превосходить;
#endregion

/// <резюме>
/// Это класс, в который нужно добавить свой код. Не изменяйте имя, атрибуты или родителя
/// из этого класса.
///
[Майкрософт.От SQLServer.ДЦ.Производство.Ssisscriptcomponentrypointattribute]
открытый класс ScriptMain : UserComponent
{
#справка по региону: использование переменных и параметров служб Integration Services
/* Чтобы использовать переменную в этом скрипте, сначала убедитесь, что она была добавлена в
* либо список, содержащийся в свойство readonlyvariables или перечень, содержащийся в
* свойство ReadWriteVariables этого компонента скрипта, в зависимости от того, является ли ваш
* код должен быть записан в переменную. Для этого сохраните этот скрипт, закройте этот экземпляр
* Visual Studio и обновите свойства ReadOnlyVariables и ReadWriteVariables в
* Окно редактора преобразования скриптов.
* Чтобы использовать параметр в этом скрипте, выполните те же действия. Параметры всегда доступны только для чтения.
*
* Пример считывания из переменной или параметра:
* DateTime startTime = переменные.MyStartTime;
*
* Пример записи в переменную:
* Variables.myStringVariable = "новое значение";
*/
#endregion

#справка по региону: использование менеджеров соединений служб Integration Services
/* В этом компоненте скрипта можно использовать некоторые типы менеджеров соединений. См. раздел справки
* Подробнее см. раздел "программная работа с менеджерами соединений".
*
* Чтобы использовать диспетчер соединений в этом сценарии, сначала убедитесь, что диспетчер соединений имеет
* был добавлен либо в список менеджеров подключений на странице менеджеры подключений сайта
* редактор компонентов скрипта. Чтобы добавить диспетчер соединений, сохраните этот сценарий, закройте этот экземпляр
* Visual Studio и добавьте диспетчер подключений в список.
*
* Если компоненту необходимо удерживать соединение открытым во время обработки строк, переопределите
* Методы AcquireConnections и ReleaseConnections.
*
* Пример использования менеджера ADO.Net связи, чтобы приобрести объект sqlconnection:
* объект rawConnection = соединения.SalesDB.AcquireConnection(транзакция);
* SqlConnection salesDBConn = (SqlConnection)rawConnection;
*
* Пример использования Диспетчера соединений с файлами для получения пути к файлу:
* объект rawConnection = соединения.Prices_zip.AcquireConnection(транзакция);
* string filePath = (string)rawConnection;
*
* Пример освобождения диспетчера соединений:
* Блат.SalesDB.ReleaseConnection(rawConnection);
*/
#endregion

#справка по региону: запуск событий служб интеграции
/* Этот компонент скрипта может запускать события.
*
* Пример запуска события ошибки:
* ComponentMetaData.FireError(10, "значения процесса", "плохое значение", "", 0, out cancel);
*
* Пример запуска информационного события:
* ComponentMetaData.FireInformation(10, "значения процесса", "обработка началась", "", 0, fireAgain);
*
* Пример запуска предупреждающего события:
* ComponentMetaData.Предупреждение о пожаре(10, "значения процесса", "строки не получены", "", 0);
*/
#endregion

/// <резюме>
/// Этот метод вызывается один раз, прежде чем строки начнут обрабатываться в потоке данных.
///
/// Вы можете удалить этот метод, если вам ничего не нужно здесь делать.
///
общественного переопределить недействительными методами preexecute()
{
базы.Методами preexecute();
/*
* Добавьте свой код здесь
*/
}

/// <резюме>
/// Этот метод вызывается после того, как все строки прошли через этот компонент.
///
/// Вы можете удалить этот метод, если вам ничего не нужно здесь делать.
///
public override void PostExecute()
{
база.PostExecute();
/*
* Добавьте свой код здесь
*/
}

общественного переопределить недействительными метод createnewoutputrows()
{
/*
Добавьте строки, вызвав метод AddRow для переменной-члена с именем "Buffer".
Например, вызовите MyOutputBuffer.AddRow (), если ваш вывод был назван "MyOutput".
*/

пробовать
{

строковое имя файла = переменные.SharepointFilepath.Метод toString();
//string sheetName; //= переменные.ExcelSheetName.Метод toString();

Превосходить.Приложение xlApp = новый Excel.Приложение();
xlApp.Видна = ложь;
xlApp.DisplayAlerts = ложь;
Превосходить.Рабочая тетрадь xlWorkBook = xlApp.Workbooks.Открыть(имя файла, пароль: "'");
Превосходить.Рабочий лист xlWorkSheet = xlWorkBook.Рабочие листы[1] как Microsoft.Офис.Взаимодействие.Превосходить.Рабочий лист;

Превосходить.Диапазон UsedRange = xlWorkSheet.UsedRange;


foreach (Excel.Диапазон c в UsedRange)
{
строка val = Convert.Метод toString(ок. Значение2);
если (val != усилитель"" &;&ампер; вал != нуль)
{
Output0Buffer.Метода addrow();
Output0Buffer.Строка = c.строка;
Output0Buffer.Колонка = c.колонка;
Output0Buffer.Значение = Вэл;
}
}



xlApp.Бросить();
xlApp = null;

СБОРЩИК МУСОРА.Собирать();
GC.WaitForPendingFinalizers();

}

catch (исключение e)
{
Output1Buffer.Метода addrow();
Output1Buffer.Исключение = e.ToString();
}

}

}

Что я уже пробовал:

Пробовал с переменной но безуспешно

#realJSOP

Являются ли имена файлов и имена листов всегда одинаковыми?

Member 13769780

да имена файлов и имена листов всегда одинаковы

1 Ответов

Рейтинг:
0

#realJSOP

0) Во-первых, я бы не стал использовать задачу скрипта для импорта файла excel, если бы это не было абсолютно необходимо. Существует встроенная функция импортера, которая делает это намного проще.

1) я бы создал отдельный пакет импортера для каждого рабочего листа. Почему? Потому что отчеты об ошибках SSIS засасывают дикие ослиные шланги, и сбой в любом месте процесса импорта может привести к сбою всего пакета и, таким образом, привести к сбою связанного агента SQL. Гораздо проще свести к нулю отказы, когда у вас есть агент, который выполняет "шаг" для каждого пакета. Единственным возможным недостатком этого является то, что имена файлов и имена листов всегда должны быть одинаковыми, а листы всегда должны иметь одинаковые столбцы, отформатированные одинаково.

2) если вы настаиваете на использовании задачи сценария (опять же, я предлагаю вам этого не делать), я опубликовал статью в выходные дни, которая позволяет загрузить файл excel (без использования EXCEL INTEROP) в DataTable затем он может быть использован для перемещения данных в базу данных - CSV/Excel File Parser - A Revisit[^]


Member 13769780

Спасибо. В статье CSV/Excel File Parser - A Revisit[^] какую часть мне нужно рассмотреть. К сожалению, у меня очень мало опыта в написании сценариев. пожалуйста предложите

#realJSOP

Код в этой статье позволит вам импортировать электронную таблицу excel - все, что вам нужно сделать, это указать имя файла и имя листа. То, что вы делаете с данными после их анализа, действительно зависит от вас. задача скрипта-это не что иное, как сборка C#, которую вы компилируете. Все, что вы можете сделать в c#, вы можете сделать в скрипте. ИМХО, если вы не обучены этому (SSIS и C#), вы не тот человек, чтобы изменять сценарий, потому что небольшая ошибка с вашей стороны может уничтожить ваши существующие данные.

В статье есть код, и примеры использования для изучения Excel и CSV файлов. Вы должны изучить его и оценить его пригодность для вашей задачи, прежде чем использовать его.