跳到正文

将XML转换为Excel

把XML导出文件、订阅源和数据文件转成排好格式的Excel表——自动识别重复记录,属性和嵌套元素按列排列,不存储任何文件。

  • 绝不存储
  • 无需排队,无需等待
  • 无需注册,无水印

使用方法

1

添加XML

拖放.xml文件或粘贴XML内容。Excel自己的XML Spreadsheet 2003文件同样支持。

2

选择记录

自动选出重复出现的元素(如product、item、row),同时列出文件中的其他所有表格,并提供实时预览。

3

下载

得到一个.xlsx文件,每列的数字和日期都是真实类型,标题行加粗并可筛选。

在树形结构中找出行

XML本身没有“表格”的概念,所以第一步必须识别出哪些元素是记录。最可靠的信号是重复:一个父元素包含许多同名子元素,几乎总是意味着一份记录列表,而这些子元素自己的子元素和属性就成为列。绝大多数数据类XML——导出文件、订阅源、API响应、配置转储——都适用这一规则,因为它们的结构方式都一样。

属性和子元素都会转为列。这是必要的,因为XML对同一件事有两种表达方式,不同系统的选择各不相同。有的导出文件把id="42"写成属性,有的把<id>42</id>写成元素,还有的在同一文档中两种都用。表格不在乎这种区别,您也不必在乎,所以两者都会变成列,属性会加上标记,避免同一个名称以两种形式出现时发生冲突。

超过一层的嵌套会像嵌套JSON一样,通过连接元素名称来展平。如果一条记录包含重复的子元素——一个订单里有三条订单明细——表格无法在不复制周围所有内容的情况下把它们表示为多行,因此这些重复值会保留在同一个单元格中。列名中的命名空间会被去掉,因为在电子表格里一个叫ns2:customerName的列对谁都没有帮助,而值本身保持不变。

文字类XML没有可识别的表格,转换效果很差。XHTML网页、DocBook文章、ePub章节或SVG图形是文档而不是数据集:它们的结构天生就是嵌套且不规则的,没有可以用来生成行的重复记录。转换仍会产出一些东西,但那些东西没有用处。本页面向的是数据类XML,把这个区别讲清楚,比任何调参都更省时间。

如果您需要的是别的

如果您了解文件结构,就应该有针对性地提取,而不是让工具去推断。xmlstarlet sel -t -m "//order" -v "@id" -o "," -v "customer" -n data.xml可以用XPath表达式精确取出您要的字段,xq则用类似jq的语法做同样的事。这正是“碰巧能用的转换”和“可以放进流水线的转换”之间的差别。

对于非常大的文件,这里的方式根本不合适:整个文档会被一次性解析进内存,而XML解析成树后通常会占用文件大小数倍的内存。流式解析器——Python的iterparse,或任何语言中的SAX——能以恒定的内存遍历几GB的文档,文件超过几百MB时,这是唯一现实的方法。

常见问题

它怎么知道XML的哪一部分是表格?

记录就是在同一父元素下重复出现的元素——<catalog>中的每个<book>,RSS频道中的每个<item>。每一组都会按记录数和字段数打分,得分最高的被选中,其余的也只需点一下即可切换。

属性和嵌套元素会怎么处理?

每一个都会变成以路径命名的列:id属性变成id,<author><name>变成author/name,<price currency="EUR">会生成price和price/@currency两列。同一条记录中重复出现的字段,会合并到一个单元格,或分散到带编号的多列中。

能打开Excel XML Spreadsheet 2003文件吗?

能。这类文件会被识别出来并逐个工作表转换,数字、日期和文本完整保留。

如果文件里有好几张表——比如订单和订单明细呢?

每个重复组都会单独提供。嵌套的表(例如每个订单里的明细)会带有一列标明其所属的父记录,方便把两张工作表对应起来。

我的文件会被存储吗?

不会。XML的解析和工作簿的生成都在本页完成,不存储任何文件。

打开来源不明的XML安全吗?

安全。文件由您浏览器的XML解析器读取,它从不加载外部实体或DTD,也无法运行文件中的任何内容。

小贴士: 以文字为主而非数据的文档——XHTML网页、DocBook文章——没有可识别的表格,转换效果很差。超过约100 MB的文件可能超出浏览器的内存。

把这个工具放到您的网站上

博客、课程页面或帮助文章均可免费使用。粘贴一段代码,访客就能直接在您的页面上使用。