在日常办公中,word文档是最常用的文本处理工具之一。通过python自动化word文档操作,可以大幅提高工作效率,减少重复劳动,特别适合批量生成报告、合同、简历等标准化文档。本文将介绍几种常用的python操作word文档的方法,并提供实用的代码示例和应用场景。
使用python-docx操作word文档
python-docx是一个强大的库,可以用来创建、读取和修改microsoft word (.docx)文档。它提供了丰富的api来操作文档的各个方面,包括段落、表格、图片等。
安装python-docx
pip install python-docx
创建新的word文档
from docx import document from docx.shared import inches, pt, rgbcolor from docx.enum.text import wd_align_paragraph from docx.enum.style import wd_style_type def create_simple_document(): """创建一个简单的word文档""" # 创建文档对象 doc = document() # 添加标题 doc.add_heading('python自动化办公指南', 0) # 添加段落 p = doc.add_paragraph('使用 ') p.add_run('python-docx').bold = true p.add_run(' 可以轻松创建和修改word文档,这对于') p.add_run('自动化办公').italic = true p.add_run('非常有用。') # 添加一级标题 doc.add_heading('1. 文档基础', level=1) # 添加带样式的段落 paragraph = doc.add_paragraph('这是一个普通段落,展示了如何添加文本内容。') paragraph.alignment = wd_align_paragraph.justify # 添加项目符号列表 doc.add_paragraph('项目符号列表示例:', style='list bullet') doc.add_paragraph('第一项', style='list bullet') doc.add_paragraph('第二项', style='list bullet') doc.add_paragraph('第三项', style='list bullet') # 添加编号列表 doc.add_paragraph('编号列表示例:', style='list number') doc.add_paragraph('第一步', style='list number') doc.add_paragraph('第二步', style='list number') doc.add_paragraph('第三步', style='list number') # 添加图片 doc.add_heading('2. 插入图片', level=1) doc.add_paragraph('下面是一个图片示例:') try: doc.add_picture('example.png', width=inches(4.0)) except: doc.add_paragraph('(图片文件不存在,请替换为实际图片路径)') # 添加表格 doc.add_heading('3. 创建表格', level=1) doc.add_paragraph('下面是一个3x3表格示例:') table = doc.add_table(rows=3, cols=3) table.style = 'table grid' # 填充表头 header_cells = table.rows[0].cells header_cells[0].text = '姓名' header_cells[1].text = '年龄' header_cells[2].text = '职位' # 填充数据行 data = [ ['张三', '28', '工程师'], ['李四', '32', '设计师'] ] for i, row_data in enumerate(data): row = table.rows[i+1].cells for j, val in enumerate(row_data): row[j].text = val # 添加分页符 doc.add_page_break() # 添加页眉和页脚 section = doc.sections[0] header = section.header header.paragraphs[0].text = "python自动化办公 - 页眉示例" header.paragraphs[0].alignment = wd_align_paragraph.center footer = section.footer footer_para = footer.paragraphs[0] footer_para.text = "第 " footer_para.add_run("pagenum").bold = true footer_para.add_run(" 页") footer_para.alignment = wd_align_paragraph.center # 保存文档 doc.save('简单文档示例.docx') print("文档已创建: 简单文档示例.docx") # 执行函数 create_simple_document()
修改现有word文档
from docx import document from docx.shared import pt from docx.enum.text import wd_align_paragraph def modify_existing_document(file_path): """修改现有word文档""" try: # 打开现有文档 doc = document(file_path) # 修改文档标题(假设第一个段落是标题) if doc.paragraphs: title = doc.paragraphs[0] title.text = "更新后的文档标题" title.runs[0].bold = true title.runs[0].font.size = pt(18) title.alignment = wd_align_paragraph.center # 在文档末尾添加新内容 doc.add_heading('新增章节', level=1) doc.add_paragraph('这是修改文档后添加的新内容。') # 修改表格内容(如果存在) if doc.tables: table = doc.tables[0] # 获取第一个表格 if len(table.rows) > 1 and len(table.rows[1].cells) > 0: # 修改第二行第一列的内容 table.rows[1].cells[0].text = "更新的内容" # 保存修改后的文档(可以选择另存为新文件) modified_file = "修改后_" + file_path doc.save(modified_file) print(f"文档已修改并保存为: {modified_file}") return true except exception as e: print(f"修改文档时出错: {e}") return false # 使用示例 # modify_existing_document("简单文档示例.docx")
提取word文档内容
from docx import document def extract_document_content(file_path): """提取word文档中的内容""" try: # 打开文档 doc = document(file_path) # 提取所有段落文本 paragraphs_text = [para.text for para in doc.paragraphs if para.text] print("\n文档段落内容:") for i, text in enumerate(paragraphs_text, 1): print(f"{i}. {text[:100]}{'...' if len(text) > 100 else ''}") # 提取所有表格内容 tables_data = [] for i, table in enumerate(doc.tables): print(f"\n表格 {i+1}:") table_data = [] for row in table.rows: row_data = [cell.text for cell in row.cells] table_data.append(row_data) print(" | ".join(row_data)) tables_data.append(table_data) # 返回提取的内容 return { "paragraphs": paragraphs_text, "tables": tables_data } except exception as e: print(f"提取文档内容时出错: {e}") return none # 使用示例 # content = extract_document_content("简单文档示例.docx")
创建复杂格式文档
from docx import document from docx.shared import inches, pt, rgbcolor from docx.enum.text import wd_align_paragraph, wd_line_spacing from docx.enum.style import wd_style_type from docx.oxml.ns import qn from docx.oxml import oxmlelement def create_complex_document(): """创建具有复杂格式的word文档""" # 创建文档对象 doc = document() # 设置文档样式 styles = doc.styles # 创建自定义标题样式 title_style = styles.add_style('customtitle', wd_style_type.paragraph) title_font = title_style.font title_font.name = '微软雅黑' title_font.size = pt(24) title_font.bold = true title_font.color.rgb = rgbcolor(0, 112, 192) # 蓝色 # 添加标题 title = doc.add_paragraph("项目进度报告", style='customtitle') title.alignment = wd_align_paragraph.center # 添加日期 from datetime import date date_paragraph = doc.add_paragraph(f"日期: {date.today().strftime('%y年%m月%d日')}") date_paragraph.alignment = wd_align_paragraph.right # 添加分隔线 p = doc.add_paragraph() p.paragraph_format.line_spacing_rule = wd_line_spacing.single run = p.add_run("_" * 80) run.font.color.rgb = rgbcolor(192, 192, 192) # 浅灰色 # 添加项目概述 doc.add_heading("1. 项目概述", level=1) doc.add_paragraph( "本项目旨在开发一套自动化办公系统,提高企业内部文档处理效率。" "系统将集成多种功能,包括文档生成、数据分析和报表输出等。" ) # 添加项目进度表 doc.add_heading("2. 项目进度", level=1) progress_table = doc.add_table(rows=1, cols=4) progress_table.style = 'table grid' # 设置表头 header_cells = progress_table.rows[0].cells headers = ["阶段", "计划完成时间", "实际完成时间", "完成度"] for i, header in enumerate(headers): header_cells[i].text = header # 设置表头背景色 shading_elm = oxmlelement('w:shd') shading_elm.set(qn('w:fill'), "d9e1f2") # 浅蓝色背景 header_cells[i]._tc.get_or_add_tcpr().append(shading_elm) # 添加数据行 progress_data = [ ["需求分析", "2023-01-15", "2023-01-20", "100%"], ["系统设计", "2023-02-28", "2023-03-05", "100%"], ["开发阶段", "2023-05-30", "进行中", "65%"], ["测试阶段", "2023-06-30", "未开始", "0%"], ["部署上线", "2023-07-15", "未开始", "0%"] ] for data_row in progress_data: row_cells = progress_table.add_row().cells for i, val in enumerate(data_row): row_cells[i].text = val # 调整表格宽度 for cell in progress_table.columns[0].cells: cell.width = inches(1.5) for cell in progress_table.columns[3].cells: cell.width = inches(1.0) # 添加风险评估 doc.add_heading("3. 风险评估", level=1) # 添加带颜色的风险等级 risk_para = doc.add_paragraph("当前项目风险等级: ") risk_run = risk_para.add_run("中等") risk_run.font.color.rgb = rgbcolor(255, 192, 0) # 橙色 risk_run.font.bold = true # 添加风险列表 doc.add_paragraph("主要风险因素:", style='list bullet') risks = [ "技术实现难度超出预期", "团队成员变动", "需求变更频繁" ] for risk in risks: doc.add_paragraph(risk, style='list bullet') # 添加下一步计划 doc.add_heading("4. 下一步计划", level=1) next_steps = [ "完成核心功能开发", "开始内部测试", "准备用户培训材料" ] for i, step in enumerate(next_steps, 1): doc.add_paragraph(f"{i}. {step}", style='list number') # 添加页脚 section = doc.sections[0] footer = section.footer footer_para = footer.paragraphs[0] footer_para.text = "机密文件 - 仅供内部使用" footer_para.alignment = wd_align_paragraph.center # 保存文档 doc.save('项目进度报告.docx') print("复杂格式文档已创建: 项目进度报告.docx") # 执行函数 # create_complex_document()
使用docx-mailmerge填充word模板
word模板是包含固定格式设置和版式设置的word文件,通过模板文件,可以快速生成美观的word文档,而不再需要重新设置各种样式的参数。docx-mailmerge库可以方便地将数据填充到word模板中的占位符位置。
安装docx-mailmerge
pip install docx-mailmerge
创建word模板
首先,需要在word中创建一个包含合并域的模板文件。合并域是特殊的占位符,格式为«字段名»
。
在word中创建合并域的步骤:
- 打开word,创建新文档
- 点击「插入」选项卡
- 点击「快速部件」→「域」
- 在「域」对话框中,选择「mergefield」
- 在「域名称」中输入你的字段名(如「name」、「date」等)
- 点击「确定」
使用python填充word模板
from mailmerge import mailmerge from datetime import date def fill_word_template(template_path, output_path, data): """填充word模板文件""" try: # 打开模板文件 document = mailmerge(template_path) # 显示模板中的所有合并域 print("模板中的合并域:", document.get_merge_fields()) # 填充数据 document.merge(**data) # 保存生成的文档 document.write(output_path) print(f"已生成文档: {output_path}") return true except exception as e: print(f"填充模板时出错: {e}") return false # 使用示例 - 填充简单的信函模板 def generate_letter(): # 假设我们有一个名为"letter_template.docx"的模板,包含以下合并域: # «recipient_name», «recipient_address», «date», «subject», «content», «sender_name», «sender_title» # 准备数据 letter_data = { 'recipient_name': '张三', 'recipient_address': '北京市海淀区中关村南大街5号', 'date': date.today().strftime('%y年%m月%d日'), 'subject': '项目合作邀请', 'content': '我们诚挚地邀请贵公司参与我们即将启动的人工智能项目合作。该项目旨在开发一套智能办公系统,提高企业运营效率。\n\n我们了解到贵公司在相关领域有丰富的经验,相信通过合作,我们可以共同创造更大的价值。\n\n期待您的回复。', 'sender_name': '李四', 'sender_title': '项目经理' } # 填充模板 fill_word_template('letter_template.docx', '项目合作邀请函.docx', letter_data) # 使用示例 - 批量生成证书 def generate_certificates(): # 假设我们有一个名为"certificate_template.docx"的模板,包含以下合并域: # «name», «course», «date», «instructor», «certificate_id» # 准备多组数据 students = [ { 'name': '王小明', 'course': 'python高级编程', 'date': '2023年6月15日', 'instructor': '张教授', 'certificate_id': 'cert-2023-001' }, { 'name': '李小红', 'course': 'python高级编程', 'date': '2023年6月15日', 'instructor': '张教授', 'certificate_id': 'cert-2023-002' }, { 'name': '赵小青', 'course': 'python高级编程', 'date': '2023年6月15日', 'instructor': '张教授', 'certificate_id': 'cert-2023-003' } ] # 批量生成证书 for i, student in enumerate(students): output_file = f"证书_{student['name']}.docx" fill_word_template('certificate_template.docx', output_file, student) # 执行函数 # generate_letter() # generate_certificates()
处理表格和重复项
from mailmerge import mailmerge def fill_template_with_tables(): """填充包含表格和重复项的word模板""" # 假设我们有一个名为"report_template.docx"的模板 # 该模板包含普通合并域和表格中的合并域 # 打开模板 document = mailmerge('report_template.docx') # 显示所有合并域 print("模板中的合并域:", document.get_merge_fields()) # 填充普通合并域 document.merge( report_title='月度销售报告', report_date='2023年7月1日', prepared_by='市场部', total_sales='¥1,234,567.00' ) # 准备表格数据(假设模板中有一个表格,包含产品销售数据) # 表格中的合并域格式为: «product:x», «quantity:x», «unit_price:x», «subtotal:x» # 其中x是行索引 sales_data = [ { 'product': '笔记本电脑', 'quantity': '10', 'unit_price': '¥5,999.00', 'subtotal': '¥59,990.00' }, { 'product': '办公椅', 'quantity': '20', 'unit_price': '¥899.00', 'subtotal': '¥17,980.00' }, { 'product': '打印机', 'quantity': '5', 'unit_price': '¥1,299.00', 'subtotal': '¥6,495.00' } ] # 合并表格数据 document.merge_rows('product', sales_data) # 保存生成的文档 document.write('月度销售报告.docx') print("已生成报告: 月度销售报告.docx") # 执行函数 # fill_template_with_tables()
实际应用场景
场景一:自动生成合同
from mailmerge import mailmerge from datetime import date import os def generate_contract(contract_data, template_path, output_dir): """根据模板自动生成合同""" # 确保输出目录存在 if not os.path.exists(output_dir): os.makedirs(output_dir) # 合同文件名 contract_filename = f"合同_{contract_data['contract_id']}_{contract_data['client_name']}.docx" output_path = os.path.join(output_dir, contract_filename) try: # 打开模板 document = mailmerge(template_path) # 填充合同数据 document.merge(**contract_data) # 保存生成的合同 document.write(output_path) print(f"已生成合同: {contract_filename}") return output_path except exception as e: print(f"生成合同时出错: {e}") return none # 使用示例 def batch_generate_contracts(): # 合同模板路径 template_path = "contract_template.docx" # 输出目录 output_dir = "generated_contracts" # 准备多份合同数据 contracts = [ { 'contract_id': 'ct-2023-001', 'client_name': '北京科技有限公司', 'client_address': '北京市朝阳区建国路88号', 'client_representative': '王总', 'contract_date': date.today().strftime('%y年%m月%d日'), 'start_date': '2023年8月1日', 'end_date': '2024年7月31日', 'contract_amount': '¥500,000.00', 'payment_terms': '分三期支付,首期款¥200,000.00,第二期款¥150,000.00,尾款¥150,000.00', 'service_scope': '软件开发、系统维护、技术支持', 'our_company': '智能科技有限公司', 'our_representative': '张总', 'our_address': '上海市浦东新区张江高科技园区' }, { 'contract_id': 'ct-2023-002', 'client_name': '广州贸易有限公司', 'client_address': '广州市天河区珠江新城', 'client_representative': '李总', 'contract_date': date.today().strftime('%y年%m月%d日'), 'start_date': '2023年9月1日', 'end_date': '2024年8月31日', 'contract_amount': '¥350,000.00', 'payment_terms': '分两期支付,首期款¥200,000.00,尾款¥150,000.00', 'service_scope': '系统集成、数据迁移、用户培训', 'our_company': '智能科技有限公司', 'our_representative': '张总', 'our_address': '上海市浦东新区张江高科技园区' } ] # 批量生成合同 generated_files = [] for contract_data in contracts: contract_file = generate_contract(contract_data, template_path, output_dir) if contract_file: generated_files.append(contract_file) print(f"共生成 {len(generated_files)} 份合同文件") return generated_files # 执行批量生成合同 # batch_generate_contracts()
场景二:自动生成个性化简历
from docx import document from docx.shared import pt, inches from docx.enum.text import wd_align_paragraph import os def create_resume(person_data, output_path): """创建个性化简历""" # 创建文档 doc = document() # 设置页边距 sections = doc.sections for section in sections: section.top_margin = inches(0.8) section.bottom_margin = inches(0.8) section.left_margin = inches(0.8) section.right_margin = inches(0.8) # 添加姓名作为标题 name = doc.add_heading(person_data['name'], 0) name.alignment = wd_align_paragraph.center # 添加联系方式 contact_info = f"电话: {person_data['phone']} | 邮箱: {person_data['email']} | 地址: {person_data['address']}" contact = doc.add_paragraph(contact_info) contact.alignment = wd_align_paragraph.center # 添加分隔线 doc.add_paragraph('_' * 80) # 添加个人简介 doc.add_heading('个人简介', level=1) doc.add_paragraph(person_data['summary']) # 添加教育背景 doc.add_heading('教育背景', level=1) for edu in person_data['education']: p = doc.add_paragraph() p.add_run(f"{edu['school']} - {edu['degree']}").bold = true p.add_run(f"\n{edu['date']}") p.add_run(f"\n{edu['description']}") # 添加工作经验 doc.add_heading('工作经验', level=1) for job in person_data['experience']: p = doc.add_paragraph() p.add_run(f"{job['company']} - {job['position']}").bold = true p.add_run(f"\n{job['date']}") # 添加工作职责 doc.add_paragraph('职责:', style='list bullet') for responsibility in job['responsibilities']: doc.add_paragraph(responsibility, style='list bullet') # 添加技能 doc.add_heading('技能', level=1) for category, skills in person_data['skills'].items(): p = doc.add_paragraph() p.add_run(f"{category}: ").bold = true p.add_run(', '.join(skills)) # 保存文档 doc.save(output_path) print(f"简历已生成: {output_path}") return output_path # 使用示例 def generate_sample_resume(): # 准备简历数据 resume_data = { 'name': '张三', 'phone': '138-1234-5678', 'email': 'zhangsan@example.com', 'address': '北京市海淀区', 'summary': '资深软件工程师,拥有8年python开发经验,专注于数据分析和自动化系统开发。具有良好的团队协作能力和项目管理经验。', 'education': [ { 'school': '北京大学', 'degree': '计算机科学学士', 'date': '2010 - 2014', 'description': '主修计算机科学与技术,辅修数学。gpa 3.8/4.0。' }, { 'school': '清华大学', 'degree': '软件工程硕士', 'date': '2014 - 2016', 'description': '研究方向:机器学习与数据挖掘。' } ], 'experience': [ { 'company': 'abc科技有限公司', 'position': '高级软件工程师', 'date': '2019 - 至今', 'responsibilities': [ '负责公司核心数据处理平台的设计和开发', '优化数据处理流程,提高系统性能30%', '带领5人团队完成多个重要项目', '引入自动化测试,提高代码质量' ] }, { 'company': 'xyz信息技术公司', 'position': '软件工程师', 'date': '2016 - 2019', 'responsibilities': [ '参与开发企业级数据分析系统', '设计并实现数据可视化模块', '编写技术文档和用户手册', '为新员工提供技术培训' ] } ], 'skills': { '编程语言': ['python', 'java', 'javascript', 'sql'], '框架与工具': ['django', 'flask', 'react', 'docker', 'git'], '数据库': ['mysql', 'mongodb', 'redis'], '其他': ['数据分析', '机器学习', '项目管理', '团队协作'] } } # 生成简历 return create_resume(resume_data, '张三_个人简历.docx') # 执行生成简历 # generate_sample_resume()
场景三:自动生成周报/月报
from docx import document from docx.shared import pt, rgbcolor from docx.enum.text import wd_align_paragraph from datetime import datetime, timedelta import calendar def generate_weekly_report(week_data, output_path): """生成周报""" # 创建文档 doc = document() # 添加标题 title = doc.add_heading(f"{week_data['department']}周报", 0) title.alignment = wd_align_paragraph.center # 添加报告期间 period = doc.add_paragraph(f"报告期间: {week_data['start_date']} 至 {week_data['end_date']}") period.alignment = wd_align_paragraph.center # 添加报告人和日期 reporter = doc.add_paragraph(f"报告人: {week_data['reporter']}\t\t报告日期: {week_data['report_date']}") reporter.alignment = wd_align_paragraph.right # 添加分隔线 doc.add_paragraph('_' * 80) # 本周工作总结 doc.add_heading('一、本周工作总结', level=1) for i, task in enumerate(week_data['completed_tasks'], 1): p = doc.add_paragraph(f"{i}. ", style='list number') p.add_run(task['name']).bold = true p.add_run(f"\n 完成情况: {task['status']}") p.add_run(f"\n 工作内容: {task['description']}") # 下周工作计划 doc.add_heading('二、下周工作计划', level=1) for i, task in enumerate(week_data['planned_tasks'], 1): p = doc.add_paragraph(f"{i}. ", style='list number') p.add_run(task['name']).bold = true p.add_run(f"\n 计划时间: {task['planned_time']}") p.add_run(f"\n 工作内容: {task['description']}") # 问题与建议 if week_data['issues']: doc.add_heading('三、问题与建议', level=1) for i, issue in enumerate(week_data['issues'], 1): p = doc.add_paragraph(f"{i}. ", style='list number') p.add_run(issue['title']).bold = true p.add_run(f"\n 问题描述: {issue['description']}") if issue.get('solution'): p.add_run(f"\n 解决方案: {issue['solution']}") # 保存文档 doc.save(output_path) print(f"周报已生成: {output_path}") return output_path # 使用示例 def create_sample_weekly_report(): # 计算上周的日期范围 today = datetime.now() start_of_last_week = today - timedelta(days=today.weekday() + 7) end_of_last_week = start_of_last_week + timedelta(days=6) # 准备周报数据 week_data = { 'department': '技术部', 'start_date': start_of_last_week.strftime('%y年%m月%d日'), 'end_date': end_of_last_week.strftime('%y年%m月%d日'), 'reporter': '张三', 'report_date': today.strftime('%y年%m月%d日'), 'completed_tasks': [ { 'name': '用户管理模块开发', 'status': '已完成', 'description': '完成了用户注册、登录、权限管理等功能的开发和单元测试。' }, { 'name': '数据导入功能优化', 'status': '已完成', 'description': '优化了大数据量导入的性能,提高了处理速度约40%。' }, { 'name': 'bug修复', 'status': '进行中 (80%)', 'description': '修复了上周反馈的10个bug中的8个,剩余2个正在处理中。' } ], 'planned_tasks': [ { 'name': '完成剩余bug修复', 'planned_time': '下周一至周二', 'description': '解决剩余的2个bug,并进行回归测试。' }, { 'name': '开始报表模块开发', 'planned_time': '下周三至周五', 'description': '设计并实现数据报表功能,包括数据统计和可视化展示。' }, { 'name': '代码审查与重构', 'planned_time': '下周五', 'description': '对现有代码进行审查,优化代码结构和性能。' } ], 'issues': [ { 'title': '性能问题', 'description': '在高并发情况下,系统响应速度明显下降。', 'solution': '计划通过引入缓存机制和优化数据库查询来解决。' }, { 'title': '团队协作效率', 'description': '当前的代码版本管理流程较为复杂,影响开发效率。', 'solution': '建议简化git工作流,并加强团队培训。' } ] } # 生成周报 return generate_weekly_report(week_data, f"技术部周报_{week_data['start_date']}_{week_data['end_date']}.docx") # 执行生成周报 # create_sample_weekly_report()
通过以上代码示例和应用场景,你可以轻松掌握python word文档自动化的各种技巧,大幅提高工作效率。无论是创建简单的文档,还是生成复杂的报告、合同或简历,python都能帮你轻松应对。
到此这篇关于python实现word文档自动化处理操作的文章就介绍到这了,更多相关python word自动化处理内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论