
本文介绍如何利用pandas和python-docx,将excel中的结构化数据(如订单明细)准确、高效地写入word文档的指定表格,重点解决初学者常见的类型错误与循环逻辑误区。
本文介绍如何利用pandas和python-docx,将excel中的结构化数据(如订单明细)准确、高效地写入word文档的指定表格,重点解决初学者常见的类型错误与循环逻辑误区。
在自动化办公场景中,经常需要将Excel中整理好的业务数据(如采购单、报价表、项目清单)导入Word报告或合同模板中。Python提供了成熟的生态支持:pandas用于高效读取和处理Excel数据,python-docx用于操作Word文档结构。但初学者常因对数据结构理解偏差而报错——例如文中出现的 TypeError: list indices must be integers or slices, not str,其根本原因在于 df.to_dict("records") 返回的是字典列表(如 [{"ORDER": "ORD-001", "ITEM": "Laptop", ...}, {...}]),而非单个字典,因此不能直接用 sda["ORDER"] 访问。
正确做法是:逐行遍历Word表格的行(Table.rows)与Excel数据记录(sda)进行配对,使用 zip() 确保一一对应。同时,应避免嵌套遍历单元格(for cells in rows.cells),因为目标是按列顺序填充固定字段,直接通过索引(如 rows.cells[0])赋值更清晰、安全。
以下是修正后的完整可运行代码示例:
import pandas as pd
from docx import Document
from pathlib import Path
base_dir = Path(__file__).parent
word_template_path = base_dir / "WordTemplate.docx"
excel_path = base_dir / "ExcelSource.xlsx"
output_dir = base_dir / "OUTPUT"
output_path = output_dir / "FilledDocument.docx"
output_dir.mkdir(exist_ok=True)
# 读取Excel工作表(指定sheet),自动推断列名
df = pd.read_excel(excel_path, sheet_name="Feuil2")
# 转为字典列表:每条记录是一个字典,键为列名
data_records = df.to_dict("records")
# 加载Word模板
doc = Document(word_template_path)
table = doc.tables[0] # 假设第一个表格为目标表格
# 校验:确保Word表格行数 ≥ Excel记录数(否则跳过或提示)
if len(table.rows) <p><strong>关键注意事项:</strong> </p>
- ✅ 列名一致性:record["ORDER"] 中的 "ORDER" 必须与Excel表头(首行)文字完全一致(区分大小写、空格);建议用 record.get("ORDER", "") 防止键不存在时报错;
- ✅ 表格结构预设:Word模板中目标表格需预先留足行数(至少等于Excel记录数),或动态添加行(需额外调用 table.add_row());
- ✅ 数据类型转换:cell.text 仅接受字符串,故统一用 str() 包裹数值/日期等类型;
- ⚠️ 不推荐使用 docxtpl 混用:本方案基于原生 python-docx,若需Jinja2模板语法(如{{ item.ORDER }}),应改用 DocxTemplate 并配合上下文字典,而非手动操作表格对象。
掌握此模式后,你可轻松扩展至多表格填充、条件高亮、合计行计算等进阶需求,真正实现Excel→Word的端到端自动化。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











