首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Excel OleDb按工作表顺序获取工作表名称

使用Excel OleDb按工作表顺序获取工作表名称
EN

Stack Overflow用户
提问于 2009-07-22 11:42:32
回答 9查看 209K关注 0票数 105

我正在使用OleDb从一个包含许多工作表的excel工作簿中读取内容。

我需要读取工作表的名称,但我需要按照它们在电子表格中定义的顺序;因此,如果我有一个像这样的文件;

代码语言:javascript
复制
|_____|_____|____|____|____|____|____|____|____|
|_____|_____|____|____|____|____|____|____|____|
|_____|_____|____|____|____|____|____|____|____|
\__GERMANY__/\__UK__/\__IRELAND__/

那我得去拿字典

代码语言:javascript
复制
1="GERMANY", 
2="UK", 
3="IRELAND"

我尝试过使用OleDbConnection.GetOleDbSchemaTable(),它会给出一个名字列表,但它会按字母顺序对它们进行排序。字母排序意味着我不知道特定名称对应于哪个页码。所以我得到了;

代码语言:javascript
复制
GERMANY, IRELAND, UK

这改变了UKIRELAND的顺序。

我需要排序的原因是,我必须让用户按名称或索引选择数据范围;他们可以要求“从德国到爱尔兰的所有数据”或“从表1到表3的数据”。

任何想法都将不胜感激。

如果我可以使用office interop类,这将非常简单。不幸的是,我不能,因为互操作类在非交互式环境中不能可靠地工作,所以我需要使用OLEDB。

EN

回答 9

Stack Overflow用户

发布于 2012-02-14 17:27:59

由于上述代码不包括提取Excel 2007的表名列表的过程,因此以下代码将同时适用于Excel(97-2003)和Excel 2007:

代码语言:javascript
复制
public List<string> ListSheetInExcel(string filePath)
{
   OleDbConnectionStringBuilder sbConnection = new OleDbConnectionStringBuilder();
   String strExtendedProperties = String.Empty;
   sbConnection.DataSource = filePath;
   if (Path.GetExtension(filePath).Equals(".xls"))//for 97-03 Excel file
   {
      sbConnection.Provider = "Microsoft.Jet.OLEDB.4.0";
      strExtendedProperties = "Excel 8.0;HDR=Yes;IMEX=1";//HDR=ColumnHeader,IMEX=InterMixed
   }
   else if (Path.GetExtension(filePath).Equals(".xlsx"))  //for 2007 Excel file
   {
      sbConnection.Provider = "Microsoft.ACE.OLEDB.12.0";
      strExtendedProperties = "Excel 12.0;HDR=Yes;IMEX=1";
   }
   sbConnection.Add("Extended Properties",strExtendedProperties);
   List<string> listSheet = new List<string>();
   using (OleDbConnection conn = new OleDbConnection(sbConnection.ToString()))
   {
     conn.Open();
     DataTable dtSheet = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);         
     foreach (DataRow drSheet in dtSheet.Rows)
     {
        if (drSheet["TABLE_NAME"].ToString().Contains("$"))//checks whether row contains '_xlnm#_FilterDatabase' or sheet name(i.e. sheet name always ends with $ sign)
        {
             listSheet.Add(drSheet["TABLE_NAME"].ToString());
        } 
     }
  }
 return listSheet;
}

上述函数返回工作表列表,特别是两种excel类型的excel文件(97,2003,2007)。

票数 23
EN

Stack Overflow用户

发布于 2018-06-24 19:41:45

这是简短、快速、安全和可用的..。

代码语言:javascript
复制
public static List<string> ToExcelsSheetList(string excelFilePath)
{
    List<string> sheets = new List<string>();
    using (OleDbConnection connection = 
            new OleDbConnection((excelFilePath.TrimEnd().ToLower().EndsWith("x")) 
            ? "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + excelFilePath + "';" + "Extended Properties='Excel 12.0 Xml;HDR=YES;'"
            : "provider=Microsoft.Jet.OLEDB.4.0;Data Source='" + excelFilePath + "';Extended Properties=Excel 8.0;"))
    {
        connection.Open();
        DataTable dt = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
        foreach (DataRow drSheet in dt.Rows)
            if (drSheet["TABLE_NAME"].ToString().Contains("$"))
            {
                string s = drSheet["TABLE_NAME"].ToString();
                sheets.Add(s.StartsWith("'")?s.Substring(1, s.Length - 3): s.Substring(0, s.Length - 1));
            }
        connection.Close();
    }
    return sheets;
}
票数 10
EN

Stack Overflow用户

发布于 2013-11-12 21:23:31

另一种方式:

xls(x)文件只是存储在*.zip容器中的*.xml文件的集合。在文件夹docProps中解压缩文件"app.xml“。

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="true"?>
-<Properties xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes" xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties">
<TotalTime>0</TotalTime>
<Application>Microsoft Excel</Application>
<DocSecurity>0</DocSecurity>
<ScaleCrop>false</ScaleCrop>
-<HeadingPairs>
  -<vt:vector baseType="variant" size="2">
    -<vt:variant>
      <vt:lpstr>Arbeitsblätter</vt:lpstr>
    </vt:variant>
    -<vt:variant>
      <vt:i4>4</vt:i4>
    </vt:variant>
  </vt:vector>
</HeadingPairs>
-<TitlesOfParts>
  -<vt:vector baseType="lpstr" size="4">
    <vt:lpstr>Tabelle3</vt:lpstr>
    <vt:lpstr>Tabelle4</vt:lpstr>
    <vt:lpstr>Tabelle1</vt:lpstr>
    <vt:lpstr>Tabelle2</vt:lpstr>
  </vt:vector>
</TitlesOfParts>
<Company/>
<LinksUpToDate>false</LinksUpToDate>
<SharedDoc>false</SharedDoc>
<HyperlinksChanged>false</HyperlinksChanged>
<AppVersion>14.0300</AppVersion>
</Properties>

该文件是德语文件(Arbeitsblätter =worksheet)。表名(Tabelle3等)的顺序是正确的。你只需要阅读这些标签;)

问候

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1164698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档