影刀RPA Word文档操作:创建、读取、修改 影刀RPA Word文档操作创建、读取、修改署名林焱什么情况用什么RPA流程中经常需要生成Word文档——自动生成合同、报告、通知函。也有需要从Word文档中提取数据或替换模板内容的场景。场景推荐库特点创建/修改Wordpython-docx支持段落、表格、样式读取Word文本python-docx逐段读取支持表格模板替换python-docx 正则批量替换占位符怎么做一创建Word文档fromdocximportDocumentfromdocx.sharedimportPt,Cm,RGBColorfromdocx.enum.textimportWD_ALIGN_PARAGRAPH docDocument()# 设置默认字体styledoc.styles[Normal]fontstyle.font font.name宋体font.sizePt(12)# 标题titledoc.add_heading(2024年度工作总结报告,level0)title.alignmentWD_ALIGN_PARAGRAPH.CENTER# 普通段落pdoc.add_paragraph()p.add_run(一、工作概述).boldTruedoc.add_paragraph(本年度共完成项目15个较去年增长25%。)# 带格式的段落pdoc.add_paragraph()runp.add_run(关键数据)run.boldTruerun.font.color.rgbRGBColor(0,0,255)p.add_run(项目完成率100%客户满意度95%。)# 有序列表doc.add_paragraph(项目A - 已交付,styleList Number)doc.add_paragraph(项目B - 已交付,styleList Number)doc.add_paragraph(项目C - 进行中,styleList Number)# 无序列表doc.add_paragraph(需求分析,styleList Bullet)doc.add_paragraph(系统设计,styleList Bullet)doc.save(rD:\文档\工作总结.docx)二添加表格拼多多店群自动化上架方案fromdocximportDocumentfromdocx.sharedimportPt,Cm docDocument()# 添加表格3行4列tabledoc.add_table(rows3,cols4,styleTable Grid)# 表头headers[项目名称,负责人,状态,完成度]fori,headerinenumerate(headers):celltable.cell(0,i)cell.textheader# 加粗forparagraphincell.paragraphs:forruninparagraph.runs:run.boldTrue# 数据行![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ba4588da0d2546a1837e1689640580b5.png#pic_center)data[[系统升级,张三,已完成,100%],[数据迁移,李四,进行中,60%],]forrow_idx,row_datainenumerate(data,1):forcol_idx,valueinenumerate(row_data):table.cell(row_idx,col_idx).textvalue# 设置列宽forrowintable.rows:row.cells[0].widthCm(4)row.cells[1].widthCm(3)row.cells[2].widthCm(3)row.cells[3].widthCm(2)doc.save(rD:\文档\项目报告.docx)三读取Word文档fromdocximportDocument docDocument(rD:\文档\合同.docx)# 读取所有段落文本fori,parainenumerate(doc.paragraphs):ifpara.text.strip():print(f[段落{i}]{para.text})# 读取表格fortable_idx,tableinenumerate(doc.tables):print(f\n 表格{table_idx1})forrowintable.rows:row_data[cell.textforcellinrow.cells]print( | .join(row_data))四模板替换fromdocximportDocumentimportrefromdatetimeimportdatetimedefreplace_in_docx(doc,replacements):在Word文档中批量替换文本# 替换段落中的文本forparaindoc.paragraphs:forkey,valueinreplacements.items():ifkeyinpara.text:# 需要保留run的格式forruninpara.runs:ifkeyinrun.text:run.textrun.text.replace(key,str(value))# 替换表格中的文本fortableindoc.tables:forrowintable.rows:forcellinrow.cells:forparaincell.paragraphs:forkey,valueinreplacements.items():ifkeyinpara.text:forruninpara.runs:ifkeyinrun.text:run.textrun.text.replace(key,str(value))# 使用模板生成合同docDocument(rD:\模板\合同模板.docx)replacements{{{甲方名称}}:XX科技有限公司,{{乙方名称}}:YY服务有限公司,{{合同金额}}:50000,{{签订日期}}:datetime.now().strftime(%Y年%m月%d日),{{项目名称}}:企业官网建设,}replace_in_docx(doc,replacements)doc.save(rD:\文档\合同_XX科技.docx)print(合同生成完成)完整流程批量生成通知函fromdocximportDocumentfromdocx.sharedimportPt,Cmfromdocx.enum.textimportWD_ALIGN_PARAGRAPHimportos# yd_input: template_path, output_dir, recipientstemplate_pathyd_input.get(template_path,rD:\模板\通知函模板.docx)output_diryd_input.get(output_dir,rD:\文档\通知函)recipientsyd_input.get(recipients,[])os.makedirs(output_dir,exist_okTrue)success0forrecipientinrecipients:try:docDocument(template_path)# 替换占位符replacements{{{姓名}}:recipient.get(name,),{{部门}}:recipient.get(department,),{{日期}}:recipient.get(date,),{{事项}}:recipient.get(matter,),}# 替换段落forparaindoc.paragraphs:forruninpara.runs:forkey,valueinreplacements.items():ifkeyinrun.text:run.textrun.text.replace(key,str(value))# 替换表格fortableindoc.tables:forrowintable.rows:forcellinrow.cells:forparaincell.paragraphs:forruninpara.runs:forkey,valueinreplacements.items():ifkeyinrun.text:run.textrun.text.replace(key,str(value))# 保存filenamef通知函_{recipient.get(name,unknown)}.docxoutput_pathos.path.join(output_dir,filename)doc.save(output_path)success1print(f✓{filename})exceptExceptionase:print(f✗{recipient.get(name,unknown)}:{e})yd_output{status:ok,success:success,total:len(recipients)}有什么坑坑一模板替换时run被分割导致替换失败现象模板里写了{{姓名}}但替换后没有任何变化。原因Word在编辑过程中可能把一个词拆分到多个run中。比如{{姓名}}可能被拆成{{、姓名、}}三个run直接遍历run替换时每个run都不包含完整的{{姓名}}。解决合并段落的run后再替换defreplace_in_paragraph(paragraph,key,value):在段落中替换文本处理run分割问题ifkeynotinparagraph.text:return# 合并所有run的文本full_textparagraph.text# 清除所有runforruninparagraph.runs:run.text# 替换后写回第一个run保留格式new_textfull_text.replace(key,str(value))ifparagraph.runs:paragraph.runs[0].textnew_textelse:paragraph.add_run(new_text)# 使用forparaindoc.paragraphs:forkey,valueinreplacements.items():replace_in_paragraph(para,key,value)坑二中文字体设置不生效现象设置了字体为宋体但生成的Word打开后是默认字体。原因python-docx设置字体时需要同时设置西文字体和中文字体eastAsia属性。解决TEMU店群如何管理运营fromdocx.oxml.nsimportqndefset_font(run,font_name宋体,size12,boldFalse):设置run的字体包含中文run.font.namefont_name run.font.sizePt(size)run.boldbold# 设置中文字体rrun._element rPrr.get_or_add_rPr()rFontsrPr.find(qn(w:rFonts))ifrFontsisNone:fromdocx.oxmlimportOxmlElement rFontsOxmlElement(w:rFonts)rPr.append(rFonts)rFonts.set(qn(w:eastAsia),font_name)# 使用pdoc.add_paragraph()runp.add_run(中文字体测试)set_font(run,微软雅黑,14,True)坑三读取Word时表格嵌套遗漏现象读取Word表格数据时某些嵌套在单元格内的子表格被遗漏。原因python-docx的doc.tables只返回顶层表格嵌套表格需要从单元格中提取。解决递归读取嵌套表格defread_all_tables(doc):递归读取所有表格包括嵌套表格tables[]fortableindoc.tables:tables.append(table)# 检查每个单元格是否有嵌套表格forrowintable.rows:forcellinrow.cells:ifcell.tables:fornested_tableincell.tables:tables.append(nested_table)returntables坑四页面设置不生效现象设置了A4纸大小和页边距但打开Word后是默认的Letter纸。解决fromdocx.sharedimportCm,Mmfromdocx.enum.sectionimportWD_ORIENT sectiondoc.sections[0]# 设置A4纸section.page_widthMm(210)section.page_heightMm(297)# 设置页边距![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3a526a5b957542e9a553555444db2daf.png#pic_center)section.top_marginCm(2.54)section.bottom_marginCm(2.54)section.left_marginCm(3.17)section.right_marginCm(3.17)# 横向打印# section.orientation WD_ORIENT.LANDSCAPE# section.page_width Mm(297)# section.page_height Mm(210)