查看: 310|回复: 3

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

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

首先安装库:
  1. pip install spire.xls
复制代码
该库提供免费版,适合小项目和测试使用。

一、直接转换整个Excel文档为XML
如果Excel数据结构干净,无需筛选,只需三个步骤:创建Workbook对象、加载Excel文件、保存为XML。代码示例:
  1. from spire.xls import *
  2. from spire.xls.common import *
  3. workbook = Workbook()
  4. workbook.LoadFromFile("示例.xlsx")
  5. workbook.SaveAsXml("Excel转XML.xml")
  6. workbook.Dispose()
复制代码
此方法将整个工作簿导出为一个XML文件。

二、转换单个工作表为XML
当Excel包含多个工作表时,可以遍历工作表并逐个导出。通过创建临时Workbook并复制工作表,实现单表独立输出:
  1. from spire.xls import *
  2. from spire.xls.common import *
  3. workbook = Workbook()
  4. workbook.LoadFromFile("Excel示例文档.xlsx")
  5. folderPath = "output/"
  6. for worksheet in workbook.Worksheets:
  7.     newWorkbook = Workbook()
  8.     newWorkbook.Worksheets.Clear()
  9.     newWorkbook.Worksheets.AddCopy(worksheet)
  10.     newWorkbook.SaveAsXml(folderPath + worksheet.Name + ".xml")
  11.     newWorkbook.Dispose()
  12. workbook.Dispose()
复制代码

三、进阶:仅转换指定行或列
实际表格常包含说明行或签字区,需剔除无关数据。使用CopyRow方法将所需行复制到新工作簿:
  1. from spire.xls import *
  2. from spire.xls.common import *
  3. workbook = Workbook()
  4. workbook.LoadFromFile("示例.xlsx")
  5. worksheet = workbook.Worksheets[0]
  6. folderPath = "output/"
  7. newWorkbook1 = Workbook()
  8. newWorkbook1.Worksheets.Clear()
  9. newWorksheet1 = newWorkbook1.Worksheets.Add("Sheet1")
  10. for i in range(1, 6):  # 复制第1到5行
  11.     worksheet.CopyRow(worksheet.Rows[i - 1], newWorksheet1, newWorksheet1.LastDataRow + 1, CopyRangeOptions.All)
  12. # 保持列宽
  13. for i in range(worksheet.Columns.Count):
  14.     newWorksheet1.SetColumnWidth(i + 1, worksheet.GetColumnWidth(i + 1))
  15. newWorkbook1.SaveAsXml(folderPath + "核心数据.xml")
  16. newWorkbook1.Dispose()
  17. workbook.Dispose()
复制代码

四、转换前对空值填充处理
空白单元格在XML中会生成空标签,可能造成强类型系统解析错误。遍历区域并填充默认值:
  1. from spire.xls import *
  2. from spire.xls.common import *
  3. workbook = Workbook()
  4. workbook.LoadFromFile("示例.xlsx")
  5. sheet = workbook.Worksheets[0]
  6. for row in range(1, sheet.Rows.Count + 1):
  7.     for col in range(1, sheet.Columns.Count + 1):
  8.         cell = sheet.Range[row, col]
  9.         if cell.Value == "" or cell.Value is None:
  10.             cell.Value = "N/A"  # 或填充为"0"
  11. workbook.SaveAsXml("已清洗数据.xml")
  12. workbook.Dispose()
复制代码

五、配合Python原生库自定义XML标签结构
当系统要求特定标签名(如根节点<OrderBatch>、数据节点<Item>)时,Spire.XLS默认结构无法满足。此时可先用Spire.XLS读取数据,再用Python的xml.etree.ElementTree按需组装:
  1. import xml.etree.ElementTree as ET
  2. from spire.xls import *
  3. from spire.xls.common import *
  4. workbook = Workbook()
  5. workbook.LoadFromFile("Population.xlsx")
  6. sheet = workbook.Worksheets[0]
  7. root = ET.Element("CountryList")
  8. headers = [sheet.Range[1, c].Value for c in range(1, sheet.Columns.Count + 1)]
  9. for r in range(2, sheet.Rows.Count + 1):
  10.     item_node = ET.SubElement(root, "CountryItem")
  11.     for c in range(1, sheet.Columns.Count + 1):
  12.         raw_header = headers[c-1]
  13.         if raw_header:
  14.             tag_name = str(raw_header).strip()
  15.             tag_name = tag_name.replace(" ", "_").replace("-", "_")
  16.             for char in ["(", ")", "[", "]", "%", "/", "\"]:
  17.                 tag_name = tag_name.replace(char, "")
  18.         else:
  19.             tag_name = f"Field{c}"
  20.         cell_value = sheet.Range[r, c].Value
  21.         child = ET.SubElement(item_node, tag_name)
  22.         child.text = str(cell_value) if cell_value is not None else ""
  23. xml_bytes = ET.tostring(root, encoding="utf-8", xml_declaration=False)
  24. with open("自定义定制输出.xml", "wb") as f:
  25.     f.write(b'<?xml version="1.0" encoding="utf-8"?>\n')
  26.     f.write(xml_bytes)
  27. workbook.Dispose()
复制代码
此方法可任意定义XML层级和标签名,灵活对接遗留系统。

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

使用道具 举报

发表于 昨天 09:10 | 显示全部楼层

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

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

使用道具 举报

发表于 昨天 09:10 | 显示全部楼层

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

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

使用道具 举报

发表于 昨天 09:10 | 显示全部楼层

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

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-17 04:03 , Processed in 0.027558 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部