Python批量修改Word表格内容教程
用python-docx定位Word表格的指定单元格,批量修改表格内容、设置单元格格式,支持按行列索引或表头匹配修改,批量更新多个文档表格。
场景痛点
合同附表、报价单、验收单里的表格内容需要定期更新,比如产品价格变了、人员名单调整了。手动打开每个Word找到对应表格改单元格,几十份文档改下来眼都花了,还容易改错行列。用python-docx可以按表头名称或行列索引定位单元格,批量改内容、批量调格式,一键跑完所有文档。
用到的库
pip install python-docx
完整代码
# 导入库
from docx import Document
from docx.shared import Pt, RGBColor
from docx.oxml.ns import qn
import os
def set_cell(cell, text, bold=False, size=10.5, color=(0, 0, 0)):
"""重写单元格内容并设置格式"""
cell.text = ''
para = cell.paragraphs[0]
run = para.add_run(text)
run.bold = bold
run.font.size = Pt(size)
run.font.name = '微软雅黑'
run._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')
run.font.color.rgb = RGBColor(*color)
def update_table_by_index(table, updates):
"""
按行列索引修改表格内容
updates: {(行号, 列号): 新内容} 行号列号从0开始
"""
for (row_idx, col_idx), new_text in updates.items():
if row_idx < len(table.rows) and col_idx < len(table.columns):
cell = table.rows[row_idx].cells[col_idx]
set_cell(cell, str(new_text))
print(f'修改第{row_idx + 1}行第{col_idx + 1}列:{new_text}')
def update_table_by_header(table, header_name, row_data):
"""
按表头名称修改某一列的数据
header_name: 表头文字,如'价格'
row_data: 新的数据列表,从第二行开始填
"""
# 先找表头在第几列
header_row = table.rows[0]
target_col = None
for col_idx, cell in enumerate(header_row.cells):
if cell.text.strip() == header_name:
target_col = col_idx
break
if target_col is None:
print(f'未找到表头:{header_name}')
return
# 从第二行开始填数据
for row_offset, value in enumerate(row_data):
row_idx = row_offset + 1
if row_idx < len(table.rows):
cell = table.rows[row_idx].cells[target_col]
set_cell(cell, str(value))
print(f'更新{header_name}第{row_offset + 1}条:{value}')
def batch_update_tables(folder_path):
"""批量处理文件夹下所有docx的表格"""
for filename in os.listdir(folder_path):
if filename.endswith('.docx') and not filename.startswith('~'):
file_path = os.path.join(folder_path, filename)
doc = Document(file_path)
# 假设有一个表格,按索引更新
if doc.tables:
table = doc.tables[0]
# 方式1:按行列索引改
updates = {
(1, 2): '12800', # 第2行第3列改为新价格
(2, 2): '15600',
(3, 2): '9800',
}
update_table_by_index(table, updates)
# 方式2:按表头名改整列
# update_table_by_header(table, '价格', ['12800', '15600', '9800'])
# 另存为新文件
output_path = os.path.join(folder_path, '更新后_' + filename)
doc.save(output_path)
print(f'已保存:{output_path}\n')
if __name__ == '__main__':
batch_update_tables('./报价单')
代码讲解
table.rows[row_idx].cells[col_idx]直接定位到指定单元格,行列索引都从0开始。update_table_by_index()按精确的行列号改内容,适合表格结构固定、行列位置已知的场景。update_table_by_header()先遍历第一行找表头在第几列,然后从第二行开始批量填数据,这种方式不怕表格列顺序调整,只要表头文字对得上就能改对,更稳健。set_cell()重写单元格内容时先cell.text = ''清空,再add_run设置新文字和格式,避免原内容残留。- 批量处理文件夹时遍历所有docx,每个文件独立打开、修改、另存,互不影响。
运行结果
运行脚本后控制台逐文件打印修改明细,每个单元格改了什么值都打印出来。./报价单文件夹下每个原文件旁边生成一个更新后_xxx.docx,打开可以看到表格里的价格数据已经替换成新值,格式保持统一。
注意事项
- 合并单元格会影响行列索引,一个横向合并的单元格会被识别成多个cell,实际行号和你在Word里看到的可能不一致,建议先用读取表格脚本确认行列位置。
- 表头匹配是精确文字匹配,有空格或换行都会匹配失败,匹配前最好
strip()一下。 - 批量改之前先备份原文件,确认输出文件正确后再批量覆盖。
- 如果表格行数不够,新增行需要用
table.add_row(),不能直接往不存在的行写。

更新时间:2026-09-15 09:00:37