Python基于openpyxl与yattag批量转换多个XLSX为对应XML文件
批量转换实现方法
把原有单文件处理逻辑封装为可复用函数,遍历所有符合命名规则的XLSX文件逐个处理即可,核心转换逻辑不需要修改。
改造后完整代码
import os from openpyxl import load_workbook from yattag import Doc, indent def convert_single_file(input_xlsx: str, output_xml: str): # 原有单文件转换逻辑,仅补充编码参数避免乱码 wb = load_workbook(input_xlsx, data_only=True) ws = wb.active row_data_list = [] for row in ws.iter_rows(min_row=2, max_row=7, min_col=1, max_col=6): row_val = [cell.value for cell in row] row_data_list.append(row_val) doc, tag, text = Doc().tagtext() for row in row_data_list: with tag("column0"): text(row[0]) with tag("column1"): text(row[1]) with tag("column2"): text(row[2]) with tag("column3"): text(row[3]) with tag("column4"): text(row[4]) with tag("column5"): text(row[5]) xml_content = indent( doc.getvalue(), indentation=' ', indent_text=False ) with open(output_xml, "w", encoding="utf-8") as f: f.write(xml_content) if __name__ == "__main__": # 按提供的命名规则匹配文件,修改total_num为实际的文件总数即可 total_num = 3 for idx in range(1, total_num + 1): if idx == 1: in_path = "convert_file.xlsx" out_path = "result_file.xml" else: in_path = f"convert_file_{idx}.xlsx" out_path = f"result_file_{idx}.xml" if os.path.exists(in_path): convert_single_file(in_path, out_path) print(f"处理完成: {in_path} → {out_path}") else: print(f"跳过缺失文件: {in_path}")
可选优化:自动扫描目录文件
如果不想手动设置文件总数,可以用glob自动扫描当前目录下所有符合命名规则的XLSX文件,替换主函数部分代码即可:
import glob if __name__ == "__main__": # 自动匹配所有convert_file开头的xlsx文件 for in_path in glob.glob("convert_file*.xlsx"): out_path = in_path.replace("convert_file", "result_file").replace(".xlsx", ".xml") convert_single_file(in_path, out_path) print(f"处理完成: {in_path} → {out_path}")
注意事项
- 写入文件时新增
encoding="utf-8"参数,可避免单元格包含中文时出现乱码 - 生成的XML结构和原有单文件代码输出的结构完全一致,不需要调整后续解析逻辑
- 两种遍历文件的方式二选一即可,输出文件命名完全匹配要求的对应规则
内容的提问来源于stack exchange,提问作者Bernhard
相关产品推荐
相关产品推荐

