Published on

May 11, 2021

Использование SSIS Script Task для динамического определения строки заголовка в электронных таблицах Excel

Импорт электронных таблиц Excel в базу данных может быть обычной задачей во многих проектах. Однако часто возникает проблема, что не все таблицы имеют одинаковый номер строки для заголовка. Это особенно верно при работе с таблицами от разных поставщиков, так как они могут содержать дополнительную информацию в верхней части строки заголовка.

В этой статье мы рассмотрим, как SSIS script task может быть использован для решения этой проблемы путем динамического определения строки заголовка. Это позволит нам точно импортировать данные из таблицы, независимо от вариаций положения строки заголовка.

Шаг 1: Настройка SSIS пакета

Сначала давайте посмотрим на структуру примера таблицы. Для простоты предположим, что строка заголовка начинается с пятой строки. Однако в реальной ситуации это положение может варьироваться.

Чтобы динамически определить строку заголовка во время выполнения SSIS пакета, мы будем использовать script task перед data flow task. Вот пример того, как должен выглядеть Control Flow SSIS пакета:


Добавьте новую строковую переменную с именем "varTabName" и включите эту переменную в качестве ReadWriteVariable для Script Task.

Добавьте предоставленный код в Script Task:

public void Main()  
{      
    string filePath = "C:\\MSSQLTips\\MSSQLTip1.xlsx";      
    string tabName = "Sheet1$";      
    String strCn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties=\"Excel 12.0;HDR=NO;IMEX=1\";";      
    OleDbConnection cn = new OleDbConnection(strCn);      
    string strSQL = "Select * From [" + tabName + "A1:D100]";
    int iCnt = 0;      
    OleDbDataAdapter objAdapter = new OleDbDataAdapter(strSQL, cn);
    DataSet ds = new DataSet();
    objAdapter.Fill(ds, "dSheet1");
    DataTable dt = ds.Tables["dSheet1"];
    
    foreach (DataRow row in dt.Rows)
    {
        iCnt = iCnt + 1;
        if ((row[0].ToString() == "HdrCol1")              
            & (row[1].ToString() == "HdrCol2")              
            & (row[2].ToString() == "HdrCol3")              
            & (row[3].ToString() == "HdrCol4"))          
        {              
            Dts.Variables["varTabName"].Value = tabName + "A" + iCnt.ToString() + ":D1048576";              
            break;          
        }      
    }      
    cn.Close();      
    Dts.TaskResult = (int)ScriptResults.Success;  
}

В этом примере путь к файлу и имя вкладки электронной таблицы были захардкожены для простоты. Однако в реальной ситуации вы захотите сделать эти значения настраиваемыми.

Шаг 2: Настройка Data Flow Task

В Data Flow task выберите Excel в качестве источника и для режима доступа к данным используйте опцию “Table name or view name variable”. В выпадающем списке Variable Name выберите User::varTabName.

Динамическим установкой диапазона данных в SSIS script task мы теперь можем точно импортировать данные из таблицы, независимо от вариаций положения строки заголовка.

Заключение

SSIS script task предоставляет мощное решение для динамического определения строки заголовка в электронных таблицах Excel. Используя этот подход, мы можем гарантировать точный импорт данных, независимо от вариаций положения строки заголовка.

В следующий раз, когда вы столкнетесь с подобной проблемой в своем проекте, рассмотрите возможность использования SSIS script task для эффективного и эффективного ее решения.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.