• Python 自动化教程(5) : 自动生成Word文件


     系列教程:

    Python 自动化教程(1) 概述,第一篇 Excel自动化

    Python 自动化教程(2) : Excel自动化:使用pandas库

    Python 自动化教程(3) : 自动生成PPT文件 Part 1

    Python 自动化教程(4) : 自动生成PPT文件 Part 2

    Python 自动化教程(5) : 自动生成Word文件

    Python 自动化教程(6) : PDF文件处理

    本篇介绍使用  office 库处理 Word文件.

    本文数据及源码文件下载请点这里

     office库简介

         office库是笔者写的python库,用于办公自动化,功能是很强的, 包括:PPT自动生成、PPT转长图、PPT带语音播放、Word自动生成、Excel数据处理、图片处理、视频处理、office文档转为PDF、PDF加解密、加水印等等,都是实用的干货。

    使用方法极简,大多数功能只需一行、两行代码。

     使用PIP 安装office库:

    请在命令行,通过PIP安装:

    pip install jojo-office

    office库的安装名称是 jojo-office

    使用时: import office 即可。

    import office

    office库依赖库包括:python-docx, openpyxl, python-pptx, PyPDF4, reportlab, playsound等, 安装时将自动安装完成。

    如需要导入导出DataFrame, 则依赖 pandas 库,请按需要安装

    pip install pandas -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

    office库只支持新版的office文件(扩展名为 .docx, .xlsx, .pptx),不支持office2003以前的老版本office文件(扩展名为 .doc, .xls, .ppt)。

    五、自动生成Word文件

    1、一行代码自动生成Word的实战效果

    1. import office
    2. # 以 试卷模板.docx为模板,生成output.docx, 填入datafile.xlsx文件数据,保存
    3. office.open_file("output.docx", "试卷模板.docx").fill("datafile.xlsx").save()

    生成了一张试卷 output.docx 文件, 如下:

    一张漂亮的考试卷就产生了, 有单选题、多选题、简答题、编程题等等

    2、自动生成Word文件的原理

    自动生成Word文件的方法是:首先写一个模板Word文件,复制模板创建新文件,再填入数据。 
    填入不同的数据,则产生不同的文件内容。

    例如:模板Word文件 template.docx 的文字内容如下:

    1. 姓名 : {name}
    2. 年龄 : {age}

    大括号 { } 中包含的叫变量, 上例中的:name, age。
    在填入数据时,变量将替换为相应的值。

    2.1 将Excel数据填入Word文件

    Excel文件 datafile.xlsx 中,Sheet1工作表B2单元格内容是 'Peter', C2格内容是 18。
    则,模板Word文件 template1.docx 写成这样:

    1. 姓名 : {Sheet1!B2}
    2. 年龄 : {Sheet1!C2}

    python程序如下:

    1. import office
    2. # 以 template1.docx 为模板,创建 output.docx 文件
    3. wd = office.open_file("output.docx", template="template1.docx")
    4. # 从 datafile.xlsx 文件中取数据, 填入, 保存
    5. wd.fill('datafile.xlsx').save()

    上述程序也可以连写为一行:

    office.open_file("output.docx", template="template1.docx").fill('datafile.xlsx').save()

    程序运行后,生成 output.docx 文件, 其内容如下:

    1. 姓名 : Peter
    2. 年龄 : 18

    可见,Excel文件中的数据,替换了 Word文档中的变量,生成了Word文档内容。

    小结:

    写模版文件就是在适当的位置写入变量。变量以 { 号开头,} 号结尾。

     指向Excel数据的变量名就是 工作表及单元格的引用地址, 如: {Sheet1!B2} 。

    生成Word就是填入数据。同一模板生成不同的Word文件,更换数据即可。

    填入数据时, Word 文字格式(包括字体、大小、位置、颜色)都没有变。

    2.2 将dictionary数据 填入Word文件

    模板Word文件 template3.docx 写成这样:

    1. 姓名 : {name}
    2. 年龄 : {age}

    即: 有两个变量 name, age

    python程序如下:

    1. import office
    2. # 数据
    3. data = {'name': 'Peter', 'age': 18}
    4. # 以 template3.docx 为模板,创建 output.docx 文件
    5. wd = office.open_file("output.docx", template="template3.docx")
    6. # 填入数据data, 保存
    7. wd.fill(data).save()

    上述程序也可以连写为一行:

    office.open_file("output.docx", template="template3.docx").fill(data).save()
    

    程序运行后,生成 output.docx 文件, 其内容如下:

    1. 姓名 : Peter
    2. 年龄 : 18

    如果 dictionary 是多层级的,比如:

    data = { 'friend': { 'name': 'Mary', 'age': 19} }

    则模板写为:

    1. 姓名:{friend.name}
    2. 年龄:{friend.age}

    2.3 多次填入数据

    如果数据分布在多个Excel文件或 dictionary 中,可以多次调用fill()填充数据,例如:

    1. wd = office.open("output.docx", "template.docx")
    2. # 先填充 1.xlsx Excel数据,再填充 dict1 数据
    3. wd.fill('1.xlsx').fill(dict1).save()

    2.4 重复书写文字段落

    有时,我们需要重复写某些文字段落,比如:列出人员名单。

    Excel文件 datafile.xlsx 的 Sheet1工作表B2:C4区域有一个表格。

    模板Word文件 template2.docx 写成这样:

    {@repeat 姓名 : {Sheet1!B2},   年龄 : {Sheet1!C2} }

    '{@repeat' 表明需要重复,重复部分为 '姓名 : {Sheet1!B2},   年龄 : {Sheet1!C2}'。 
    注意最后有一个 } 符号,与 {@repeat 形成闭环。

    重复次数由其中的变量决定。 从 Sheet1!B2 开始,每次向下读取一行 Sheet1!B3、Sheet1!B4 ... 直达空值为止。

     python程序如下:

    1. import office
    2. wd = office.open_file("output.docx", template="template2.docx")
    3. # 从 datafile.xlsx 文件中取数据, 填入, 保存
    4. wd.fill('datafile.xlsx').save()

    程序运行后,生成 output.docx 文件, 其内容如下:

    1. 姓名 : Peter, 年龄 : 18
    2. 姓名 : Sam, 年龄 : 19
    3. 姓名 : Mary, 年龄 : 2

    因为Excel表格数据有三行,所以重复了3次。

    2.5  将Word文件另存为PDF

    python程序如下:

    1. # 打开 output.docx 文件, 另存为 output.pdf
    2. office.open_file("output.docx").save("output.pdf")

    注: 存为PDF的功能需要本机安装有Microsoft Word或 WPS,(Windows环境)。

    3、应用示例:

    3.1 应用示例:邀请函

    开大会,每个客户要打印一张纸的邀请函。
    把客人姓名、称谓写入列表,写一个循环,生成一批word文件, 打印它们即可。

    模板文件见邀请函模板.docx, 大致内容如下:

    1. 尊敬的{name}{title}:
    2. 您好!我们很荣幸地邀请您...

    python代码如下:

    1. import office
    2. persons = [
    3. ["张三", "先生"],
    4. ["李四", "女士"],
    5. ["王五", "总经理"],
    6. ]
    7. filenames = []
    8. for person in persons:
    9. data = {'name': person[0], 'title': person[1]}
    10. filename = person[0] + ".docx"
    11. office.open_file(filename, "邀请函模板.docx").fill(data).save()
    12. filenames.append(filename)
    13. # 可以使用 print_files() 批量打印文件
    14. office.print_files(filenames)

    程序运行后,生成了 3个Word文件。

    3.2 应用示例:生成一张考试卷

    一张考试卷, 有多道选择题、多道简答题等等。

    将题目、选项等数据写在Excel文件 datafile.xlsx  的 '试卷'工作表中。

    模板文件为 试卷模板.docx, 内容大致如下。

    模板说明:

    {日期} 是从 dict 数据中填入的。
    其他数据均来自 Excel数据的  '试卷'工作表


    '一' 这个部分的 重复段落 '{@repeat .... }' 中包括四行。

    第一行是 {@index}序号、{试卷!A6}题目、{试卷!F6}答案。
    {@index} 是一个特殊变量,表示重复的序号。

    第二行是 {试卷!B6} 选项A 、 {试卷!C6} 选项B。

    第三行是 {试卷!D6} 选项C 、 {试卷!E6} 选项D。

    第四行是一个空行。表示每道题之间空一行。

    '二' 这个部分类似... ...

    python程序如下:

    1. import office
    2. wd = office.open_file("output.docx", "试卷模板.docx")
    3. wd.fill('datafile.xlsx') # 填入Excel数据
    4. wd.fill({'日期': '2022年'}) # 填入变量 '日期'
    5. wd.save()

    程序运行后,生成 output.docx 文件, 其内容如下:

    一张漂亮的考试卷就产生了, 有单选题、多选题、简答题、编程题等等。

    Word模板文件只是定义了试卷的组成部分和格式、变量。

    试卷的所有数据内容都是在Excel文件中定义。

    以上方法是通用的, 可以生成任何试卷、或其他类型的文档。

    小结:

    1, office库提供了 Word生成功能。

    2, 写一个模板Word文件,编写变量。填入数据,即可生成Word文件.

    3,  数据可以放在Excel文件中。变量为 Excel的 {工作表!单元格}。

    4, 数据可以是 dictionary。变量为  键名,如:{key}。

    5,段落可以重复生成

    6,  Word可以存为PDF。

    本文数据及源码文件下载请点这里

    续篇:

    office库还有其他许多功能,下节课再讲。

    office库还在开发完善中,偶有bug请见谅、或提改进。

    有兴趣深入研究的,可以看office.py的源码。

  • 相关阅读:
    IDEA使用技巧
    API_String的重要特性
    Java.lang.Class类 getResource()方法有什么功能呢?
    求和中x:y=g(x)的含义
    移动Web第四天 1 移动适配
    51单片机应用从零开始(三)
    Python机器学习实战-特征重要性分析方法(1):排列重要性(附源码和实现效果)
    Python逐日填补Excel中的日期并用0值填充缺失日期的数据
    《uni-app》一个非canvas的飞机对战小游戏实现-碰撞检测的实现
    【超详细】MYSQL 8.0 数据库安装与配置教程
  • 原文地址:https://blog.csdn.net/c80486/article/details/126571617