【Python】Python-docx使用实例 科技档案封面批量生成

使用背景

根据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()

要点

  1. python-docx的对象架构,是document里含paragraphs,一个paragraph里含runs,一个run里含font,一个font可以调整字体的那些属性,当然,每一级都有自己的具体属性可以调整,比如段落可以调整居左/居右/居中,run里可以调整加粗、倾斜、下划线之类,font可以调整字体、大小之类。没有用到表格和超链接,没细看这两个对象的说明。
  2. document.save()里有名字的话,与模板不一样就是另存为了。
  3. Pt(22)对应中文二号字体,即22磅。
  4. string.center(num)中num的数值不一致,是因为我没找到中文字符的空格,一个中文字符的宽度等于两个空格,又不知道如何限制文本显示出的总长度,所以笨办法只能数,好在要不全是中文字符,要不全是数字,写好的长度都适用。密级那栏对应信息经常为空,所以加了判断。

相关推荐

  1. C# 使用DocX生成word文档

    2024-07-15 22:18:03       44 阅读
  2. vue 使用docx生成word表格文档

    2024-07-15 22:18:03       36 阅读
  3. js实现多个word合并,使用docx-merger库

    2024-07-15 22:18:03       51 阅读
  4. 使用 Spring Boot + POI 实现动态 DOCX 模版导出

    2024-07-15 22:18:03       24 阅读
  5. C#实现批量生成二维码

    2024-07-15 22:18:03       47 阅读
  6. 用python把docx批量转为pdf

    2024-07-15 22:18:03       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 22:18:03       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 22:18:03       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 22:18:03       62 阅读
  4. Python语言-面向对象

    2024-07-15 22:18:03       72 阅读

热门阅读

  1. .NET Core项目中添加MIME类型

    2024-07-15 22:18:03       22 阅读
  2. 对于RBAC模型的认识

    2024-07-15 22:18:03       22 阅读
  3. 开源项目面临的机遇与挑战

    2024-07-15 22:18:03       21 阅读
  4. 【C++语言】正则表达式

    2024-07-15 22:18:03       20 阅读
  5. Mybatis防止SQL注入

    2024-07-15 22:18:03       22 阅读
  6. Vue2中的指令修饰符

    2024-07-15 22:18:03       19 阅读
  7. Python面试题:如何在 Python 中处理大数据集?

    2024-07-15 22:18:03       23 阅读
  8. 安全编织:Eureka驱动的分布式服务网格安全策略

    2024-07-15 22:18:03       22 阅读
  9. 速盾:cdn加速能提高多少?

    2024-07-15 22:18:03       17 阅读