首页 > 解决方案 > 链接工作表名称和 XML 文件的正确方法

问题描述

我继承了一个使用 XML 函数读取 *.xlsx 文件的电子表格模块。该应用程序使用工作表名称映射数据,并且模块的那部分非常损坏。

我没有一个月的时间来查找和阅读 Office Open XML 格式的规范,因此我在快速查看了一些示例文件后编写了一个快速破解:

  1. xl/workbook.xml/workbook/sheets

    • name.
    • 从 中获取 ID r:id
    • 使用文件顺序作为显示顺序。
  2. xl/_rels/workbook.xml.rels/Relationships滤波Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet

    • 通过 映射到名称Id
    • 通过映射到文件Target

这个算法正确吗?

标签: excelopenxml

解决方案


这是一篇较旧的帖子,OP 可能已经继续,但如果其他人对此感兴趣,我发现了什么。

我在编写一个简单的解析器来执行一些 XLSX 按摩时也遇到了这个问题,并且找不到文档来指示 XML 文件名映射到workbook.xml.

这是我发现的:

似乎有三种方法可以确定这一点;我在下面说明了 2,OP 将是第三个。

首先,根据我所见,OP 的解决方案确实应该有效,并且可能是正确的方法,因为参考 ID 和文件之间的关系在文件中维护.rels。我采取了不同的方法,事后看来,我应该使用 OPs 解决方案,但当时我并不确切知道这些关系是如何运作的。


鉴于此文件摘自一个xl/workbook.xml文件,该文件是从 Excel 生成的 XLSX 文件的片段,其中我:

  1. 添加了 3 张纸(包含一些内容,以便我可以在 XML 文件中区分它们)然后保存。
  2. 删除第二张表,然后再次保存。
  3. 将新的第二张(最初是第三张)移到第一张前面并第三次重新保存。
<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"

因此,看起来工作表名称可以这样映射:

  1. sheet文件中元素下sheets元素的位置索引 + 1 与xl/workbook.xml工作表文件名上的尾随 ID 匹配。

  2. id 属性 (rid1rid3) 的尾随编号与工作表文件名上的尾随 ID 匹配。

PSA:

不要像我一样,最初假设sheetID属性映射到工作表文件名,这是不正确的。此外,使用 OP 的解决方案,因为它更正确并且依赖于硬引用而不是我的来推断引用。


推荐阅读