我在使用 OLEDB 从 Excel 电子表格中获取工作表名称时遇到问题。问题是当我使用 GetOleDbSchemaTable 时,生成的 DataTable 不仅仅是实际的工作表名称;它有额外的“表格”行,我只能假设 Excel 在内部使用这些行。
例如,如果我有一个名为 myWorksheet 的工作表,下面的代码可能会以包含 myWorksheet$、myWorksheet$PrintTable 和 myWorksheet$_ 的列表结束。只有第一个 myWorksheet$ 记录用于实际工作表。其他的只是我不需要的垃圾。当您在元数据中查看它们时,它们看起来就像常规表,即使是 TABLE 类型。
现在,我只是手动过滤掉了名称中带有“$_”或“$Print”的任何内容,但谁知道其他 Excel 功能可能会使这些额外记录以不同的格式出现。
有谁知道仅获取实际工作表名称而不是这些不是工作表的内部表的最佳方法?元数据中有什么东西可以区分它们吗?
private ArrayList getXlsWorksheetNames(OleDb.OleDbConnection conn)
{
ArrayList wsList = new ArrayList();
DataTable schemaTable;
try
{
conn.Open();
schemaTable = conn.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Tables, null);
foreach (DataRow row in schemaTable.Rows)
{
//form.appendToResultsTxt("Adding worksheet to list: " + Environment.NewLine +
// "Name = " + row.Field<string>("TABLE_NAME") + "," + Environment.NewLine +
// "Type = " + row.Field<string>("TABLE_TYPE") + "," + Environment.NewLine + Environment.NewLine);
wsList.Add(row.Field<string>("TABLE_NAME"));
}
conn.Close();
}
catch (Exception ex)
{
if (this.mode == Cps2TxtUtilModes.GUI_MODE)
{
this.form.appendToResultsTxt(ex.ToString());
}
throw;
}
return wsList;
}
我通读了此链接上的文章,但他们似乎没有做任何与我不同的事情,而且我没有看到任何过滤掉额外的非工作表表,所以微软似乎没有提供正确答案。
http://support.microsoft.com/kb/318452
而且我还查看了很多 StackOverflow,比如下面链接中的线程,这很有帮助,但不能解决这个问题。
使用 Excel OleDb 在 SHEET ORDER 中获取工作表名称
在有人问之前,我还想说我无法控制电子表格中使用的功能,所以我不能只告诉他们“不要打开过滤”或“不要使用打印表格”。
任何想法都非常感谢。谢谢!