当前位置: 首页 > news >正文

Python教学基础:用Python和openpyxl结合Word模板域写入数据-由Deepseek产生

使用Python和openpyxl结合Word模板域写入数据

在Python中,我们可以使用openpyxl处理Excel数据,然后结合Word模板中的域(书签或合并域)来生成定制化的Word文档。以下是几种实现方法:

方法一:使用书签(Bookmarks)

1. 准备Word模板

首先创建一个Word模板,在需要插入数据的位置添加书签。

2. Python实现代码

import openpyxl
from docx import Document
from docx.shared import Inchesdef fill_word_template_from_excel(excel_file, word_template, output_file):# 读取Excel数据wb = openpyxl.load_workbook(excel_file)ws = wb.active# 读取Word模板doc = Document(word_template)# 假设Excel第一行是标题,第二行是数据data = {}for i, cell in enumerate(ws[1], 1):data[cell.value] = ws[2][i-1].value# 替换Word中的书签for paragraph in doc.paragraphs:for key, value in data.items():if key in paragraph.text:paragraph.text = paragraph.text.replace(f'[{key}]', str(value))# 处理表格for table in doc.tables:for row in table.rows:for cell in row.cells:for key, value in data.items():if key in cell.text:cell.text = cell.text.replace(f'[{key}]', str(value))# 保存文档doc.save(output_file)print(f"文档已生成: {output_file}")# 使用示例
fill_word_template_from_excel('data.xlsx', 'template.docx', 'output.docx')

方法二:使用邮件合并域

1. 准备Word模板

在Word模板中使用«字段名»格式的合并域。

2. Python实现代码

import openpyxl
from docx import Document
import redef mail_merge_from_excel(excel_file, word_template, output_file):# 读取Excel数据wb = openpyxl.load_workbook(excel_file)ws = wb.active# 读取Word模板doc = Document(word_template)# 获取数据(假设第一行是字段名)headers = [cell.value for cell in ws[1]]data_row = ws[2]  # 假设使用第二行数据# 创建数据字典data = {headers[i]: data_row[i].value for i in range(len(headers))}# 替换合并域for paragraph in doc.paragraphs:for key, value in data.items():merge_field = f'«{key}»'if merge_field in paragraph.text:paragraph.text = paragraph.text.replace(merge_field, str(value))# 处理表格中的合并域for table in doc.tables:for row in table.rows:for cell in row.cells:for key, value in data.items():merge_field = f'«{key}»'if merge_field in cell.text:cell.text = cell.text.replace(merge_field, str(value))# 保存文档doc.save(output_file)print(f"邮件合并完成: {output_file}")# 使用示例
mail_merge_from_excel('employee_data.xlsx', 'offer_letter_template.docx', 'offer_letter.docx')

方法三:批量处理多条数据

import openpyxl
from docx import Document
import osdef batch_generate_documents(excel_file, word_template, output_folder):# 创建输出文件夹if not os.path.exists(output_folder):os.makedirs(output_folder)# 读取Excel数据wb = openpyxl.load_workbook(excel_file)ws = wb.active# 获取标题行headers = [cell.value for cell in ws[1]]# 遍历每一行数据for row_idx, row in enumerate(ws.iter_rows(min_row=2), 1):# 读取Word模板doc = Document(word_template)# 创建数据字典data = {headers[i]: row[i].value for i in range(len(headers))}# 替换文档内容for paragraph in doc.paragraphs:for key, value in data.items():placeholder = f'{{{key}}}'if placeholder in paragraph.text:paragraph.text = paragraph.text.replace(placeholder, str(value))# 处理表格for table in doc.tables:for table_row in table.rows:for cell in table_row.cells:for key, value in data.items():placeholder = f'{{{key}}}'if placeholder in cell.text:cell.text = cell.text.replace(placeholder, str(value))# 保存文档filename = f"{output_folder}/document_{row_idx}.docx"doc.save(filename)print(f"批量生成完成,共生成 {ws.max_row - 1} 个文档")# 使用示例
batch_generate_documents('students.xlsx', 'certificate_template.docx', 'certificates')

方法四:使用python-docx-template(推荐)

首先安装:pip install docxtpl

