在数据处理工作中,将Excel转换为XML是常见需求,尤其是在对接自动化系统时,XML因其结构化、轻量的特点更易被程序解析。今天我们将基于Spire.XLS for Python库,介绍如何通过脚本实现Excel到XML的转换,并进一步处理行筛选、空值填充以及自定义标签结构等实战场景。
首先安装库:该库提供免费版,适合小项目和测试使用。
一、直接转换整个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[0]
- folderPath = "output/"
- newWorkbook1 = Workbook()
- newWorkbook1.Worksheets.Clear()
- newWorksheet1 = newWorkbook1.Worksheets.Add("Sheet1")
- for i in range(1, 6): # 复制第1到5行
- worksheet.CopyRow(worksheet.Rows[i - 1], 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[0]
- for row in range(1, sheet.Rows.Count + 1):
- for col in range(1, sheet.Columns.Count + 1):
- cell = sheet.Range[row, col]
- 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[0]
- root = ET.Element("CountryList")
- headers = [sheet.Range[1, c].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[c-1]
- 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[r, c].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,我们可以自动化处理全表导出、单表拆分、行过滤、空值填充,甚至结合原生库实现标签自定义。根据实际业务需求选择合适的脚本方案,能显著提升数据处理效率和兼容性。 |