2012-05-24 44 views
1

我想检索Excel工作簿中的工作表的列表,但我收回的集合有表单名称和数据列ID,这似乎被称为原定xlsx xml中的'Defined Names'。你能告诉我如何只返回工作表名称?OleDb - 检索Excel工作表名称还检索定义的名称

我正在使用的代码是沿着线:

OleDbConnection connExcel = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;" 
      + @"Data Source=" + FilePath + ";" 
      + @"Extended Properties=""Excel 8.0;HDR=Yes;"""); 

OleDbCommand cmdExcel = new OleDbCommand(); 
cmdExcel.Connection = connExcel; 
connExcel.Open(); 

DataTable testTable = connExcel.GetSchema("Tables"); 

所产生的TestTable的集合的内容包含TABLE_NAME下的条目:

  • DATA1
  • DATA2
  • DATA3
  • DATA4
  • DATA5
  • 工作表Sheet1 $
  • TEST1 -TEST2
  • TESTHKEY
  • TESTKEYS
  • TESTVKEY

他们都有TABLE的TABLE_TYPE。

与上述对应的原始工作簿将有1个包含5列的工作表,第一行将包含一个标题。我只对Sheet1 $条目感兴趣。电子表格是在Excel 2010中创建的 ,我试图在用C#编写的ASP.NET 4应用程序中处理它。有可能,工作表名称可能已被更改,所以我不能保证它始终是Sheet1 $。

回答

2

我的第一个想法是错误的,所以我想出了这个解决方法。返回的实际工作表名称应该始终以$结尾,因此我会对其进行入侵检查。凌乱,但你确定了一般想法。

OleDbConnection connExcel = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;" 
     + @"Data Source=c:\test.xlsx;" 
     + @"Extended Properties=""Excel 12.0 Xml;HDR=Yes;"""); 

     OleDbCommand cmdExcel = new OleDbCommand(); 
     cmdExcel.Connection = connExcel; 
     connExcel.Open(); 

     DataTable testTable = connExcel.GetSchema("Tables"); 

     String[] excelSheets = new String[testTable.Rows.Count]; 
     int i = 0; 

     foreach (DataRow row in testTable.Rows) 
     { 
      excelSheets[i] = row["TABLE_NAME"].ToString(); 

      if (excelSheets[i].EndsWith("$")) 
      { 
       Console.WriteLine(excelSheets[i] = row["TABLE_NAME"].ToString()); 
       i++; 
      } 
      else 
      { 
       i++; 
      } 

     } 

     Console.ReadLine(); 
+0

感谢您的回复,作为后期处理方法适合我! – Mike

+0

经过少许挖掘,我发现当通过从SAP导出数据创建电子表格时,会自动创建定义的名称,结果输出中的每个数据列似乎都有一个元素。 元素分组在元素中的组后面的父元素下。 GetSchema方法将它们全部选为“表”。您可以通过选择功能区中的公式,然后在“定义的名称”部分中选择“名称管理器”来删除Excel中定义的名称。 – Mike

+0

我有类似的问题,我得到更多的工作表比实际,我没有任何定义的名称。如果我的工作表名称是“abc”,那么我有另一个名为“abc $”的工作表。任何人都可以解释为什么它的行为如此吗?我试图通过sql导入导入该文件,并且还显示了额外的工作表,我可以在打开excel文件时看到它们。 –