我正在尝试检索Excel工作簿中的工作表列表,但我收到的集合包含工作表名称和数据列ID,它们在原始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下的条目:
它们的TABLE_TYPE都是TABLE。
与上述相对应的原始工作簿将包含1个包含5列的工作表,第一行将包含标题。我只对Sheet1 $条目感兴趣。电子表格是 在Excel 2010中创建,我正在尝试在用C#编写的ASP.NET 4应用程序中处理它。可能,工作表名称可能已更改,因此我无法保证它将始终为Sheet1 $。
答案 0 :(得分: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();
答案 1 :(得分:-1)
private static string EXCEL_CONNECTIONSTRING = string.Format("Provider=Microsoft.ACE.OLEDB.12.0; data source={0}; Extended Properties=Excel 12.0;", "#{FILENAME}");
private IEnumerable<string> GetWorksheetNames(string excelFile)
{
var currentConnectionString = EXCEL_CONNECTIONSTRING.Replace("#{FILENAME}", excelFile);
using (OleDbConnection connection = new OleDbConnection(currentConnectionString))
{
OleDbCommand cmdExcel = new OleDbCommand();
cmdExcel.Connection = connection;
connection.Open();
DataTable dt = connection.GetSchema("Tables");
IEnumerable<string> excelSheets = dt.Rows.Cast<DataRow>().Select(row => row["TABLE_NAME"].ToString());
dt.Dispose();
connection.Close();
return excelSheets;
}
}