使用背景
根据excel表中的信息,按照word模板格式,每条信息生成一个对应的模板及文件名。
我这里的情况是将科技档案的封面格式按照案卷表的明细批量生成。
(单位的档案软件太鸡肋了,没有这个功能)
代码整篇
'''
工程档案封面制作
原理:通过读取案卷目录生成对应word
python-docx说明文件地址
https://python-docx.readthedocs.io/en/latest/index.html
'''
import openpyxl
from docx import Document
from docx.shared import Pt
def WriteNewDoc(a,b,c,d,e,dir):
'''
写入科技档案封面
'''
doc= Document('/data/home/2024/99档案/科技档案封面模板.docx')
para = doc.paragraphs
#填写档号
text_run1 = para[0].add_run(a)
text_run1.underline = True
text_run1.font.size = Pt(22)
text_run1.font.name = '黑体'
#填写立卷单位
text_run2 = para[-4].add_run(b.center(14))
text_run2.underline = True
text_run2.font.size = Pt(22)
text_run2.font.name = '黑体'
#填写起止日期
text_run3 = para[-3].add_run(c.center(27))
text_run3.underline = True
text_run3.font.size = Pt(22)
text_run3.font.name = '黑体'
#填写保管期限
text_run4 = para[-2].add_run(d.center(26))
text_run4.underline = True
text_run4.font.size = Pt(22)
text_run4.font.name = '黑体'
#填写密级
if e is None:
text_run5 = para[-1].add_run(" ")
else:
text_run5 = para[-1].add_run(e.center(28))
text_run5.underline = True
text_run5.font.size = Pt(22)
text_run5.font.name = '黑体'
title = dir+a+'.docx'
doc.save(title)
return
wb = openpyxl.load_workbook('/data/home/2024/99档案/2023工程案卷.xlsx')
ws = wb.active
#3和14是我要使用的表格信息的行号区间首尾,一行信息生成一个文件
for row in range(3,14):
#读取档号
data1 = ws.cell(row,4).value
#读取立卷单位
data2 = ws.cell(row,2).value
#读取起止日期
data3 = ws.cell(row,7).value
#读取保管期限
data4 = ws.cell(row,8).value
#读取密级
data5 = ws.cell(row, 13).value
WriteNewDoc(data1,data2,data3,data4,data5,'/data/home/2024/99档案/')
wb.close()
要点
- python-docx的对象架构,是document里含paragraphs,一个paragraph里含runs,一个run里含font,一个font可以调整字体的那些属性,当然,每一级都有自己的具体属性可以调整,比如段落可以调整居左/居右/居中,run里可以调整加粗、倾斜、下划线之类,font可以调整字体、大小之类。没有用到表格和超链接,没细看这两个对象的说明。
- document.save()里有名字的话,与模板不一样就是另存为了。
- Pt(22)对应中文二号字体,即22磅。
- string.center(num)中num的数值不一致,是因为我没找到中文字符的空格,一个中文字符的宽度等于两个空格,又不知道如何限制文本显示出的总长度,所以笨办法只能数,好在要不全是中文字符,要不全是数字,写好的长度都适用。密级那栏对应信息经常为空,所以加了判断。