1

我正在尝试检索 Excel 工作簿中的工作表列表,但我返回的集合同时具有工作表名称和数据列 ID,在原始 xlsx xml 中似乎称为“定义名称”。你能告诉我如何只返回工作表名称吗?

我正在使用的代码是:

OleDbConnection connExcel = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;"
            + @"Data Source=" + FilePath + ";"
            + @"Extended Properties=""Excel 8.0;HDR=Yes;""");

OleDbCommand cmdExcel = new OleDbCommand();
cmdExcel.Connection = connExcel;
connExcel.Open();

DataTable testTable = connExcel.GetSchema("Tables");

生成的 testTable 集合的内容包含以下 TABLE_NAME 下的条目:

  • 数据1
  • 数据2
  • 数据3
  • 数据4
  • 数据5
  • 表 1$
  • 测试1-测试2
  • 测试密钥
  • 测试键
  • 测试密钥

它们都有一个 TABLE_TYPE 的 TABLE。

与上述对应的原始工作簿将有一个包含 5 列的工作表,第一行将包含一个标题。我只对 Sheet1$ 条目感兴趣。该电子表格是在 Excel 2010 中创建的,我正在尝试在用 C# 编写的 ASP.NET 4 应用程序中处理它。工作表名称可能已更改,因此我不能保证它始终是 Sheet1$。

4

2 回答 2

3

我的第一个想法是错误的,所以我想出了一个解决方法。返回的实际工作表名称应始终以 $ 结尾,因此我对其进行了破解以进行检查。凌乱,但你明白我敢肯定。

OleDbConnection connExcel = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;"
        + @"Data Source=c:\test.xlsx;"
        + @"Extended Properties=""Excel 12.0 Xml;HDR=Yes;""");

        OleDbCommand cmdExcel = new OleDbCommand();
        cmdExcel.Connection = connExcel;
        connExcel.Open();

        DataTable testTable = connExcel.GetSchema("Tables");

        String[] excelSheets = new String[testTable.Rows.Count];
        int i = 0;

        foreach (DataRow row in testTable.Rows)
        {
            excelSheets[i] = row["TABLE_NAME"].ToString();

            if (excelSheets[i].EndsWith("$"))
            {
                Console.WriteLine(excelSheets[i] = row["TABLE_NAME"].ToString());
                i++;
            }
            else
            {
                i++;
            }

        }

        Console.ReadLine();
于 2012-05-24T19:17:54.873 回答
-1
private static string EXCEL_CONNECTIONSTRING = string.Format("Provider=Microsoft.ACE.OLEDB.12.0; data source={0}; Extended Properties=Excel 12.0;", "#{FILENAME}");

private IEnumerable<string> GetWorksheetNames(string excelFile)
{

     var currentConnectionString = EXCEL_CONNECTIONSTRING.Replace("#{FILENAME}", excelFile);

     using (OleDbConnection connection = new OleDbConnection(currentConnectionString))
     {
        OleDbCommand cmdExcel = new OleDbCommand();


        cmdExcel.Connection = connection;
        connection.Open();

        DataTable dt = connection.GetSchema("Tables");

        IEnumerable<string> excelSheets = dt.Rows.Cast<DataRow>().Select(row => row["TABLE_NAME"].ToString());
        dt.Dispose();
        connection.Close();
        return excelSheets;

     }

  }
于 2019-09-30T14:33:06.890 回答