如何使用OLEDB获取Excel中的唯一Excel工作表名称列表; 过滤掉显示在元数据中的非工作表

Jim*_*Jim 9 c# oledb excel

我在使用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

在有人要求之前,我还想说我无法控制电子表格中使用的功能,所以我不能告诉他们"不要打开过滤"或"不要使用打印表".

任何想法都非常感谢.谢谢!

pep*_*epr 5

这个问题很老了,但是对于那些现在找到它的人来说,可以像吉姆发现的那样跳过......

// 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)

这是通缉的人或以 结尾的人$或以 结尾的人$'


Bri*_*dge 2

根据经验,似乎都是名字以美元符号结尾的人。我遇到过来自客户的场景,其中似乎出现了数据中不存在的额外工作表 - 后来发现这些工作表是 Excel 中的隐藏工作表!