动态获取第一个Excel工作表的名称并将其影响为变量

时间:2019-01-13 19:34:17

标签: c# sql-server excel ssis oledb

我使用SSIS加载具有不同工作表名称但结构相同的xlsx文件。我只需要加载每个文件的第一张纸,但是每次的名称不能相同,因此无论其名称如何,我都必须始终指向第一张纸。我认为在Excel源任务中的数据访问模式下无法使用index(1st),这就是为什么我试图使用Task脚本获取每个文件的第一张纸的名称并将其放在变量Sheet_name中的原因,在每个文件的数据访问模式下使用它。

上面的代码有一个例外,我不知道如何解决。

我试图在不使用脚本的情况下寻找解决方案,但没有找到,这就是为什么我要使代码正常工作的原因。

 public void Main()
 {
        String FolderPath = 
  Dts.Variables["User::Folder_To_Be_Processed_Path"].Value.ToString();
  String File_Name = Dts.Variables["User::File_Name"].Value.ToString();
  string fileFullPath = "";
  fileFullPath = FolderPath + "\\" + File_Name;
  string connString = "Provider=Microsoft.Jet.OLEDB.12.0;Data Source=" + 
 fileFullPath + ";Extended Properties=\"Excel 12.0;HDR=YES\";";  

 using (OleDbConnection conn = new OleDbConnection(connString))
{
conn.Open();
MessageBox.Show(connString);
dtSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { 
null, null, null, "TABLE" });
Dts.Variables["User::Sheet_Name"].Value= dtSchema.Rows[0].Field<string> 
("TABLE_NAME");
}
    Dts.TaskResult = (int)ScriptResults.Success;
}

2 个答案:

答案 0 :(得分:2)

StackOverflow和其他社区上有很多类似的帖子,主要思想是OLEDB不会以Excel工作簿中找到的相同顺序检索工作表名称,否则您需要对结果表进行排序。

使用OLEDB获取工作表名称

您应该按dtSchema列对数据表ORDINAL_POSITION进行排序,因为OLEDB提供程序不会按此顺序返回它们。

使用Interop库获取工作表名称

主持人在此MSDN - post中提到:

  

恐怕OLEDB不会像在Excel中那样保留工作表顺序。您必须使用OLEDB吗?获取工作表名称的另一种方法是使用Office互操作类。

并提供了以下代码来获取工作表名称:

Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook excelBook = xlApp.Workbooks.Open("D:\\Book1.xlsx"); 

String[] excelSheets = new String[excelBook.Worksheets.Count];
int i = 0;
foreach(Microsoft.Office.Interop.Excel.Worksheet wSheet in excelBook.Worksheets)    
{
  excelSheets[i] = wSheet.Name;
  i++;
}

其他有用的链接

答案 1 :(得分:0)

要动态检索excel文件表名称

 using (OleDbConnection conn = new OleDbConnection(connString))
{
    conn.Open();
    dtSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
    Sheet1= dtSchema.Rows[0].Field<string>("TABLE_NAME");
}