xml解析需预判结构并用find()判空防崩溃,word表格应基于模板占位符操作,填值须清空原内容并用add_row()新增,中文和格式需手动设字体与列宽。

XML结构不规则时,xml.etree.ElementTree解析前必须预判层级
直接用 ET.parse() 读取 XML 后硬套循环填表,大概率在嵌套层级跳变或同名子节点重复出现时崩溃。比如 <item></item> 下有 <name></name> 和可选的 <note></note>,没做 .find() 判空就调 .text,会抛 AttributeError: 'NoneType' object has no attribute 'text'。
- 先用
ET.fromstring()或ET.parse()加载后,用root.iter('item')统一抓数据块,别依赖路径深度 - 每个字段用
elem.find('field_name') or elem.find('.//field_name')双保险定位,再检查is not None - 如果 XML 有命名空间(常见于 Office 导出或 SOAP),必须传
namespaces=ns_map参数,否则.find()全部返回None
用 python-docx 插入表格前,得先确认 Word 模板里有没有占位符
很多人想“动态生成表格”,结果发现 document.add_table() 插在文档末尾,和原文档格式脱节。真实场景中,更可靠的是在 Word 模板里留一个带标记的空表(比如第一行写 [[DATA]]),然后找到它、清空内容、再逐行填入。
- 遍历
document.tables,对每个table.cell(0, 0).text.strip()检查是否匹配标记,避免误操作正文表格 - 填数据前执行
for row in table.rows[1:]: row._element.getparent().remove(row._element)清掉原数据行(table.rows[1:]跳过表头) - 新增行必须用
table.add_row(),不能手动建TableRow对象——后者不被文档树识别,保存后消失
docx.table.cell().text 赋值会丢格式,复杂内容得用 paragraphs[0].add_run()
XML 里字段含换行符、加粗关键词或数字单位(如 "25 kg")时,直接写 cell.text = value 会把所有样式清空,且换行符显示为 \n 字符而非实际换行。
- 清空单元格:先
cell.text = '',再取cell.paragraphs[0] - 写多行内容:用
p.add_run(line).add_break()替代\n - 保留原始加粗/斜体:需解析 XML 中对应标记(如
<b>xxx</b>),再用run.bold = True控制,python-docx不自动解析 HTML 标签
中文字符乱码、表格列宽错乱,八成是没设字体和宽度策略
生成的 Word 打开后中文变方框、表格挤成一团,不是 XML 编码问题(Python 3 默认 UTF-8),而是 python-docx 新建段落默认用 Calibri,不支持中文字体;且表格列宽默认靠内容自适应,XML 数据长度波动大时极易变形。
立即学习“Python免费学习笔记(深入)”;
- 全局设中文字体:在文档初始化后加
style = document.styles['Normal']; style.font.name = '微软雅黑'; style._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑') - 固定列宽:创建表后立即遍历
table.columns,对每列设col.width = Inches(1.5),别等填完再调 - 避免自动调整:
table.autofit = False,否则后续插入内容可能触发重排,撑破页面
XML 节点顺序和 Word 表格行列顺序不一致是常态,别指望按 XML 原样“映射”过去;先提取结构化列表,再按目标表格逻辑重组,比边解析边写安全得多。










