如何获取列表只能用OLEDB Excel中的Excel工作表的名称; 过滤掉非工作表,在元数据显

2019-06-24 13:38发布

我从使用OLEDB Excel电子表格让工作表名称的问题。 问题是,当我使用GetOleDbSchemaTable,结果DataTable已经不仅仅是实际的工作表名称的更多; 它具有“表”,我只能假设使用Excel内部使用额外行。

因此,举例来说,如果我有一个名为myWorksheet工作表,下面的代码可能最终与包含myWorksheet $,$ myWorksheet和PrintTable $ myWorksheet _列表。 只有第一个myWorksheet $记录是实际的工作表。 其他人都只是垃圾,我不需要。 当您在元数据看他们,他们看起来就像普通的表,甚至表的类型。

现在我只是手动过滤掉以“$ _”或在一个名为“$打印”任何东西,但谁知道什么其他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来获得单订购表名称

有人问之前,我还想说,我真的没有在什么功能在电子表格中使用的控制,所以我不能告诉他们“不要打开过滤”或“不使用打印表格”。

任何想法非常赞赏。 谢谢!

Answer 1:

现在的问题是旧的,但对于那些谁发现了它,现在,跳绳可以做到吉姆发现...

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

这是有用的还是那些以结束$或那些与结束$'



Answer 2:

从经验来看,这似乎是所有那些名字中一个美元符号结束。 我遇到的情况,从客户那里额外的工作表似乎显示其并没有在数据中 - 这些后来在Excel原来是隐藏的工作表!



Answer 3:

这使我想到的第一个办法是在你的链接列出相同的方式akash88 使用Excel OleDb的,以获得单订购表名称的链接。

你可以采取akash88的做法和它清理干净一点,所以代码是更好的阅读。

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


Answer 4:

您可以测试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));
}

我有一个同样的问题,使用此代码,它工作正常。

编辑:对不起,我没注意this.I改变了代码now.It可能不是最好的或最简单的办法,但它的工作原理。



文章来源: How to get list of ONLY excel worksheet names in Excel using OLEDB; filter out non-worksheets that show up in metadata
标签: c# excel oledb