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

Python 自动化办公之 Word 文档处理——python-docx 实战
日常工作中最烦的就是批量处理 Word——生成几十份合同模板、从几百份简历里提取信息、把表格数据导出成报告……手动做不仅累还容易出错。用 Python 的python-docx库这些都能自动搞定。一、安装与基础操作pipinstallpython-docxfromdocximportDocument# 打开已有的 Word 文档docDocument(报告.docx)# 创建一个新的空文档doc2Document()doc2.save(新文档.docx)二、读取 Word 文档内容fromdocximportDocument docDocument(报告.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_idx1}---)forr_idx,rowinenumerate(table.rows):cells[cell.textforcellinrow.cells]print(f第{r_idx1}行:{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 docDocument()# 添加标题doc.add_heading(工作报告,level0)# 文档标题doc.add_heading(一、项目概况,level1)doc.add_heading(1.1 项目背景,level2)# 添加普通段落paradoc.add_paragraph(这是正文内容。)para.alignmentWD_ALIGN_PARAGRAPH.LEFT# 左对齐# 带格式的段落para2doc.add_paragraph()runpara2.add_run(红色加粗文字)run.boldTruerun.font.sizePt(14)run.font.color.rgbRGBColor(255,0,0)run2para2.add_run( 普通后续文字)run2.font.sizePt(12)doc.save(输出文档.docx)2. 添加表格fromdocximportDocumentfromdocx.sharedimportPt,Cm docDocument()# 添加标题doc.add_heading(学生成绩表,level1)# 创建表格3行4列tabledoc.add_table(rows3,cols4,styleTable Grid)# 设置表头headers[姓名,语文,数学,英语]fori,hinenumerate(headers):celltable.rows[0].cells[i]cell.texth# 加粗表头forparaincell.paragraphs:forruninpara.runs:run.boldTrue# 填充数据data[[张三,85,92,78],[李四,90,88,95],]forr_idx,row_datainenumerate(data):forc_idx,valueinenumerate(row_data):table.rows[r_idx1].cells[c_idx].textvalue# 设置列宽forrowintable.rows:row.cells[0].widthCm(3)row.cells[1].widthCm(3)row.cells[2].widthCm(3)row.cells[3].widthCm(3)doc.save(成绩表.docx)3. 设置页边距fromdocx.sharedimportCm docDocument()# 设置页边距forsectionindoc.sections:section.top_marginCm(2.54)section.bottom_marginCm(2.54)section.left_marginCm(3.17)section.right_marginCm(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):根据员工数据生成劳动合同# 读取模板docDocument(合同模板.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.textrun.text.replace(key,value)# 保存合同output_dir合同输出os.makedirs(output_dir,exist_okTrue)filenamef{output_dir}/{employee[name]}_劳动合同.docxdoc.save(filename)print(f已生成:{filename})# 批量生成dfpd.read_csv(employees.csv)for_,empindf.iterrows():generate_contract(emp)模板制作在 Word 里写好合同正文需要填充的地方用{{name}}这样的占位符标记Python 脚本一键替换。五、实战案例从多份简历提取信息fromdocximportDocumentimportreimportosdefextract_resume_info(docx_path):从简历 Word 文档提取关键信息docDocument(docx_path)full_text\n.join([p.textforpindoc.paragraphs])info{}# 提取姓名通常在第一行lines[p.text.strip()forpindoc.paragraphsifp.text.strip()]iflines:info[姓名]lines[0]# 提取手机号11位数字phonere.search(r1[3-9]\d{9},full_text)info[手机号]phone.group()ifphoneelse# 提取邮箱emailre.search(r[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,},full_text)info[邮箱]email.group()ifemailelse# 提取毕业院校包含大学或学院的字段schoolsre.findall(r[一-龥](?:大学|学院),full_text)info[毕业院校]schools[0]ifschoolselsereturninfo# 批量处理所有简历resume_dir简历文件夹results[]forfilenameinos.listdir(resume_dir):iffilename.endswith(.docx):filepathos.path.join(resume_dir,filename)try:infoextract_resume_info(filepath)info[文件名]filename results.append(info)print(f已处理:{filename})exceptExceptionase:print(f处理失败{filename}:{e})# 导出结果到 Excelimportpandasaspd dfpd.DataFrame(results)df.to_excel(简历汇总.xlsx,indexFalse)print(f共处理{len(results)}份简历结果已导出到 简历汇总.xlsx)六、docx 常用格式设置fromdocx.sharedimportPt,Cm,Inches,RGBColorfromdocx.enum.textimportWD_ALIGN_PARAGRAPHfromdocx.enum.tableimportWD_TABLE_ALIGNMENT# 字体设置run.font.name微软雅黑run.font.sizePt(12)run.boldTruerun.italicTruerun.font.color.rgbRGBColor(0,0,0)# 黑色# 段落设置para.alignmentWD_ALIGN_PARAGRAPH.CENTER# 居中para.paragraph_format.space_beforePt(12)# 段前间距para.paragraph_format.space_afterPt(12)# 段后间距para.paragraph_format.line_spacing1.5# 行距 1.5 倍para.paragraph_format.first_line_indentCm(0.74)# 首行缩进两个字符# 表格设置table.alignmentWD_TABLE_ALIGNMENT.CENTER# 表格居中cell.vertical_alignment1# 垂直居中七、常见问题1. python-docx 不支持 .doc 格式# .doc 是老版 Word 格式python-docx 不支持# 方案一先转成 .docxWord 里手动另存为# 方案二用 win32com仅 Windowsimportwin32com.client wordwin32com.client.Dispatch(Word.Application)docword.Documents.Open(旧文档.doc)doc.SaveAs(新文档.docx,FileFormat16)# 16 wdFormatDocumentDefaultdoc.Close()word.Quit()2. 图片操作fromdocx.sharedimportInches# 插入图片doc.add_picture(图表.png,widthInches(5))# 提取文档中的图片比较麻烦需要解压 docxfromdocx.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 读取数据dfpd.read_excel(销售数据.xlsx)summarydf.groupby(月份)[金额].sum()# 2. matplotlib 生成图表plt.figure(figsize(8,4))summary.plot(kindbar)plt.title(月度销售汇总)plt.savefig(chart.png)# 3. docx 生成报告docDocument()doc.add_heading(月度销售报告,level0)doc.add_paragraph(f本月总销售额:{summary.sum():.2f}元)doc.add_picture(chart.png,widthInches(5))doc.save(销售报告.docx)print(报告已生成)总结python-docx 的核心能力就三个读内容、写内容、改格式。日常办公里 80% 的 Word 自动化需求用这些基础操作就能搞定。批量生成 → 模板 数据替换 批量提取 → 遍历文件夹 正则提取 批量转换 → 读数据 → 转格式 → 输出最关键的是先把模板做好Word 模板的排版直接影响生成文档的质量。 觉得有用的话点赞 关注【张老师技术栈】吧每周更新 Java/Python/爬虫 实战干货不让你白来。