Python动态修改Word文档内容,保留格式样式,并批量生成PDF

Python动态修改Word文档内容,保留格式样式,并批量生成PDF

  • 前言
  • 一、需要安装的库
  • 二、核心逻辑-替换


前言

假如你有一个Word模版文档,要在里面填写人员信息,但人员有成百上千个,手动填起来太浪费时间,还容易弄错,刚好你又会写Python,请看下文


一、需要安装的库

  1. 操作word的库 docx
    pip install docx
  2. 转pdf的库 win32com,在python中是安装pywin32
    pip install pywin32

二、核心逻辑-替换

(1)获取需要填入的数据,大部分情况是Excel(用Pandas读取方便)或JSON
(2)在Word中需要填写的位置填上唯一标识的字符串(尽量短,比如我之前用NAME,结果被拆分成了N和AME),用代码打开Word,找到这个唯一标识的字符串,和原数据进行替换操作,重新保存即可
(3)转为PDF就很简单了

替换Word内容代码如下:

from docx import Document
import pandas as pd
import json

def replaceText(wb, t, value):
    for x in wb.paragraphs:
        if t in x.text:  # t 尽量短,一个最好,不然这里可能会被拆分 如果替换失败 DEBUG这里查看x.text
            inline = x.runs  # t 修改runs中的字符串 可以保留格式
            for i in range(len(inline)):
                if t in inline[i].text:
                    text = inline[i].text.replace(t, str(value))
                    inline[i].text = text

    for table in wb.tables:  # 遍历文档中的所有表格
        for row in table.rows:  # 遍历表格中的所有行
            for cell in row.cells:  # 遍历行中的所有单元格
                if t in cell.text:
                    for paragraph in cell.paragraphs:
                        if t in paragraph.text:
                            inline = paragraph.runs
                            for i in range(len(inline)):
                                if t in inline[i].text:
                                    text = inline[i].text.replace(t, str(value))
                                    inline[i].text = text

#  word表格居中:在字符串前面拼空格 这里的11是表格不换行的情况下最长可输入的字符数
def getCenterText(text):
    text = text.replace(' ', '')
    for i in range(11 - len(text)):
        text = " " + text
    return text

# 程序入口
if __name__ == '__main__':
    # loan_data = pd.read_excel(r"C:\Users\Administrator\Desktop\排名\汇总.xlsx",
    #                           sheet_name="Sheet1", header=0, names=None, index_col=0)
    # jsonstr = loan_data.to_json(orient='records', force_ascii=False)

    loan_data = [
        {"AME": "张三", "XX": "优秀"},
        {"AME": "李四", "XX": "良好"}
    ]

    for j in loan_data:
        wb = Document(r"C:\Users\Administrator\Desktop\排名\模版.docx")
        replaceText(wb, 'AME', j.get('AME'))  # 把Word中的AME替换成张三、李四
        replaceText(wb, 'XX', getCenterText(j.get('XX')))  # 如果是表格数据要居中
        wb.save(r"C:\Users\Administrator\Desktop\排名\结果(%s).docx" % j.get('AME'))
        print(j.get('AME'))
    print("完成")

转为PDF代码如下:

from win32com.client import Dispatch
from os import walk

wdFormatPDF = 17
def doc2pdf(input_file):
    word = Dispatch('Word.Application')
    doc = word.Documents.Open(input_file)
    doc.SaveAs(input_file.replace(".docx", ".pdf"), FileFormat=wdFormatPDF)
    doc.Close()
    word.Quit()

# 程序入口
if __name__ == '__main__':
    # 把此文件夹下所有的Word文档转为PDF
    directory = "C:\\Users\\Administrator\\Desktop\\排名"
    for root, dirs, filenames in walk(directory):
        for file in filenames:
            print(file)
            if file.endswith(".doc") or file.endswith(".docx"):
                doc2pdf(str(root + "\\" + file))
    print("全部完成")

你可能感兴趣的:(Python,python,代码操作Word)