python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python Excel转XML

使用Python快速实现将Excel转换为XML文件

作者:E-iceblue

这篇文章主要为大家详细介绍了如何使用Spire.XLS for Python快速实现将Excel转换为XML文件,从整个工作簿到特定工作表,还能处理空值、筛选区域,甚至自定义XML结构,让你的数据无缝对接各种系统,效率翻倍

在分析和处理数据时,Excel 是首选,因为它页面简单直观,还有丰富的功能。但当我们需要将这些数据上传到自动化处理系统中时,XML 作为一种结构化的文本格式不仅体积小,并且更易被程序读取。因此,如何高效精准将 Excel 转换为 XML 就成为了一个常见的需求。

在今天的教程中,我们借助 Spire.XLS for Python 介绍如何在 Python 环境中自动化完成格式转换,还将根据实际需求展示转换特定区域和控制 XML 输出效果的脚本,一起来看看吧!

你可以通过 pip install spire.xls 快速安装 Spire.XLS for Python,此外该组件还提供免费版,适合用于小型项目和测试。

通过 Python 快速将 Excel 文件转换为 XML

在安装 Spire.XLS 后,我们进入今天的正题,先从最基础的直接转换文档讲起。如果 Excel 文档结构非常干净,不需要对内容做任何筛选,且接收端系统能够直接解析标准的 XML 格式,那么直接使用标准转换是最快捷的方式。这一部分我们将演示如何快速上手,完成整个工作簿或单个工作表的转换。

直接转换整个 Excel 文档 为 XML

直接将整个 Excel 文档转换为 XML 非常简单,Spire.XLS 提供了简洁的 API,只需要三步就能完成:创建 Workbook 对象,加载 Excel 文档,将 Excel 保存为 XML。下面是完整代码示例:

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

# 创建 Workbook 对象
workbook = Workbook()

# 加载本地 Excel 文件
workbook.LoadFromFile("示例.xlsx")

# 将 Excel 文件保存为 XML 文件格式
workbook.SaveAsXml("Excel转XML.xml")

# 释放内存资源
workbook.Dispose()

转换单个 Excel 工作表 为 XML

在包含多个工作表的 Excel 文件中,我们可能只需要导出其中的某一张表,例如季度销售报告中的销售明细表,或者多部门联合报表中的研发部数据表。此时,我们可以通过遍历或指定索引的方式,将特定的工作表拆分出来并转换为独立的 XML 文档。

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

# 创建 Workbook 类的对象
workbook = Workbook()
# 加载 Excel 文件
workbook.LoadFromFile("/input/Excel示例文档.xlsx")

# 指定生成的 XML 文件的存放文件夹路径
folderPath = "/output/Excel转xml/"

# 遍历 Excel 文件中的所有工作表,实现单表独立导出
for worksheet in workbook.Worksheets:
    # 创建一个新的临时 Workbook 对象
    newWorkbook = Workbook()
    # 删除新工作簿中默认的工作表
    newWorkbook.Worksheets.Clear()

    # 将当前遍历的工作表复制到新工作簿中
    newWorkbook.Worksheets.AddCopy(worksheet)

    # 将独立出的工作表另存为 XML
    newWorkbook.SaveAsXml(folderPath + worksheet.Name + ".xml")
    newWorkbook.Dispose()

workbook.Dispose()

进阶设置:根据实际需求控制输出 XML 文件

在实践中,Excel 工作表很少是完全理想化的。表格的头部可能包含几行大段的填表说明,尾部可能包含财务签字区域,如果直接进行转换,会生成大量垃圾 XML 标签。因此,我们需要学会在转换前对内容进行筛选和清洗。

1. 仅转换指定的数据行或列

当面对包含公告、标题和签字区的复杂表格时,我们可以利用 CopyRow 方法,复制所需数据,并粘贴到新的临时工作簿中进行导出。这能帮我们准确剔除无关行,避免产生无用的空标签。

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

# 创建 Workbook 对象并加载原始 Excel 文件
workbook = Workbook()
workbook.LoadFromFile("示例.xlsx")

# 获取原始的第一个工作表
worksheet = workbook.Worksheets[0]

# 指定输出的文件夹路径
folderPath = "output/"

# 创建一个新的 Workbook 对象用于接收裁剪后的数据
newWorkbook1 = Workbook()
newWorkbook1.Worksheets.Clear()
newWorksheet1 = newWorkbook1.Worksheets.Add("Sheet1")

# 第 1 行是表头,我们需要裁剪并转换第 1 至 5 行的核心数据
for i in range(1, 6):
    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))

# 将裁剪出的数据保存为 XML
newWorkbook1.SaveAsXml(folderPath + "1-5行核心数据.xml")
newWorkbook1.Dispose()
workbook.Dispose()

2. 转换前对空值进行填充处理

虽然 Excel 允许单元格留空,但这些空白单元格在直接转成 XML 时,通常会变成空的闭合标签 <Cell/>。如果 XML 接收端是强类型的业务系统(如 Java 或 C# 服务端),在解析这些空标签时可能会发生错误。我们可以在转换前进行遍历清理,为特定类型的空单元格赋予默认值。

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 标签结构

除了上面两种常见的,在实践中最棘手的情况莫过于系统(如特定的 ERP 或老旧 Web Service)对 XML 的结构规范有着极其严苛的规定。例如,系统要求根节点必须叫 <OrderBatch>,每行数据的节点必须叫 <Item>。而 Spire.XLS 默认生成的 XML 拓扑结构无法更改,这时我们需要改变思路,将读取和组装的步骤分离开来。

Spire.XLS 读取数据与 Python 组装 XML

这种方案的核心思路是:利用 Spire.XLS 从 Excel 中快速、准确地读取出干净的数据,再由 Python 原生的 xml.etree.ElementTree 库按照接受端的接口规范,动态组装出任意层级的 XML 树状结构。

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

# 加载并读取 Excel 数据
workbook = Workbook()
workbook.LoadFromFile("/input/Population.xlsx")
sheet = workbook.Worksheets[0]

# 1. 创建根节点
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("-", "_")
            # 过滤掉 XML 标签名中不允许出现的括号等其他特殊字符
            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 ""

# 2. 转换为字节流(xml_declaration=False 确保 ElementTree 不会自动生成单引号声明)
xml_bytes = ET.tostring(root, encoding="utf-8", xml_declaration=False)

# 3. 手动写入文件:强制写入带双引号的标准 XML 声明并换行
with open("/output/自定义定制输出.xml", "wb") as f:
    # 写入最标准的双引号声明
    f.write(b'<?xml version="1.0" encoding="utf-8"?>\n')
    # 写入 XML 内容
    f.write(xml_bytes)

workbook.Dispose()
print("XML 文件生成成功,已安全清洗标签名并强制写入标准声明!")

总结

将 Excel 转换为 XML,在实际开发中并不仅仅是点一下另存为那么简单。从最基础的直接导出整个文件,到根据需要筛选出特定行、补全空白单元格,再到最后配合 Python 原生库重新排布标签,所有的调整都是为了让生成的文件能够被其他软件或系统顺利读取。

现在就翻开你手头的数据文件,通过 Spire.XLS for Python 定制高效的转换方案吧!

到此这篇关于使用Python快速实现将Excel转换为XML文件的文章就介绍到这了,更多相关Python Excel转XML内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文