news 2026/6/26 22:36:56

Python 自动化办公之 Word 文档处理——python-docx 实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 自动化办公之 Word 文档处理——python-docx 实战

日常工作中最烦的就是批量处理 Word——生成几十份合同模板、从几百份简历里提取信息、把表格数据导出成报告……手动做不仅累还容易出错。用 Python 的python-docx库,这些都能自动搞定。

一、安装与基础操作

pipinstallpython-docx
fromdocximportDocument# 打开已有的 Word 文档doc=Document("报告.docx")# 创建一个新的空文档doc2=Document()doc2.save("新文档.docx")

二、读取 Word 文档内容

fromdocximportDocument doc=Document("报告.docx")# 1. 读取所有段落print("=== 段落内容 ===")fori,parainenumerate(doc.paragraphs):ifpara.text.strip():# 只打印非空段落print(f"段落{i}:{para.text.strip()}")# 2. 读取表格print("\n=== 表格内容 ===")fort_idx,tableinenumerate(doc.tables):print(f"\n--- 表格{t_idx+1}---")forr_idx,rowinenumerate(table.rows):cells=[cell.textforcellinrow.cells]print(f"第{r_idx+1}行:{cells}")# 3. 读取标题print("\n=== 标题 ===")forparaindoc.paragraphs:ifpara.style.name.startswith("Heading"):print(f"[{para.style.name}]{para.text}")

实际场景:批量读取多份简历的特定字段(姓名、电话、学历等)。

三、写入 Word 文档

1. 添加段落

fromdocximportDocumentfromdocx.sharedimportPt,RGBColorfromdocx.enum.textimportWD_ALIGN_PARAGRAPH doc=Document()# 添加标题doc.add_heading("工作报告",level=0)# 文档标题doc.add_heading("一、项目概况",level=1)doc.add_heading("1.1 项目背景",level=2)# 添加普通段落para=doc.add_paragraph("这是正文内容。")para.alignment=WD_ALIGN_PARAGRAPH.LEFT# 左对齐# 带格式的段落para2=doc.add_paragraph()run=para2.add_run("红色加粗文字")run.bold=Truerun.font.size=Pt(14)run.font.color.rgb=RGBColor(255,0,0)run2=para2.add_run(" 普通后续文字")run2.font.size=Pt(12)doc.save("输出文档.docx")

2. 添加表格

fromdocximportDocumentfromdocx.sharedimportPt,Cm doc=Document()# 添加标题doc.add_heading("学生成绩表",level=1)# 创建表格(3行4列)table=doc.add_table(rows=3,cols=4,style="Table Grid")# 设置表头headers=["姓名","语文","数学","英语"]fori,hinenumerate(headers):cell=table.rows[0].cells[i]cell.text=h# 加粗表头forparaincell.paragraphs:forruninpara.runs:run.bold=True# 填充数据data=[["张三","85","92","78"],["李四","90","88","95"],]forr_idx,row_datainenumerate(data):forc_idx,valueinenumerate(row_data):table.rows[r_idx+1].cells[c_idx].text=value# 设置列宽forrowintable.rows:row.cells[0].width=Cm(3)row.cells[1].width=Cm(3)row.cells[2].width=Cm(3)row.cells[3].width=Cm(3)doc.save("成绩表.docx")

3. 设置页边距

fromdocx.sharedimportCm doc=Document()# 设置页边距forsectionindoc.sections:section.top_margin=Cm(2.54)section.bottom_margin=Cm(2.54)section.left_margin=Cm(3.17)section.right_margin=Cm(3.17)

四、实战案例:批量生成合同

这是办公自动化最经典的场景——模板 + 数据 → 批量生成文档。

准备数据 (employees.csv)

name,department,position,salary,start_date 张三,技术部,Java开发工程师,15000,2024-01-01 李四,产品部,产品经理,13000,2024-02-15 王五,市场部,市场专员,10000,2024-03-01

生成合同

importpandasaspdfromdocximportDocumentfromdatetimeimportdatetimeimportosdefgenerate_contract(employee):"""根据员工数据生成劳动合同"""# 读取模板doc=Document("合同模板.docx")# 替换占位符(模板中用 {{name}} 标记)replacements={"{{name}}":employee["name"],"{{department}}":employee["department"],"{{position}}":employee["position"],"{{salary}}":str(employee["salary"]),"{{start_date}}":employee["start_date"],"{{today}}":datetime.now().strftime("%Y年%m月%d日"),}forparaindoc.paragraphs:forkey,valueinreplacements.items():ifkeyinpara.text:# 保留原有格式替换文字forruninpara.runs:ifkeyinrun.text:run.text=run.text.replace(key,value)# 保存合同output_dir="合同输出"os.makedirs(output_dir,exist_ok=True)filename=f"{output_dir}/{employee['name']}_劳动合同.docx"doc.save(filename)print(f"已生成:{filename}")# 批量生成df=pd.read_csv("employees.csv")for_,empindf.iterrows():generate_contract(emp)

模板制作:在 Word 里写好合同正文,需要填充的地方用{{name}}这样的占位符标记,Python 脚本一键替换。

五、实战案例:从多份简历提取信息

