我在使用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;
}
Run Code Online (Sandbox Code Playgroud)
我在这个链接上阅读了这篇文章,但它们似乎没有做任何不同于我的事情,而且我没有看到任何过滤掉额外的非工作表,所以微软似乎没有提供正确答案.
http://support.microsoft.com/kb/318452
而且我也看了很多StackOverflow,就像下面链接中的线程有帮助,但没有解决这个问题.
使用Excel OleDb获取工作表名称IN SHEET ORDER
在有人要求之前,我还想说我无法控制电子表格中使用的功能,所以我不能告诉他们"不要打开过滤"或"不要使用打印表".
任何想法都非常感谢.谢谢!
这个问题很老了,但是对于那些现在找到它的人来说,可以像吉姆发现的那样跳过......
// skip those that do not end correctly
foreach (DataRow row in schemTable.Rows)
{
string sheetName = row["TABLE_NAME"].ToString();
if (!sheetName.EndsWith("$") && !sheetName.EndsWith("$'"))
continue;
Console.WriteLine(sheetName);
}
Run Code Online (Sandbox Code Playgroud)
这是通缉的人或以 结尾的人$
或以 结尾的人$'
。