教你使用Python根据模板批量生成docx文档
作者:2016bits 发布时间:2021-12-27 00:35:13
标签:Python,批量生成,docx文档
一、需求说明
能够根据模板批量生成docx文档。具体而言,读取excel中的数据,然后使用python批量生成docx文档。
二、实验准备
准备excel数据:
这里是关于学生语数英成绩的统计表,文件名为score.xls
准备模板:
这是给学生家长的成绩通知书,文件名为template.doc
另外,在使用python进行实验之前,需要先安装第三方库docxtpl和xlrd,直接pip install就行:
pip install docxtpl
pip install xlrd
然后将xls和doc和python文件放在同一个目录下
三、代码实现
首先打开xls,读取数据:
workbook = xlrd.open_workbook(sheet_path)
然后从文件中获取第一个表格:
sheet = workbook.sheet_by_index(0)
然后遍历表格的每一行,将数据存入字典列表:
tables = []
for num in range(1, sheet.nrows):
stu = {}
stu['name'] = sheet.cell_value(num, 0)
stu['class'] = sheet.cell_value(num, 1)
stu['language'] = sheet.cell_value(num, 2)
stu['math'] = sheet.cell_value(num, 3)
stu['English'] = sheet.cell_value(num, 4)
tables.append(stu)
接下来将列表中的数据写入docx文档,其实这个过程可以在读数据时同时进行,即读完一行数据,然后生成一个文档。
首先在指定路径生成一个docx文档:
document = Document(word_path)
然后逐行进行正则表达式的替换:
paragraphs = document.paragraphs
text = re.sub('name', stu['name'], paragraphs[1].text)
paragraphs[1].text = text
text = re.sub('name', stu['name'], paragraphs[2].text)
text = re.sub('class', stu['class'], text)
text = re.sub('language', str(stu['language']), text)
text = re.sub('math', str(stu['math']), text)
text = re.sub('English', str(stu['English']), text)
paragraphs[2].text = text
其实不关心格式问题的,到现在为止就已经结束了。但是这样替换后docx中被替换的文字格式也被更改为系统默认的正文格式,所以接下来是将这些改成自己想要的格式:
遍历需要更改格式的段落,然后更改字体大小和字体格式:
for run in paragraph.runs:
run.font.size = Pt(16)
run.font.name = "宋体"
r = run._element.rPr.rFonts
r.set(qn("w:eastAsia"), "宋体")
最后保存文件:
document.save(path + "\\" + r"{}的成绩通知单.docx".format(stu['name']))
完整代码:
from docxtpl import DocxTemplate
import pandas as pd
import os
import xlrd
path = os.getcwd()
# 读表格
sheet_path = path + "\score.xls"
workbook = xlrd.open_workbook(sheet_path)
sheet = workbook.sheet_by_index(0)
tables = []
for num in range(1, sheet.nrows):
stu = {}
stu['name'] = sheet.cell_value(num, 0)
stu['class'] = sheet.cell_value(num, 1)
stu['language'] = sheet.cell_value(num, 2)
stu['math'] = sheet.cell_value(num, 3)
stu['English'] = sheet.cell_value(num, 4)
tables.append(stu)
print(tables)
# 写文档
from docx import Document
import re
from docx.oxml.ns import qn
from docx.shared import Cm,Pt
for stu in tables:
word_path = path + "\\template.doc"
document = Document(word_path)
paragraphs = document.paragraphs
text = re.sub('name', stu['name'], paragraphs[1].text)
paragraphs[1].text = text
text = re.sub('name', stu['name'], paragraphs[2].text)
text = re.sub('class', stu['class'], text)
text = re.sub('language', str(stu['language']), text)
text = re.sub('math', str(stu['math']), text)
text = re.sub('English', str(stu['English']), text)
paragraphs[2].text = text
for paragraph in paragraphs[1:]:
for run in paragraph.runs:
run.font.size = Pt(16)
run.font.name = "宋体"
r = run._element.rPr.rFonts
r.set(qn("w:eastAsia"), "宋体")
document.save(path + "\\" + r"{}的成绩通知单.docx".format(stu['name']))
四、实验结果
文件中的文件:
生成的文件样例:
来源:https://blog.csdn.net/weixin_43794736/article/details/116589696
0
投稿
猜你喜欢
- [原文地址] VS 2008 Performance Improvements[原文发表时间] Thursday, September 27
- 最近项目很忙没机会更新博客。有朋友在和我谈学艺术的就业问题,就随便谈一下自己的想法。每年中国美院报考的人数与日俱增,越来越多的人投入到艺术设
- 前两天,班上同学写论文,需要将很多篇论文题目按照中文的习惯分词并统计每个词出现的频率。让我帮她实现这个功能,我在网上查了之后发现jieba这
- PHP join() 函数实例把数组元素组合为一个字符串:<?php $arr = array('Hello',
- SQL Server数据库备份有两种方式,一种是使用BACKUP DATABASE将数据库文件备份出去,另外一种就是直接拷贝数据库文件mdf
- 1、环境PyCharmPython 3.6pip安装的依赖包包括:requests 2.25.0、urllib3 1.26.2、docx 0
- 随着3G的普及,越来越多的人使用手机上网。移动设备正超过桌面设备,成为访问互联网的最常见终端。于是,网页设计师不得不面对一个难题:如何才能在
- 如何结束Python的子线程和子进程结束子线程的方法:这个是搬运其他大神的代码,鄙人也不知道原理,反正拿来主义,暂时没发现什么缺点,先用着再
- 微软在今天早上发布新的安全通告证实,一处远程执行代码漏洞影响到了整个SQL Server产品线。该漏洞的入侵代码在两周前已经被公布在互联网上
- 安装pyserialpip install pyserial查看可用的端口# coding:utf-8import serial.tools
- 译者:AlphaImageLoader是一个让IE6正常显示PNG32时要用到的一个滤镜,但它在使用中也会产生一系列的问题,本文对使用Alp
- 用window.open打开的窗口中,有时候session变量会丢掉,给asp编程带来的一定的麻烦。用参数传递解决它:<DIV&nbs
- 有2个不同的方法增加用户:通过使用GRANT语句或通过直接操作MySQL授权表。比较好的方法是使用GRANT语句,因为他们是更简明并且好像错
- Oracle 的正规表达式的实施是以各种 SQL 函数和一个 WHERE 子句操作符的形式出现的。如果您不熟悉正规表达式,那么这篇文章可以让
- 如果使用注释的方法得当的话,为你的CSS文件添加注释可以在开发过程中给予你和其他人很大的帮助。最常见的是为CSS样式规则添加提示信息,不过使
- 作为收费应用方面的数据库管理员(DBA),公司首席信息官(CIO)经常邀请我与Sarbanes-Oxley审查员开会讨 * 司数据的安全与整合
- 两段使用键盘的上下键进行选择的代码:<Script Language="JScript"> &
- 两组字符串数据,需要比较其中相同的数据,并将其值相加并组成一个新的字符串数据a1="sp2=20;sp1=34;"a2=
- 使用 Microsoft® SQL Server™ 2000,可以选择在一台计算机上安装 SQL Ser
- 这个只是一个简单的比较无聊的尝试,类似blog等一些网站的换肤功能都是以此方式改变网站的皮肤。对于这些方法大家会的比较多,没啥说的。主要我是