OleDb - 检索Excel工作表名称还会检索定义的名称

时间:2012-05-24 17:54:54

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

我正在尝试检索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下的条目:

  • DATA1
  • DATA2
  • DATA3
  • DATA4
  • DATA5
  • Sheet 1中$
  • TEST1 -TEST2
  • TESTHKEY
  • TESTKEYS
  • TESTVKEY

它们的TABLE_TYPE都是TABLE。

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

2 个答案:

答案 0 :(得分:2)

我的第一个想法是错的,所以我提出了这个解决方法。返回的实际工作表名称应始终以$结尾,因此我将其破解以检查该名称。凌乱,但你得到了我确定的一般想法。

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

答案 1 :(得分:-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;

     }

  }