excel - 链接工作表名称和 XML 文件的正确方法

标签 excel openxml

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

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

  • 打开xl/workbook.xml和循环 /workbook/sheets :
  • name 获取姓名.
  • r:id 获取 ID .
  • 使用文件顺序作为显示顺序。
  • 打开xl/_rels/workbook.xml.rels和循环 /RelationshipsType="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 的位置索引 + 1 sheets 下的元素xl/workbook.xml 中的元素文件匹配工作表文件名上的尾随 ID。
  • id 属性的尾随编号( rid1rid3 )与工作表文件名上的尾随 ID 匹配。

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

    关于excel - 链接工作表名称和 XML 文件的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52290551/

    相关文章:

    .net - 打开 xml 运行时要求

    c# - 使用 OpenXML SDK 删除 header 中的图像

    c# - 收到有关 Excel 文件内容有问题的消息

    excel - 如何从 Excel 中的字符串中提取大写单词或大写字母单词

    vba - Excel 中未分配的热键

    Excel 检查值是否为 COUNTIFS 内的数字

    c# - 如何使用 Open XML 和 C# 更改单个段落或页面的方向?

    c# - '文件已损坏,无法打开' OpenXML

    vb.NET SaveAs 不保存所有 Excel 数据

    vba - Excel VBA代码移动带有图像的工作表添加屏幕更新和错误