脚本专家 发表于 2026-7-16 09:00:03

Python用Spire.XLS实现Excel转XML并自定义标签

在数据处理工作中,将Excel转换为XML是常见需求,尤其是在对接自动化系统时,XML因其结构化、轻量的特点更易被程序解析。今天我们将基于Spire.XLS for Python库,介绍如何通过脚本实现Excel到XML的转换,并进一步处理行筛选、空值填充以及自定义标签结构等实战场景。

首先安装库:

pip install spire.xls

该库提供免费版,适合小项目和测试使用。

一、直接转换整个Excel文档为XML
如果Excel数据结构干净,无需筛选,只需三个步骤:创建Workbook对象、加载Excel文件、保存为XML。代码示例:

from spire.xls import *
from spire.xls.common import *

workbook = Workbook()
workbook.LoadFromFile("示例.xlsx")
workbook.SaveAsXml("Excel转XML.xml")
workbook.Dispose()

此方法将整个工作簿导出为一个XML文件。

二、转换单个工作表为XML
当Excel包含多个工作表时,可以遍历工作表并逐个导出。通过创建临时Workbook并复制工作表,实现单表独立输出:

from spire.xls import *
from spire.xls.common import *

workbook = Workbook()
workbook.LoadFromFile("Excel示例文档.xlsx")
folderPath = "output/"

for worksheet in workbook.Worksheets:
    newWorkbook = Workbook()
    newWorkbook.Worksheets.Clear()
    newWorkbook.Worksheets.AddCopy(worksheet)
    newWorkbook.SaveAsXml(folderPath + worksheet.Name + ".xml")
    newWorkbook.Dispose()

workbook.Dispose()


三、进阶:仅转换指定行或列
实际表格常包含说明行或签字区,需剔除无关数据。使用CopyRow方法将所需行复制到新工作簿:

from spire.xls import *
from spire.xls.common import *

workbook = Workbook()
workbook.LoadFromFile("示例.xlsx")
worksheet = workbook.Worksheets
folderPath = "output/"

newWorkbook1 = Workbook()
newWorkbook1.Worksheets.Clear()
newWorksheet1 = newWorkbook1.Worksheets.Add("Sheet1")

for i in range(1, 6):# 复制第1到5行
    worksheet.CopyRow(worksheet.Rows, newWorksheet1, newWorksheet1.LastDataRow + 1, CopyRangeOptions.All)

# 保持列宽
for i in range(worksheet.Columns.Count):
    newWorksheet1.SetColumnWidth(i + 1, worksheet.GetColumnWidth(i + 1))

newWorkbook1.SaveAsXml(folderPath + "核心数据.xml")
newWorkbook1.Dispose()
workbook.Dispose()


四、转换前对空值填充处理
空白单元格在XML中会生成空标签,可能造成强类型系统解析错误。遍历区域并填充默认值:

from spire.xls import *
from spire.xls.common import *

workbook = Workbook()
workbook.LoadFromFile("示例.xlsx")
sheet = workbook.Worksheets

for row in range(1, sheet.Rows.Count + 1):
    for col in range(1, sheet.Columns.Count + 1):
      cell = sheet.Range
      if cell.Value == "" or cell.Value is None:
            cell.Value = "N/A"# 或填充为"0"

workbook.SaveAsXml("已清洗数据.xml")
workbook.Dispose()


五、配合Python原生库自定义XML标签结构
当系统要求特定标签名(如根节点<OrderBatch>、数据节点<Item>)时,Spire.XLS默认结构无法满足。此时可先用Spire.XLS读取数据,再用Python的xml.etree.ElementTree按需组装:

import xml.etree.ElementTree as ET
from spire.xls import *
from spire.xls.common import *

workbook = Workbook()
workbook.LoadFromFile("Population.xlsx")
sheet = workbook.Worksheets

root = ET.Element("CountryList")
headers = .Value for c in range(1, sheet.Columns.Count + 1)]

for r in range(2, sheet.Rows.Count + 1):
    item_node = ET.SubElement(root, "CountryItem")
    for c in range(1, sheet.Columns.Count + 1):
      raw_header = headers
      if raw_header:
            tag_name = str(raw_header).strip()
            tag_name = tag_name.replace(" ", "_").replace("-", "_")
            for char in ["(", ")", "[", "]", "%", "/", "\\"]:
                tag_name = tag_name.replace(char, "")
      else:
            tag_name = f"Field{c}"
      cell_value = sheet.Range.Value
      child = ET.SubElement(item_node, tag_name)
      child.text = str(cell_value) if cell_value is not None else ""

xml_bytes = ET.tostring(root, encoding="utf-8", xml_declaration=False)

with open("自定义定制输出.xml", "wb") as f:
    f.write(b'<?xml version="1.0" encoding="utf-8"?>\n')
    f.write(xml_bytes)

workbook.Dispose()

此方法可任意定义XML层级和标签名,灵活对接遗留系统。

总结
Excel转XML并非简单的另存为操作。通过Spire.XLS for Python,我们可以自动化处理全表导出、单表拆分、行过滤、空值填充,甚至结合原生库实现标签自定义。根据实际业务需求选择合适的脚本方案,能显著提升数据处理效率和兼容性。

热心网友7 发表于 2026-7-16 09:10:00

Re: Python用Spire.XLS实现Excel转XML并自定义标签

楼主的教程非常实用,把从基础到进阶的Excel转XML流程都捋清楚了,特别是自定义标签那部分,用ElementTree配合Spire.XLS读取数据再组装,确实能解决很多灵活性要求高的场景。另外空值填充的预处理思路也很必要,以前遇到过XML空标签导致下游解析报错的情况。感谢分享这些代码示例,回头在项目里试一下。

热心网友7 发表于 2026-7-16 09:10:00

Re: Python用Spire.XLS实现Excel转XML并自定义标签

感谢楼主的详细教程,非常实用!我之前也用过Spire.XLS处理Excel,但没想到还可以这样灵活地进行行筛选和空值填充,自定义标签结构那段尤其解决了我一直头疼的问题。想请教一下,如果表格中有合并单元格,用楼主的方法会不会导致数据错位?期待你的后续经验分享~

热心网友7 发表于 2026-7-16 09:10:00

Re: Python用Spire.XLS实现Excel转XML并自定义标签

非常详实的教程,感谢分享!Spire.XLS免费版对于小项目确实够用,但需要注意它导出的Excel通常会有“评估版水印”或数量限制。你提到的第五种方法——先用Spire.XLS读取,再用ElementTree组装自定义结构——非常实用,能彻底避开库默认XML格式的限制。另外我在做空值填充时习惯先用`strip()`判断纯空格的情况,有时候单元格值看起来空但可能是空格字符串,可能影响判断。不知道你在实际项目中遇到过这种边界情况吗?
页: [1]
查看完整版本: Python用Spire.XLS实现Excel转XML并自定义标签