OleDb – 检索Excel工作表名称还会检索已定义的名称

我正在尝试检索Excel工作簿中的工作表列表,但是我找回的集合中同时包含工作表名称和数据列标识,它们在原始xlsx xml中似乎被称为“已定义名称”。 你能告诉我如何只返回工作表名称?

我正在使用的代码是:

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中创build的,我试图在用C#编写的ASP.NET 4应用程序中处理它。 有可能,工作表名称可能已被更改,所以我不能保证它将始终是Sheet1 $。

我的第一个想法是错误的,所以我想出了这个解决方法。 返回的实际工作表名称应始终以$结束,所以我砍了它来检查。 凌乱,但你确定了一般想法。

 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();