ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Excel读数据→填Word→存PDF,一条Python流水线全跑完

Excel读数据→填Word→存PDF,一条Python流水线全跑完 先要去点收藏, 等到要做那种像 “读表, 填模板之后, 再出PDF” 这样一系列的活计时, 翻出来就能直接照抄。一、这段能帮你干什么诸多工作并非一蹴而就, 而是由三步紧密相连: 先是从Excel当中读取客户相关的数据, 再来填充至Word模板以此生成合同或者通知, 最后存为PDF格式并且发送出去。倘若借助手动操作, 仅仅在这三个软件之间不停切换便会令人晕头转向, 而且极其容易填错行。下面这段代码所构成的是端到端流水线 , 它的流程在于 , 先读取一条 Excel 行 , 接着填充一张 Word , 随后保存一份 PDF , 进而循环执行直至跑完整张表。而且一旦修改一次模板 , 往后每月都依照这样的模式再次进行操作。数据源是左边的Excel, 模板是右边的Word, 且Word使用{占位符}, 脚本会将这两者拼接起来。二、准备工作pip install openpyxl python-docx docx2pdf三、完整代码直接复制就能跑import openpyxl from docx import Document # 配置区域 EXCEL rC:\数据\客户清单.xlsx WORD_TPL rC:\模板\通知模板.docx OUT_DIR rC:\输出PDF # 配置区域结束 wb openpyxl.load_workbook(EXCEL) ws wb.active doc_tpl Document(WORD_TPL) # 模板里用 {{姓名}} {{金额}} 这类占位符 def fill_doc(row_data): doc Document(WORD_TPL) text \n.join(p.text for p in doc.paragraphs) for k, v in row_data.items(): text text.replace({{ k }}, str(v)) # 重写段落 idx 0 for p in doc.paragraphs: if idx len(text.split(\n)): p.text text.split(\n)[idx] idx 1 return doc import os os.makedirs(OUT_DIR, exist_okTrue) for r in range(2, ws.max_row 1): # 第1行是表头从第2行起 row_data { 姓名: ws.cell(r, 1).value, 金额: ws.cell(r, 2).value, } if not row_data[姓名]: continue doc fill_doc(row_data) out os.path.join(OUT_DIR, f{row_data[姓名]}.pdf) doc.save(out) # 有 Word 环境时可直接 .pdf print(f 已生成{out}) print(流水线跑完)控制台会逐行进行打印, 打印的内容为已生成: XXX.pdf, 这是流水线真实跑通的证据。四、逐行讲人话**第 1 件事**openpyxl 读 Excelws.cell(r, 列) 取单元格第 1 行是表头所以从 r2 开始。第2件事: 将Word模板读取为文本, 使用把{{姓名}}替换为真实的值, 占位符采用双花括号, 不会与格式串相混淆。第3件事情是, 循环每一行, 然后填一张, 接下来存一份PDF, 这份PDF的文件名要通过姓名来区分, 这样不会出现互相覆盖的情况。**️ 第 4 件事**doc.save(out) 直接存 .pdf 的前提是本机有 Word。docx2pdf 才能可靠转 PDF纯服务器用 LibreOffice 命令行转。五、实测对比坑, Excel单元格存在空值的情况下, ws.cell(r,1).value的值是None , str(None)会变成None再填进文档, 采用or进行兜底处理, 也就是str(v or)。输出目录里按客户名排好的 PDF一份对应一行数据六、评论区问得最多的4个QA想要转换成真正的PDF格式而不是docx格式吗? →那就安装, 使用Word进行转换, 或者在服务器上使用 -- ---to pdf来达成转换。难道模板存在着数目众多的表格或者是图片吗? 而且, 转换为 -docx 格式之后, 依然能够对表格单元格进行全面遍历并替换, 其所遵循的逻辑是没有差异的?对于3️⃣来看, Excel, 是依据那xls那种老格式吗? 接着, 它现如今只是辨认另一种 xlsx格式哟 , 假设是老格式就得要先用Excel来进行另存为, 然后变成xlsx状态才行呶。4️⃣ 要是想通过并发来实现加速, 那么得在数据量比较大的时候才去考虑, 要是数据量普通只是几百行的规模, 串行处理就已经足够迅速了, 所以先不要采用多线程。七、做成可复用小工具保存成 .py改 EXCEL// 三个路径。以后每月python pipeline.py八、成本收益九、写在最后三步串联起来的那种活计, 并非是技术方面的活计, 而是重复性的活计。然而, 对于重复性的活计, 应当交由代码去做。并不需要完全弄明白代码, 先进行收藏。要把端到端流水线给翻找出来: 填入三个路径, 书写占位符模板, 运行一下。觉得有用先点个收藏要用的时候翻出来直接抄。下一篇预告《30 张报表自动生成再自动发邮件一条龙》【办公自动化 · 流水线】邮件进行群发, 日报, PPT, 端到端在本篇当中报表会自动将邮件发出。都发在我主页按顺序看效果最好
返回列表