【问题标题】:How to skip rows while importing ExcelSheet with variable sheetname?如何在导入具有可变工作表名称的 Excel 工作表时跳过行?
【发布时间】:2019-08-21 10:25:40
【问题描述】:

我必须通过 SSIS 导入具有可变工作表名称的 ExcelSheets。 Sheetname 由 scripttask 确定并通过 User::Variable 传递给 ExcelSource。问题是数据/标题总是从第 11 行开始。

如何将“$A10:AB50”(必需的数据选择)之类的内容传递给 User::Variable 中传递的工作表名称?

我已经尝试将所需的数据选择字符串(例如“$A10:AB50”)传递给 OpenRowsetVariable、ExcelConnectionManager、ConnectionString...,但没有成功。我还尝试通过条件拆分跳过/拆分前 10 行,但找不到任何解决方法。

使用第二个 ConnectionManager 从定义的文件中获取数据并通过 sql-query(例如“select f1,f2... from [sheetname$a1:ab50]”)进行数据访问的测试确实非常有效。

这是 scripttask 确定工作表名称的方式:

ConStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FILEPATH + ";Extended Properties=\"Excel 12.0;HDR=" + HDR + ";IMEX=0\"";
                OleDbConnection cnn = new OleDbConnection(ConStr);

                cnn.Open();
                DataTable dtSheet = cnn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                string sheetname = "";

                foreach (DataRow drSheet in dtSheet.Rows)
                {
                    // sheetname only
                    if (drSheet["TABLE_NAME"].ToString().Contains("$") && !drSheet["TABLE_NAME"].ToString().Contains("Print_Area"))
                    {
                        sheetname = drSheet["TABLE_NAME"].ToString();

                        // return sheetname
                        //MessageBox.Show(sheetname);
                        Dts.Variables["User::rSheetName"].Value = sheetname;

【问题讨论】:

    标签: excel import ssis visual-studio-2017


    【解决方案1】:

    解决了! 只需将确定的数据选择添加到 scripttask 中的 sheet-return-variable 即可:

    if (drSheet["TABLE_NAME"].ToString().Contains("$") && !drSheet["TABLE_NAME"].ToString().Contains("Print_"))
                        {
                            SheetName = drSheet["TABLE_NAME"].ToString();
    
                            // concat datazone to sheetname
                            DataZone = "A10:AB50";
                            SnameValue = SheetName + DataZone;
                            SnameValue = SnameValue.Replace(@"'", "");
    
                            // return combined sheetname
                            MessageBox.Show(SnameValue);
                            Dts.Variables["User::rSheetName"].Value = SnameValue;
    
                            cnn.Close();
    
                        }
    

    这很容易......无论如何都感谢您考虑它;-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多