fromdocximportDocumentimportreimportosdefextract_resume_info(docx_path):"""从简历 Word 文档提取关键信息"""doc=Document(docx_path)full_text="\n".join([p.textforpindoc.paragraphs])info={}# 提取姓名(通常在第一行)lines=[p.text.strip()forpindoc.paragraphsifp.text.strip()]iflines:info["姓名"]=lines[0]# 提取手机号(11位数字)phone=re.search(r"1[3-9]\d{9}",full_text)info["手机号"]=phone.group()ifphoneelse""# 提取邮箱email=re.search(r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}",full_text)info["邮箱"]=email.group()ifemailelse""# 提取毕业院校(包含"大学"或"学院"的字段)schools=re.findall(r"[一-龥]+(?:大学|学院)",full_text)info["毕业院校"]=schools[0]ifschoolselse""returninfo# 批量处理所有简历resume_dir="简历文件夹"results=[]forfilenameinos.listdir(resume_dir):iffilename.endswith(".docx"):filepath=os.path.join(resume_dir,filename)try:info=extract_resume_info(filepath)info["文件名"]=filename results.append(info)print(f"已处理:{filename}")exceptExceptionase:print(f"处理失败{filename}:{e}")# 导出结果到 Excelimportpandasaspd df=pd.DataFrame(results)df.to_excel("简历汇总.xlsx",index=False)print(f"共处理{len(results)}份简历,结果已导出到 简历汇总.xlsx")

六、docx 常用格式设置

fromdocx.sharedimportPt,Cm,Inches,RGBColorfromdocx.enum.textimportWD_ALIGN_PARAGRAPHfromdocx.enum.tableimportWD_TABLE_ALIGNMENT# 字体设置run.font.name="微软雅黑"run.font.size=Pt(12)run.bold=Truerun.italic=Truerun.font.color.rgb=RGBColor(0,0,0)# 黑色# 段落设置para.alignment=WD_ALIGN_PARAGRAPH.CENTER# 居中para.paragraph_format.space_before=Pt(12)# 段前间距para.paragraph_format.space_after=Pt(12)# 段后间距para.paragraph_format.line_spacing=1.5# 行距 1.5 倍para.paragraph_format.first_line_indent=Cm(0.74)# 首行缩进两个字符# 表格设置table.alignment=WD_TABLE_ALIGNMENT.CENTER# 表格居中cell.vertical_alignment=1# 垂直居中

七、常见问题

1. python-docx 不支持 .doc 格式

# .doc 是老版 Word 格式,python-docx 不支持# 方案一:先转成 .docx(Word 里手动另存为)# 方案二:用 win32com(仅 Windows)importwin32com.client word=win32com.client.Dispatch("Word.Application")doc=word.Documents.Open("旧文档.doc")doc.SaveAs("新文档.docx",FileFormat=16)# 16 = wdFormatDocumentDefaultdoc.Close()word.Quit()

2. 图片操作

fromdocx.sharedimportInches# 插入图片doc.add_picture("图表.png",width=Inches(5))# 提取文档中的图片(比较麻烦,需要解压 docx)fromdocx.opc.constantsimportRELATIONSHIP_TYPEasRTimportzipfileimportoswithzipfile.ZipFile("文档.docx","r")asz:fornameinz.namelist():ifname.startswith("word/media/"):z.extract(name,"提取的图片/")

八、和其他库搭配

用途搭配场景
pandas数据处理从 Excel 读取数据 → 生成 Word 报告
matplotlib生成图表画好图 → 插入 Word 文档
python-pptx处理 PPT数据和图表转成 PPT 汇报
PDFPlumber处理 PDF从 PDF 提取内容转 Word

典型流程:

importpandasaspdfromdocximportDocumentimportmatplotlib.pyplotasplt# 1. pandas 读取数据df=pd.read_excel("销售数据.xlsx")summary=df.groupby("月份")["金额"].sum()# 2. matplotlib 生成图表plt.figure(figsize=(8,4))summary.plot(kind="bar")plt.title("月度销售汇总")plt.savefig("chart.png")# 3. docx 生成报告doc=Document()doc.add_heading("月度销售报告",level=0)doc.add_paragraph(f"本月总销售额:{summary.sum():.2f}元")doc.add_picture("chart.png",width=Inches(5))doc.save("销售报告.docx")print("报告已生成")

总结

python-docx 的核心能力就三个:读内容、写内容、改格式。日常办公里 80% 的 Word 自动化需求用这些基础操作就能搞定。

批量生成 → 模板 + 数据替换 批量提取 → 遍历文件夹 + 正则提取 批量转换 → 读数据 → 转格式 → 输出

最关键的是先把模板做好,Word 模板的排版直接影响生成文档的质量。


💡 觉得有用的话,点赞 + 关注【张老师技术栈】吧!每周更新 Java/Python/爬虫 实战干货,不让你白来。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/26 22:26:30

论基于DSSA的软件架构设计与应用

在软件行业飞速发展的当下,软件项目迭代速度不断加快,同质化行业软件重复开发、代码冗余、架构不统一、复用率低等问题愈发突出,极大增加了软件开发成本与维护难度。通用软件架构无法适配单一业务领域的专属业务规则,而特定领域软…

作者头像 李华
网站建设 2026/6/26 22:14:05

Robot Framework企业级UI自动化测试:0代码实践与架构解析

1. 项目概述:为什么企业级UI自动化测试需要“0代码”?最近和几个测试团队负责人聊天,大家普遍头疼一个问题:UI自动化测试的维护成本太高了。脚本写起来费时费力,业务一变动,页面元素一改,测试脚…

作者头像 李华