如何用Excel OleDb按工作表顺序获取工作表名?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (45)

我使用OleDb从excel工作簿读取很多工作表。

我需要阅读工作表名称,但是我需要按照他们在电子表格中定义的顺序; 所以如果我有一个看起来像这样的文件;

|_____|_____|____|____|____|____|____|____|____|
|_____|_____|____|____|____|____|____|____|____|
|_____|_____|____|____|____|____|____|____|____|
\__GERMANY__/\__UK__/\__IRELAND__/

然后我需要得到

1="GERMANY", 
2="UK", 
3="IRELAND"

我尝试过使用OleDbConnection.GetOleDbSchemaTable(),并给了我名单的列表,但它按字母顺序排列它们。阿尔法排序意味着我不知道某个特定名称所对应的纸张编号。所以我得到了;

GERMANY, IRELAND, UK

这改变了UKIRELAND的顺序。

我需要对它进行排序的原因是我必须让用户通过名称或索引选择一系列数据; 他们可以要求“从德国到爱尔兰的所有数据”或“从表格1到表格3的数据”。

任何想法将不胜感激。

如果我可以使用办公室互操作类,这将是直接的。不幸的是,我不能这样做,因为互操作类在非交互式环境(如Windows服务和ASP.NET网站)中不能可靠地工作,所以我需要使用OLEDB。

提问于
用户回答回答于
用户回答回答于

你能不能循环遍历从0到名称-1的计数?这样你就应该按照正确的顺序把它们取出来。

使用Interop类检索表名称有很多问题。因此,下面是使用OLEDB检索它们的示例:

/// <summary>
/// This method retrieves the excel sheet names from 
/// an excel workbook.
/// </summary>
/// <param name="excelFile">The excel file.</param>
/// <returns>String[]</returns>
private String[] GetExcelSheetNames(string excelFile)
{
    OleDbConnection objConn = null;
    System.Data.DataTable dt = null;

    try
    {
        // Connection String. Change the excel file to the file you
        // will search.
        String connString = "Provider=Microsoft.Jet.OLEDB.4.0;" + 
          "Data Source=" + excelFile + ";Extended Properties=Excel 8.0;";
        // Create connection object by using the preceding connection string.
        objConn = new OleDbConnection(connString);
        // Open connection with the database.
        objConn.Open();
        // Get the data table containg the schema guid.
        dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

        if(dt == null)
        {
           return null;
        }

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

        // Add the sheet name to the string array.
        foreach(DataRow row in dt.Rows)
        {
           excelSheets[i] = row["TABLE_NAME"].ToString();
           i++;
        }

        // Loop through all of the sheets if you want too...
        for(int j=0; j < excelSheets.Length; j++)
        {
            // Query each excel sheet.
        }

        return excelSheets;
   }
   catch(Exception ex)
   {
       return null;
   }
   finally
   {
      // Clean up.
      if(objConn != null)
      {
          objConn.Close();
          objConn.Dispose();
      }
      if(dt != null)
      {
          dt.Dispose();
      }
   }
}

扫码关注云+社区