【问题标题】:OleDb - Retrieving Excel worksheet names also retrieves Defined NamesOleDb - 检索 Excel 工作表名称也会检索定义的名称
【发布时间】:2012-05-24 17:54:54
【问题描述】:

我正在尝试检索 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
  • DATA4
  • DATA5
  • Sheet1$
  • 测试1 -TEST2
  • 测试键
  • 测试键
  • 测试密钥

它们都有一个 TABLE_TYPE 的 TABLE。

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

【问题讨论】:

    标签: asp.net excel c#-4.0 oledb


    【解决方案1】:

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

    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();
    

    【讨论】:

    • 感谢您的回复,对我来说是一种后处理方法!
    • 经过一番挖掘,我发现定义的名称是通过从 SAP 导出数据创建电子表格时自动创建的,结果输出中的每个数据列似乎都有一个 元素. 元素分组在 元素内的 组之后的父 元素下。 GetSchema 方法将它们全部选为“表”。您可以删除 Excel 中定义的名称,方法是在功能区中选择公式,然后在定义名称部分选择名称管理器。
    • 我有类似的问题,我得到的工作表比实际的多,而且我没有任何定义的名称。如果我的工作表名称是“abc”,那么我还有另一个名为“abc $”的工作表。谁能解释为什么它会这样?我尝试通过 sql import 导入该文件,它还显示了额外的工作表,当我打开 excel 文件时我看不到它们。
    【解决方案2】:
    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;
    
         }
    
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 2012-05-21
      • 1970-01-01
      相关资源
      最近更新 更多