我继承了一个使用 XML 函数读取 *.xlsx 文件的电子表格模块。该应用程序使用工作表名称映射数据,并且模块的那部分非常损坏。
我没有一个月的时间来查找和阅读 Office Open XML 格式的规范,因此我在快速查看了一些示例文件后编写了一个快速破解:
xl/workbook.xml
和循环 /workbook/sheets
:name
获取姓名. r:id
获取 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 文件的片段,其中我:
<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
的位置索引 + 1 sheets
下的元素xl/workbook.xml
中的元素文件匹配工作表文件名上的尾随 ID。rid1
和 rid3
)与工作表文件名上的尾随 ID 匹配。PSA:
不要像我一样,最初假设
sheetID
属性映射到工作表文件名,这是不正确的。此外,使用 OP 的解决方案,因为它更正确并且依赖于硬引用而不是我的来推断引用。
关于excel - 链接工作表名称和 XML 文件的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52290551/