我在使用 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 按工作表顺序获取工作表名称
在有人问之前,我还想说,我实际上无法控制电子表格中使用的功能,因此我不能只是告诉他们“不要打开过滤”或“不要使用打印表”。
任何想法都非常感激。谢谢!