• 【办公自动化】使用Python一键往Word文档的表格中填写数据(文末送书)


    3f6a7ab0347a4af1a75e6ebadee63fc1.gif

    🤵‍♂️ 个人主页:@艾派森的个人主页

    ✍🏻作者简介:Python学习
    🐋 希望大家多多支持,我们一起进步!😄
    如果文章对你有帮助的话,
    欢迎评论 💬点赞👍🏻 收藏 📂加关注+


    目录

    一、Python处理Word

    二、一键往Word文档的表格中填写数据

    三、往期推荐


     

    一、Python处理Word

    • Python处理Word的好处

    使用Python处理Word文档具有许多优势,以下是一些主要的好处:

    1. 自动化和批量处理: Python可以帮助你自动化处理大量的Word文档,例如批量替换文本、生成报告、提取数据等。这样可以节省大量的时间和劳动力。

    2. 数据提取和转换: 如果你需要从大量的Word文档中提取特定数据,Python可以轻松实现这一点。你可以编写脚本来搜索并提取你需要的信息,然后将其转换为其他格式,如CSV、Excel或数据库。

    3. 定制化和自由度: 使用Python处理Word文档意味着你可以根据自己的需求定制处理过程。你可以创建定制的模板、样式和布局,以及根据项目需求进行灵活的调整。

    4. 与其他工具和技术的集成: Python可以与许多其他库和技术进行集成,例如数据库、Web服务、数据分析工具等。这使得你可以将Word文档的处理与其他工作流程结合起来,实现更复杂的任务。

    5. 文档生成和报告: 如果你需要定期生成报告或文档,Python可以通过自动生成文本、图表和表格等来实现。这对于数据分析、项目管理和业务报告等非常有用。

    6. 版本控制和代码重用: 使用Python代码处理Word文档可以实现代码重用和版本控制。你可以将处理文档的代码存储在版本控制系统中,以便团队成员协作、维护和共享代码。

    7. 跨平台性: 大多数Python库可以在多个操作系统上运行,因此你可以在Windows、Linux和macOS等不同平台上处理Word文档。

    • Python处理Word的第三方库

    在Python中,有几个第三方库可以用于处理Word文档。以下是一些常用的第三方库:

    1. python-docx: 这是一个用于创建和修改Microsoft Word文档(.docx格式)的流行库。它允许你读取、编辑和创建Word文档,包括段落、表格、图像等。

    2. pywin32(仅限Windows): 这个库允许你在Windows上与Microsoft Office应用程序进行交互,包括Word。它可以用于自动化操作,例如创建、打开、编辑和保存文档。

    3. docx2txt: 这个库可以用来将.docx文件转换为纯文本(.txt格式)。它适用于从Word文档中提取文本内容。

    4. python-docx-template: 这个库扩展了python-docx库,使你能够在模板中插入变量和循环,并以更动态的方式生成Word文档。

    5. py-docx: 这是另一个用于处理.docx文件的库。它提供了类似python-docx的功能,但使用不同的接口。

    二、一键往Word文档的表格中填写数据

     

    技术工具:

    Python版本:3.9

    代码编辑器:jupyter notebook

            在工作中,我们经常遇到将Excel表中的部分信息填写到Word文档的对应表格中,以生成报告,方便打印。今天我们就来试试如何往固定的Word模板中填写数据。此例要求将Excel档的“收货数据”填写到Word档的“收货记录”中去,并加总收货数量。模板是下面这样的。

    bc9ceadd4fb3484ba6809d043e7670fa.png

    要求结果是这样的:

    415df64d9c1d48b3aa3a3832223bd965.png

     首先,需要从Excel表格中提取数据。

    1. #从Excel表中提取数据
    2. from openpyxl import load_workbook
    3. wb = load_workbook("收货数据.xlsx")
    4. ws = wb.active
    5. data=[]
    6. for row in range(2,ws.max_row+1):
    7. seq = ws["A"+str(row)].value
    8. supplier = ws["B"+str(row)].value
    9. material_pn = ws["C"+str(row)].value
    10. material_model = ws["D"+str(row)].value
    11. desp = ws["E"+str(row)].value
    12. qty = ws["F"+str(row)].value
    13. date = ws["G"+str(row)].value.date()
    14. info = [seq, supplier, material_pn, material_model, desp, qty, date]
    15. data.append(info)
    1. # 检查一下数据
    2. data[0]

    1a728d48a2d846149a9250b07faaa217.png

    由于需要将数量列的数据加总,所以先定义一个加总函数,以便后面调用。

    1. #定义数量加总函数
    2. def Sum_list(list):
    3. s = 0
    4. for i in list: #累加列表中的所有数
    5. s+=i
    6. return s
    1. # 加总数量列的所有数字
    2. qty_list=[]
    3. for i in data:
    4. qty_list.append(i[5]) #数量在内层列表的第6个位置,索引是5
    5. sum_qty= Sum_list(qty_list) #调用加总函数加总
    6. sum_qty

    7016279ba0e24c4fbeab6b41667073e8.png

    定义单元格合并函数 

    1. #定义合并单元格的函数
    2. def Merge_cells(table,target_list,start_row,col):
    3. '''
    4. table: 是需要操作的表格
    5. target_list: 是目标列表,即含有重复数据的列表
    6. start_row: 是开始行,即表格中开始比对数据的行(需要将标题除开)
    7. col: 是需要处理数据的列
    8. '''
    9. start = 0 #开始行计数
    10. end = 0 #结束行计数
    11. reference = target_list[0] #设定基准,以列表中的第一个字符串开始
    12. for i in range(len(target_list)): #遍历列表
    13. if target_list[i] != reference: #开始比对,如果内容不同执行如下
    14. reference = target_list[i] #基准变成列表中下一个字符串
    15. end = i - 1
    16. table.cell(start+start_row,col).merge(table.cell(end+start_row,col))
    17. start = end + 1
    18. if i == len(target_list) - 1: #遍历到最后一行,按如下操作
    19. end = i
    20. table.cell(start+start_row,col).merge(table.cell(end+start_row,col))

    然后往word的表格中写入数据,并合并单元格。

    1. #数据提取即处理完毕后,就可以往Word的表格中写入数据了
    2. from docx import Document
    3. doc = Document("收货记录模板.docx")
    4. #读取word文档中的第一个表格的第二和第三列除标题和尾部总数行的数据
    5. table = doc.tables[0] #已确定是第一个表格,其索引是0
    6. supplier = [] #存储供应商名称
    7. pn = [] #存储物料编码
    8. for i in data:
    9. supplier.append(i[1])
    10. pn.append(i[2])
    11. #按需增加行,以便填写数据
    12. for i in range(len(supplier)): #模板中已经有一行了,所以总共只需增加len(supplier)行
    13. table.add_row()
    14. #增加好行后先做合并单元格操作
    15. Merge_cells(table,supplier,1,1) #开始合并行为2,索引为1;供应商名称是在2列,索引为1
    16. Merge_cells(table,pn,1,2) #开始合并行为2,索引为1;物料编码是在3列,索引为2
    17. #写入数据到表格
    18. for row in range(1,len(supplier)+1):
    19. for col in range(7):
    20. table.cell(row,col).text = str(data[row-1][col])
    21. max_row = len(table.rows) #获取最大一行
    22. qty_row = max_row-1 #确定需要写入加总数据的一行
    23. table.cell(qty_row,5).merge(table.cell(qty_row,5)) #合并右下角用于填写数量的两个单元格
    24. table.cell(qty_row,4).text = '总数:'
    25. table.cell(qty_row,5).text = str(sum_qty)
    26. doc.save("收货记录.docx")

            由于合并供应商名称和物料编码两列中的相同内容的单元格,所有需要把这两列的信息从总数据`data`中单独提取出来。新建了`supplier`和`pn`两个空列表,然后遍历`data`,将数据取出并存入空列表。随后,我们根据实际需要,新增一些空白行,以便后面写入数据。新增行的数量以`supplier`列表中元素的个数为依据。这个表格已经存在一个空白行,算上外行要填“总数”,只需增加`supplier`列表中元素的个数对应那么多行就够了。当然这里也可以以列表`pn`中元素个数为依据,两者是相等的。增加好行后,先调用函数`Merge_cells`做合并单元格操作(如果先写入数据,再合并,会导致单元格内容重复)。合并完后,就可以写入数据到表格了,此处遍历需要写入数据的行和列,然后从`data`中提取数据。数据行写完后,还需要写入最后一行的“总数”字样和总的物料数量。最后保存数据,得到如下结果:

    16c6e69a88c64ef097e165c946250477.png

    三、往期推荐

    Python提取pdf中的表格数据(附实战案例)

    使用Python自动发送邮件

    Python操作ppt和pdf基础

    Python操作word基础

    Python操作excel基础

    使用Python一键提取PDF中的表格到Excel

    四、文末推荐与福利

    《Python自动化办公应用大全(ChatGPT版)》免费包邮送出3本!

    8e5d7939a25f465ea349e45a84cd36a0.jpeg

     

    内容简介:

            本书全面系统地介绍了Python语言在常见办公场景中的自动化解决方案。全书分为5篇21章,内容包括Python语言基础知识,Python读写数据常见方法,用Python自动操作Excel,用Python自动操作Word 与 PPT,用Python自动操作文件和文件夹、邮件、PDF 文件、图片、视频,用Python进行数据可视化分析及进行网页交互,借助ChatGPT轻松进阶Python办公自动化。 
            本书适合各层次的信息工作者,既可作为初学Python的入门指南,又可作为中、高级自动化办公用户的参考手册。书中大量的实例还适合读者直接在工作中借鉴。

    编辑推荐:

            借助ChatGPT与Python轻松实现办公自动化:Excel Home多位微软全球MVP专家打造,用大量实例介绍使用Python操作Excel、Word、PPT和日常办公中涉及的各种对象。让没有编程经验的普通办公人员也能驾驭Python,实现多个场景的办公自动化,提升工作效率!

    • 抽奖方式:评论区随机抽取3位小伙伴免费送出!
    • 参与方式:关注博主、点赞、收藏、评论区评论“人生苦短,拒绝内卷!”(切记要点赞+收藏,否则抽奖无效,每个人最多评论三次!
    • 活动截止时间:2023-09-28 20:00:00
    • 当当网购买链接http://product.dangdang.com/29566495.html

    • 京东网购买链接https://item.jd.com/13953308.html

     名单公布时间:2023-09-28 21:00:00   

    a17756265cb34b76964cdb85cda99811.png

     

  • 相关阅读:
    Mybatis练习
    “ BallEventsPersist“ app Tech Support(URL)
    【设计模式】【第二章】【业务投放场景】【责任链模式】
    用 AWTK 和 AWPLC 快速开发嵌入式应用程序 (3)- 定时器
    提问:为什么整数乘于0.01小数会变成很多小数?java+js
    SpringBoot 拦截器的使用
    计算机毕业设计 基于SSM的宿舍管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
    数据结构————广度寻路算法 Breadth First Search(广度优先算法)
    TCP协议的相关特性
    发展之路是怎么样? 防爆机器人的未来发展之路是怎么样
  • 原文地址:https://blog.csdn.net/m0_64336780/article/details/132266642