把Excel表格转成XML格式是数据处理中很常见的需求,比如对接ERP系统、生成配置文件、或者向某些平台提交数据时,对方往往只接受XML。很多朋友第一次遇到这种需求时不知道从何下手,其实方法不止一种,而且难度都不大。本文介绍三种最常用的转换方式,从Excel自带功能到编程脚本,覆盖不同的使用场景,你可以根据自己的数据量和转换频率选择合适的方案。

方法一:使用Excel自带的XML映射功能导出
这是Excel原生支持的方式,适合需要反复导出同一结构数据的场景。它的核心思路是先准备一个XML模板文件,然后在Excel中建立单元格与XML标签之间的映射关系,之后每次点一下导出即可,不需要重复配置。
具体操作步骤如下:
第一步,用记事本新建一个XML模板文件,写好你希望生成的标签结构,例如:
<?xml version="1.0" encoding="UTF-8"?>
<员工列表>
<员工>
<姓名></姓名>
<部门></部门>
<工资></工资>
</员工>
</员工列表>第二步,把该文件保存为template.xml,然后打开Excel,切换到「开发工具」选项卡。如果看不到「开发工具」,需要在「文件 - 选项 - 自定义功能区」中手动勾选启用。点击「源」按钮打开XML源面板,点击「XML映射」,选择「添加」,导入刚才的模板文件。
第三步,将右侧面板中的字段依次拖拽到表格对应的列标题上,建立映射。映射完成后,点击「开发工具」下的「导出」按钮,选择保存路径,Excel就会按照模板结构生成XML文件。表格里有多少行数据,导出的XML中就会生成多少组重复的记录节点。
这种方式的优点是一次配置、长期使用,数据更新后直接重新导出即可;缺点是需要手工创建模板,且Excel对XML Schema的校验比较宽松,如果模板写得不规范,某些系统可能解析失败。
方法二:直接另存为XML表格类型
如果你只是临时转一次,不想折腾模板,最快的办法是用「另存为」。打开Excel文件,按F12调出另存为对话框,在保存类型中选择「XML表格」或「XML数据」。
两者的区别需要注意:「XML表格」会保留Excel特有的命名空间和样式信息,生成的内容比较臃肿,只有Excel自己能完整还原;「XML数据」则干净很多,只导出纯数据部分,推荐优先选择后者。示例Excel数据如下:
| 姓名 | 年龄 | 城市 |
|---|---|---|
| 张三 | 28 | 北京 |
| 李四 | 35 | 上海 |
使用「XML数据」类型导出后,得到的结果大致如下:
<?xml version="1.0" encoding="UTF-8"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet">
<Worksheet xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
<Table>
<Row>
<Cell><Data ss:Type="String">姓名</Data></Cell>
<Cell><Data ss:Type="String">年龄</Data></Cell>
</Row>
<Row>
<Cell><Data ss:Type="String">张三</Data></Cell>
<Cell><Data ss:Type="Number">28</Data></Cell>
</Row>
</Table>
</Worksheet>
</Workbook>这种方式上手最快,三十秒就能完成转换。缺点也很明显:标签结构是Excel固定生成的SpreadsheetML格式,字段名不会体现你的业务含义,如果对方系统要求特定的标签命名,这种方式就派不上用场了。
方法三:用Python脚本实现批量灵活转换
当数据量很大、转换频繁,或者需要完全自定义XML结构时,写脚本是更专业的选择。Python配合pandas和lxml库,几行代码就能搞定,而且标签结构、属性、编码都由你说了算。
先安装依赖:
pip install pandas openpyxl lxml
然后编写转换脚本:
import pandas as pd
from lxml import etree
# 读取Excel文件,第一行作为表头
df = pd.read_excel('员工数据.xlsx')
# 创建XML根节点
root = etree.Element('员工列表')
# 逐行生成子节点
for _, row in df.iterrows():
emp = etree.SubElement(root, '员工')
name = etree.SubElement(emp, '姓名')
name.text = str(row['姓名'])
dept = etree.SubElement(emp, '部门')
dept.text = str(row['部门'])
salary = etree.SubElement(emp, '工资')
salary.text = str(row['工资'])
# 写入文件,指定编码为UTF-8并格式化缩进
tree = etree.ElementTree(root)
etree.indent(tree, space=' ')
tree.write('员工数据.xml', encoding='UTF-8', xml_declaration=True)
print('转换完成')这段代码的逻辑很清晰:用pandas读表,遍历每一行数据,为每行创建一组XML节点,最后写出文件。如果字段很多,可以把字段名放进列表里循环处理,避免重复代码。脚本方式的最大优势是可以集成到自动化流程中,比如配合定时任务每天自动转换最新数据。
需要注意pandas读取时数值列可能变成浮点数,比如28被读成28.0,输出前最好做一下类型处理,否则生成的XML里会出现多余的.0。
转换过程中的常见问题与处理技巧
第一个常见问题是中文乱码。原因通常是编码不一致,比如Excel默认用GBK或者带BOM的UTF-8,而目标系统要求无BOM的UTF-8。解决办法是导出或写文件时显式指定编码,Python脚本中用encoding='UTF-8'参数即可,必要时可以先输出到字符串再检查文件头。
第二个问题是特殊字符导致XML解析报错。XML规定&、<、>、单双引号在文本内容中必须转义,如果单元格数据里包含这些字符,直接拼接字符串生成XML就会出错。使用lxml这类库的好处是它会自动处理转义,所以强烈建议用库构建节点而不是手动拼字符串。
第三个问题是空单元格的处理。Excel中的空格、空字符串在XML里如果直接写成空标签,某些严格的解析器会报缺少必填字段的错误,建议提前约定空值的表现形式,比如加上nil="true"属性,或者在转换前清洗掉空行。另外,日期字段也要注意格式统一,建议在XML中采用ISO 8601格式的日期写法,兼容性最好。
总结一下:临时转一次用另存为,结构固定且长期使用选XML映射,大批量或者需要对接系统的场景上脚本。选对方法,Excel转XML就是几分钟的事。