我正在使用OleDb从包含许多工作表的excel工作簿中读取 .
我需要阅读工作表名称,但我需要按照电子表格中定义的顺序进行操作;所以如果我有一个看起来像这样的文件;
|_____|_____|____|____|____|____|____|____|____|
|_____|_____|____|____|____|____|____|____|____|
|_____|_____|____|____|____|____|____|____|____|
\__GERMANY__/\__UK__/\__IRELAND__/
然后我需要得到字典
1="GERMANY",
2="UK",
3="IRELAND"
我尝试过使用 OleDbConnection.GetOleDbSchemaTable()
,这给了我名单,但按字母顺序对它们进行排序 . 字母排序意味着我不知道特定名称对应于哪个表格编号 . 所以我得到了;
GERMANY, IRELAND, UK
这改变了 UK
和 IRELAND
的顺序 .
我需要对它进行排序的原因是我必须让用户按名称或索引选择一系列数据;他们可以要求“从德国到爱尔兰的所有数据”或“从表1到表3的数据” .
任何想法将不胜感激 .
如果我可以使用办公室互操作课程,这将是直截了当的 . 不幸的是,我不能,因为互操作类在非交互式环境(如Windows服务和ASP.NET站点)中不能可靠地工作,所以我需要使用OLEDB .
11 回答
这对我有用 . 从这里被盗:How do you get the name of the first page of an excel workbook?
在实际的MSDN文档中找不到这个,但论坛中的主持人说
Excel Sheet Names in Sheet Order
似乎这是一个普遍的要求,将有一个体面的解决方法 .
你能不能只是将表格从0循环到名字-1的计数?那样你应该按照正确的顺序得到它们 .
Edit
我通过评论注意到,使用Interop类检索工作表名称存在很多问题 . 因此,这是一个使用OLEDB检索它们的示例:
从CodeProject上的Article中提取 .
由于上述代码不包括提取Excel 2007工作表名称列表的过程,因此以下代码也适用于Excel(97-2003)和Excel 2007:
上面的函数返回两个excel类型(97,2003,2007)的特定excel文件的工作表列表 .
其他方式:
xls(x)文件只是存储在* .zip容器中的* .xml文件的集合 . 解压缩docProps文件夹中的文件“app.xml” .
该文件是德语文件(Arbeitsblätter= worksheets) . 表名(Tabelle3等)的顺序正确 . 你只需要阅读这些标签;)
问候
我使用@kraeppy(https://stackoverflow.com/a/19930386/2617732)答案中提供的信息创建了以下函数 . 这需要使用.net framework v4.5,并且需要引用System.IO.Compression . 这仅适用于xlsx文件,不适用于较旧的xls文件 .
这是简短,快速,安全和可用的......
我喜欢@deathApril将页面命名为1_Germany,2_UK,3_IRELAND的想法 . 我也有你的问题,重命名数百张 . 如果重命名工作表名称没有问题,则可以使用此宏为您执行此操作 . 重命名所有工作表名称只需不到几秒钟 . 不幸的是,ODBC,OLEDB通过asc返回工作表名称顺序 . 没有替代品 . 您必须使用COM或重命名您的名称 .
更新:在阅读@SidHoland关于BIFF的评论之后,一个想法闪现了 . 可以通过代码完成以下步骤 . 不知道你是否真的想这样做以获得相同顺序的工作表名称 . 如果您需要帮助以通过代码执行此操作,请告诉我们 .
更新:另一个解决方案 - NPOI在这里可能会有所帮助http://npoi.codeplex.com/
此解决方案适用于xls . 我没有尝试xlsx .
谢谢,
也先
试试这个 . 以下是按顺序获取工作表名称的代码 .
根据MSDN,在Excel中的电子表格的情况下,它可能无法工作,因为Excel文件不是真正的数据库 . 因此,您将无法按工作簿中的可视化顺序获取工作表名称 .
使用interop根据视觉外观获取工作表名称的代码:
添加对Microsoft Excel 12.0对象库的引用 .
以下代码将以工作簿中存储的实际顺序给出工作表名称,而不是已排序的名称 .
示例代码:
我没有看到任何文档说app.xml中的顺序保证是工作表的顺序 . 它可能是,但不是根据OOXML规范 .
另一方面,workbook.xml文件包含sheetId属性,确定序列 - 从1到工作表数 . 这是根据OOXML规范 . workbook.xml被描述为保留工作表序列的位置 .
因此,从XLSX中提取后读取workbook.xml将是我的建议 . 不是app.xml . 而不是docProps / app.xml,使用xl / workbook.xml并查看元素,如下所示 -
`
`