excel - 链接工作表名称和 XML 文件的正确方法
问题描述
我继承了一个使用 XML 函数读取 *.xlsx 文件的电子表格模块。该应用程序使用工作表名称映射数据,并且模块的那部分非常损坏。
我没有一个月的时间来查找和阅读 Office Open XML 格式的规范,因此我在快速查看了一些示例文件后编写了一个快速破解:
开
xl/workbook.xml
环/workbook/sheets
:- 从
name
. - 从 中获取 ID
r:id
。 - 使用文件顺序作为显示顺序。
- 从
开
xl/_rels/workbook.xml.rels
环/Relationships
滤波Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet
:- 通过 映射到名称
Id
。 - 通过映射到文件
Target
。
- 通过 映射到名称
这个算法正确吗?
解决方案
这是一篇较旧的帖子,OP 可能已经继续,但如果其他人对此感兴趣,我发现了什么。
我在编写一个简单的解析器来执行一些 XLSX 按摩时也遇到了这个问题,并且找不到文档来指示 XML 文件名映射到workbook.xml
.
这是我发现的:
似乎有三种方法可以确定这一点;我在下面说明了 2,OP 将是第三个。
首先,根据我所见,OP 的解决方案确实应该有效,并且可能是正确的方法,因为参考 ID 和文件之间的关系在文件中维护.rels
。我采取了不同的方法,事后看来,我应该使用 OPs 解决方案,但当时我并不确切知道这些关系是如何运作的。
鉴于此文件摘自一个xl/workbook.xml
文件,该文件是从 Excel 生成的 XLSX 文件的片段,其中我:
- 添加了 3 张纸(包含一些内容,以便我可以在 XML 文件中区分它们)然后保存。
- 删除第二张表,然后再次保存。
- 将新的第二张(最初是第三张)移到第一张前面并第三次重新保存。
<sheets>
<sheet name="Third Sheet" sheetId="3" r:id="rId1"/>
<sheet name="First Sheet" sheetId="1" r:id="rId2"/>
</sheets>
在提取的 XML 文件中,XLSX 工作表映射根据我最初添加到工作表中的内容列出如下:
xl/worksheets/sheet1.xml ---> sheetId="3" Third Sheet r:id="rid1"
xl/worksheets/sheet2.xml ---> sheetId="1" First Sheet r:id="rid2"
因此,看起来工作表名称可以这样映射:
sheet
文件中元素下sheets
元素的位置索引 + 1 与xl/workbook.xml
工作表文件名上的尾随 ID 匹配。id 属性 (
rid1
和rid3
) 的尾随编号与工作表文件名上的尾随 ID 匹配。
PSA:
不要像我一样,最初假设sheetID
属性映射到工作表文件名,这是不正确的。此外,使用 OP 的解决方案,因为它更正确并且依赖于硬引用而不是我的来推断引用。
推荐阅读
- python - 除了某些字段外,如何检查 2 个字典是否相等?
- javascript - 使用事件监听器在画布中移动形状
- java - 使用 JDT Eclipse 获取 Java 方法的抽象语法树
- android - 如何使用 Unity 在 iOS 和 Android 的排行榜中存储单圈时间
- xamarin.forms - Xamarin 表单:获取 NotImplementedException
- jenkins - Jenkinsfile 进行存储/取消存储的原因?
- python - 交互式 Jupyter 小部件在 Jupyter Lab 中不起作用
- sql - 连接多列的最佳方法(性能方面) - SQL SERVER
- javascript - 我想根据不同的语言环境翻译 boostrap 验证消息。(不使用浏览器语言)
- laravel - Laravel 5.4 控制器功能无法使用来自 ionic 3 的获取请求参数