如何使用OLEDB在Excel中获取仅Excel工作表名称的列表;筛选出元数据中显示的非工作表

本文关键字:工作 Excel 筛选 元数据 显示 列表 何使用 获取 OLEDB | 更新日期: 2023-09-27 18:34:47

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

通读了这个链接上的文章,但他们似乎没有做任何与我不同的事情,而且我没有看到任何额外的非工作表表的过滤,所以Microsoft似乎没有提供正确的答案。

http://support.microsoft.com/kb/318452

我也环顾了很多 StackOverflow,比如下面链接中的线程,这很有帮助,但不能解决这个问题。

使用 Excel OleDb 获取工作表名称 按工作表顺序

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

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

如何使用OLEDB在Excel中获取仅Excel工作表名称的列表;筛选出元数据中显示的非工作表

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

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

那就是通缉者或以$

结尾或以$'结尾的通缉令。

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

我想

到的第一种方法与您链接到的akash88相同使用 Excel OleDb 获取工作表顺序中的工作表名称链接。

你可以采用akash88的方法并清理一下,这样代码就更好读了。

        var wsList = from s in schemaTable
                     where s.Field<string>("TABLE_NAME").Contains("$")
                     select s.Field<string>("TABLE_NAME");

您可以测试EndsWith("$")而不是如下所示Contains("$")

List<String> lstsheetNames = new List<String>();
String sheetName;
foreach (DataRow row in schemaTable.Rows)
{
    sheetName = row.Field<string>("TABLE_NAME");
    String strTemp = sheetName.Split(' ');
    if(strTemp.Length == 1 && sheetName.EndsWith("$"))
       lstsheetNames.Add(sheetName.Substring(0, sheetName.Length - 1));
    else if(strTemp.Length > 1 && strTemp.GetValue(strTemp.Length - 1).ToString().EndsWith("$'"))
       lstsheetNames.Add(sheetName.Substring(1, sheetName.Length - 3));
}

我在同一个问题中使用了这段代码,它工作正常。

编辑:对不起,我没有注意这个。我现在更改了代码。这可能不是最好或最短的方法,但它有效。