import openpyxl
from docxtpl import DocxTemplate
import jsondef advanced_template_filling(excel_file, word_template, output_file):# 读取Excel数据wb = openpyxl.load_workbook(excel_file)ws = wb.active# 准备数据headers = [cell.value for cell in ws[1]]data = {}# 假设我们处理第一行数据for i, header in enumerate(headers):data[header] = ws[2][i].value# 加载Word模板doc = DocxTemplate(word_template)# 渲染模板doc.render(data)# 保存文档doc.save(output_file)print(f"高级模板填充完成: {output_file}")# 使用示例
advanced_template_filling('contract_data.xlsx', 'contract_template.docx', 'contract_final.docx')

完整案例:生成员工录用通知书

Excel数据 (employee_data.xlsx)

姓名职位部门入职日期薪资
张三软件工程师技术部2024-01-1515000

Word模板 (offer_letter_template.docx)

员工录用通知书尊敬的«姓名»先生/女士:我们很高兴通知您,您已被录用为«部门»的«职位»。入职日期:«入职日期»
基本薪资:¥«薪资»元/月请携带相关材料按时报到。人力资源部
«当前日期»

Python代码

import openpyxl
from docxtpl import DocxTemplate
from datetime import datetimedef generate_offer_letters():# 读取Excel数据wb = openpyxl.load_workbook('employee_data.xlsx')ws = wb.active# 处理每一行数据for row in ws.iter_rows(min_row=2, values_only=True):name, position, department, start_date, salary = row# 准备上下文数据context = {'姓名': name,'职位': position,'部门': department,'入职日期': start_date.strftime('%Y年%m月%d日') if isinstance(start_date, datetime) else start_date,'薪资': salary,'当前日期': datetime.now().strftime('%Y年%m月%d日')}# 加载并渲染模板doc = DocxTemplate('offer_letter_template.docx')doc.render(context)# 保存文档output_file = f"offer_letter_{name}.docx"doc.save(output_file)print(f"已生成: {output_file}")# 执行
generate_offer_letters()

总结

以上方法提供了不同复杂度的Word模板填充方案:

  1. 简单替换:使用字符串替换处理简单的占位符
  2. 邮件合并:处理标准的Word合并域格式
  3. 批量处理:一次性处理多条数据记录
  4. 高级模板:使用docxtpl库处理复杂的模板逻辑

选择哪种方法取决于你的具体需求:

  • 简单需求:使用方法一或二
  • 批量处理:使用方法三
  • 复杂模板:推荐使用方法四(docxtpl)

记得安装所需库:

pip install openpyxl python-docx docxtpl
http://www.dtcms.com/a/598351.html

相关文章:

  • 保姆级CHARLS数据库使用教程
  • 光辉网站建设公司河南郑州建设网站
  • 如何使用 Gitblit 内置的 GitLFS 存储大文件
  • 网站开发公司 商业计划书信息流投放平台
  • [论文阅读] 软件工程 | 解决Java项目痛点:DepUpdater如何平衡依赖升级的“快”与“稳”
  • 建设一个网站需要多少钱青岛做网站eoe
  • 在数据“可用不可见”中寻找支付安全与体验的平衡
  • 男人女人做那个网站wordpress中文翻译插件
  • 东莞长安营销型网站建设宁夏百度公司
  • 网站开发课程论文北京最近发布会直播
  • 网站页面设计效果图设计专业招聘信息
  • 没有网站可以做百度排名吗1688网站建设与维护
  • pink老师html5+css3day08
  • 上海企业网站制作公司wordpress 网站统计
  • 网站追踪如何做网站制作哪家大
  • nginx介绍与简单操作
  • 个人制作的网站做废铝的关注哪个网站好
  • 网站做受网站wordpress添加媒体失败
  • 【从 `.exe` 到 CPU:一次加法背后的完整旅程】
  • 17.模型微调——微调数据集构建
  • html5 响应式网站网站默认地区数据修改
  • 风电组网环境多苛刻?
  • 有没有专门做字体排版设的网站百度智能小程序生态
  • 响应式网站展示型十堰学网站建设培训班
  • 涌现能力 是什么
  • 【datawhale】RAG学习笔记
  • 上传文件到网站营口网站seo
  • 西安网站制作公司排名电销系统开发
  • 对电子商务网站建设和管理的理解如何做商城网站小程序
  • 巧妙运用长尾关键词实现SEO关键词优化新高度