利用Python的xml.etree.ElementTree解析XML数据,结合Spire.XLS库写入Excel工作表,实现双向转换。反向转换可保存为OpenXML格式或自定义XML结构。该方法无需依赖微软Office,适用于服务器端自动化任务,需注意数据类型转换与空值处理,并支持复杂嵌套结构和大批量数据。
在企业数据流转与系统集成领域,XML 和 Excel 是两种不可或缺的数据格式。XML 凭借其天然的结构化能力和良好的可扩展性,成为跨系统数据交换的标准格式;而 Excel 凭借直观的表格界面和强大的分析功能,已成为业务人员最熟悉的工具。实际工作中,经常需要在这两种格式之间进行转换:将 XML 数据导入 Excel 进行统计分析,或者将 Excel 数据导出为 XML 用于系统对接。本文将介绍如何使用 Python 实现这两种转换,帮助开发者高效完成 XML 与 Excel 的互转任务。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
在进行转换之前,先了解 XML 的基本构成,有助于后续将数据映射到 Excel 表格。XML 文档通常由以下三部分组成:
张三 就是一个 name 元素,其值为“张三”。 中的 id="1" 就是一个属性。掌握这些基本概念后,将 XML 数据映射到 Excel 的行列结构会变得更加清晰。
本文采用的方案基于一个独立的 Excel 处理库,无需安装 Microsoft Office,适合部署在服务器或自动化任务中。直接通过 pip 安装即可:
pip install Spire.XLS
该库还依赖 plum-dispatch,安装时会自动处理,无需额外操作。
将 XML 数据导入 Excel 的核心思路是:先使用 Python 标准库解析 XML,提取结构化数据,再通过 Excel 处理库写入工作表。
xml.etree.ElementTree 模块解析 XML 文件,获取根节点from spire.xls import Workbook, FileFormat, BuiltInStyles
import xml.etree.ElementTree as ET
# 1. 加载并解析 XML 文件
tree = ET.parse("消费记录.xml")
root = tree.getroot()
# 2. 提取表头(以第一个记录节点为准)
first_item = root.find("Record")
headers = [elem.tag for elem in first_item]
# 3. 提取所有数据行
rows = []
for record in root.findall("Record"):
row_data = []
for header in headers:
elem = record.find(header)
row_data.append(elem.text if elem is not None else "")
rows.append(row_data)
# 4. 创建 Excel 工作簿并清除默认工作表
workbook = Workbook()
workbook.Worksheets.Clear()
sheet = workbook.Worksheets.Add("XML数据")
# 5. 写入表头(第1行)
for col_idx, header in enumerate(headers, start=1):
sheet.Range[1, col_idx].Value = header
# 6. 写入数据行(从第2行开始)
for row_idx, row_data in enumerate(rows, start=2):
for col_idx, value in enumerate(row_data, start=1):
sheet.Range[row_idx, col_idx].Value = value
# 7. 应用样式
# 表头加粗
sheet.Rows[0].BuiltInStyle = BuiltInStyles.Heading3
# 自动调整列宽
for col in range(sheet.Columns.Count):
sheet.AutoFitColumn(col + 1)
# 8. 保存文件
workbook.Sa veToFile("XML转Excel.xlsx", FileFormat.Version2016)
workbook.Dispose()
ET.parse() 用于加载 XML 文件,root.findall() 和 root.find() 用于定位节点。Workbook.Worksheets.Clear() 用于移除新建工作簿时默认的空白工作表,以便创建自定义工作表。Worksheet.Range[row, col].Value 属性负责向指定单元格写入数据。BuiltInStyles 提供了 Excel 内置样式,可快速美化表格外观。AutoFitColumn() 根据内容自动调整列宽,提升表格可读性。反向操作——将 Excel 数据导出为 XML 格式——在实际工作中也很常见。例如,将业务数据导出为符合特定 Schema 的 XML 文件,供其他系统使用。
部分 Excel 处理库提供了直接方法,可将工作簿保存为 Open XML 格式(即 Excel 底层使用的 XML 格式)。但如果需要生成自定义结构的 XML,则需要手动读取 Excel 数据,再构建 XML 树。
如果只需将 Excel 文件转换为其底层的 Open XML 格式,可以使用以下代码:
from spire.xls import Workbook
# 加载 Excel 文件
workbook = Workbook()
workbook.LoadFromFile("数据.xlsx")
# 保存为 Open XML 格式
workbook.Sa veAsXml("Excel转XML.xml")
workbook.Dispose()
如果需要生成特定结构的 XML 文件(非 Excel 自身的 Open XML 格式),可以从 Excel 中读取数据后,使用 xml.etree.ElementTree 构建自定义 XML:
from spire.xls import Workbook
import xml.etree.ElementTree as ET
from xml.dom import minidom
# 1. 读取 Excel 数据
workbook = Workbook()
workbook.LoadFromFile("数据.xlsx")
sheet = workbook.Worksheets[0]
# 2. 提取表头和数据
headers = [sheet.Range[1, col+1].Value for col in range(sheet.Columns.Count)]
rows = []
for row in range(2, sheet.Rows.Count + 1):
row_data = {}
for col in range(sheet.Columns.Count):
row_data[headers[col]] = sheet.Range[row, col+1].Value
rows.append(row_data)
workbook.Dispose()
# 3. 构建 XML 树
root = ET.Element("Records")
for row in rows:
record = ET.SubElement(root, "Record")
for key, value in row.items():
elem = ET.SubElement(record, key)
elem.text = str(value) if value is not None else ""
# 4. 格式化并保存 XML
xml_str = ET.tostring(root, encoding="utf-8")
dom = minidom.parseString(xml_str)
with open("数据.xml", "w", encoding="utf-8") as f:
f.write(dom.toprettyxml(indent=" "))
这种方式灵活性更高,可以根据业务需求自定义 XML 的结构和标签名称。
在 XML 转 Excel 的过程中,从 XML 中读取的所有数据默认都是字符串类型。如果数据包含数值、日期等,写入 Excel 后可能需要手动设置单元格格式。反之,在 Excel 转 XML 时,从 Excel 单元格读取的值应先转换为字符串再写入 XML 节点,遇到空值需适当处理,避免生成空的 XML 节点。
实际项目中,XML 与 Excel 的转换需求可能来自不同场景:数据分析师需要将 XML 导入 Excel 进行透视和可视化;开发人员则需要将 Excel 数据导出为 XML 用于接口对接或数据交换。本文介绍的两种方案均可在不依赖 Microsoft Office 的情况下完成转换,适合部署在服务器端或自动化任务中。
通过 Python 标准库中的 xml.etree.ElementTree 配合 Excel 处理库,可以灵活实现 XML 与 Excel 之间的双向转换。XML 转 Excel 的核心是解析 XML 树并写入表格;Excel 转 XML 则既可以直接保存为 Open XML 格式,也可以根据业务需求自定义 XML 结构。开发者可根据实际场景选择合适的方案进行适配。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述