使用背景
根據excel表中的信息,按照word模板格式,每條信息生成一個對應的模板及文件名。
我這里的情況是將科技檔案的封面格式按照案卷表的明細批量生成。
(單位的檔案軟件太雞肋了,沒有這個功能)
代碼整篇
'''
工程檔案封面制作
原理:通過讀取案卷目錄生成對應word
python-docx說明文件地址
https://python-docx.readthedocs.io/en/latest/index.html
'''
import openpyxl
from docx import Document
from docx.shared import Ptdef 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 = Truetext_run1.font.size = Pt(22)text_run1.font.name = '黑體'#填寫立卷單位text_run2 = para[-4].add_run(b.center(14))text_run2.underline = Truetext_run2.font.size = Pt(22)text_run2.font.name = '黑體'#填寫起止日期text_run3 = para[-3].add_run(c.center(27))text_run3.underline = Truetext_run3.font.size = Pt(22)text_run3.font.name = '黑體'#填寫保管期限text_run4 = para[-2].add_run(d.center(26))text_run4.underline = Truetext_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 = Truetext_run5.font.size = Pt(22)text_run5.font.name = '黑體'title = dir+a+'.docx'doc.save(title)returnwb = 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).valueWriteNewDoc(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的數值不一致,是因為我沒找到中文字符的空格,一個中文字符的寬度等于兩個空格,又不知道如何限制文本顯示出的總長度,所以笨辦法只能數,好在要不全是中文字符,要不全是數字,寫好的長度都適用。密級那欄對應信息經常為空,所以加了判斷。