在下周公子

  • 首页
  • 域名收藏
  • SEM搜索引擎营销
  • 操作系统
    • 服务器应用
  • 特色专题
    • 跑步运动
  • VPS主机推荐
  • 搜索
在下周公子
三十而立,学以致用
  1. 首页
  2. 我的记事本
  3. 正文

从SQL SERVER数据库查询列表获得数组,导入WORD模板转换为pdf文件,最后合并文件

2023年5月12日 1471点热度 0人点赞 0条评论

这个项目起因也是解决错误率(摸鱼)驱使的,白天加晚上4个小时,一共耗费约8个小时;使用了ChatGPT3.5和Claude-instant的AI模型。从数据库拉取录入的结果,根据word模板生成对应的内容。请注意这个是批量性质!当然也可以从excel获取内容。这里我将分享两个方案。

具体过程:

1、从数据库获得数据。(excel也是一样的。)

2、将格式以一定的规则替换模板内的文字。

3、有几行数据,就生成几个独立的文件。

4、遍历转换pdf文件。

5、删除原有生成的word文件。

6、遍历所有的pdf文件,合并文件。

7、合并完成后,遍历删除所有单个的pdf文件。

这个代码是适用SQL Server访问数据库生成

[python]
import docx
from docx import Document
import pandas as pd
import pyodbc
conn = pyodbc.connect('Driver={SQL Server Native Client 11.0};'
'Server=数据库IP;'
'Database=初始数据库名;'
'UID=用户;'
'PWD=密码;')
cursor = conn.cursor()
cursor.execute("SELECT wlmc,tm,CONVERT(VARCHAR(10),lrrq,23) AS lrrq FROM e_jc_jyjl WHERE khhth= 'SK-ZBA23050402' GROUP BY wlmc,tm,lrrq")
rows = cursor.fetchall()

# 指定Word模板文件
word_file_path = 'F:\\Python\\jyjl\\template3.docx' #指定的模板

# 定义列表
ColA = []
for row in rows:
ColA.append(row[0])

ColB = []
for row in rows:
ColB.append(row[1])

ColC = []
for row in rows:
ColC.append(row[2])

# 待替换变量和具体值
for i in range(len(ColA)):
# 复制Word模板
document = docx.Document(word_file_path)
replace_dict = {
'E-XXT8-L10-200-BR-M20-C': ColA[i],
'110850': ColB[i],
'SJRQ': ColC[i]

}
for paragraph in document.paragraphs:
for key, value in replace_dict.items():
if key in paragraph.text:
for run in paragraph.runs:
if key in run.text:
run.text = run.text.replace(key, value)

# 保存每个替换后的Word
new_file = f'F:\\Python\\jyjl\\output\\output{i + 1}.docx'
document.save(new_file)

# 合并多个Word文件
import os
import glob
from docx2pdf import convert
from PyPDF2 import PdfFileMerger

# 从word转换为pdf文件
docx_files = glob.glob('F:\\Python\\jyjl\\output\\output*.docx')
pdf_files = []
for docx_file in docx_files:
pdf_file = os.path.splitext(docx_file)[0] + '.pdf'
convert(docx_file, pdf_file)
pdf_files.append(pdf_file)

# 删除文件word
for file in docx_files:
os.remove(file)

#开始合并pdf文件
from PyPDF2 import PdfReader, PdfWriter
# 获取当前文件夹路径
cur_path = os.path.dirname(__file__)

# 使用 glob 获取文件列表
pdfFiles = glob.glob(os.path.join(cur_path,"F:\\Python\\jyjl\\output\\output*.pdf"))

# 创建一个列表,包含每个PDF文件的对象
pdfObjects = [PdfReader(open(fname, 'rb')) for fname in pdfFiles]

# 初始化PdfWriter对象,用于写入合并后的PDF
pdfWriter = PdfWriter()

# 循环每个PDF对象
for pdf in pdfObjects:

# 循环每个PDF对象中的页
for page in pdf.pages:
# 添加当前页到PdfWriter对象
pdfWriter.add_page(page)
# 关闭PDF文件
pdf.stream.close()
del pdf
# 用PdfWriter对象写入结果PDF
pdfWriter.write("F:\\Python\\jyjl\\output\\merged_output.pdf")

# 关闭每个输入文件
for pdf in pdfFiles:
os.remove(pdf)

#关闭数据库链接
cursor.close()
conn.close()

[/python]

这个是适用EXCEL获取数据生成

[python][/python]

import docx
from docx import Document
import pandas as pd

# 指定Word模板文件
word_file_path = 'F:\\Python\\jyjl\\template1.docx'

# 读取Excel文件数据
data = pd.read_excel('F:\\Python\\jyjl\\data.xlsx', 'Sheet1')

# 如果表头不是A,B列,需要修改为实际列名
ColA = 'A'
ColB = 'B'
ColC = 'C'

for i in range(data.shape[0]):

    # 复制Word模板
    document = docx.Document(word_file_path)

    # 待替换变量和具体值
    replace_dict = {
        'X-XXT8-L10-200-BR-M20-C': data.loc[i,ColA],
        '110850': str(data.loc[i, ColB]),
        '2023-03-20': str(data.loc[i, ColC])
    }

    for paragraph in document.paragraphs:
        for key, value in replace_dict.items():
            if key in paragraph.text:
                for run in paragraph.runs:
                    if key in run.text:
                        run.text = run.text.replace(key, value)

                        # 保存每个替换后的Word
    new_file = f'output{i + 1}.docx'
    document.save(new_file)

# 合并多个Word文件
import os
import glob
from docx2pdf import convert
from PyPDF2 import PdfFileMerger

# 从word文件转换为PDF文件
docx_files = glob.glob('output*.docx')
pdf_files = []
for docx_file in docx_files:
    pdf_file = os.path.splitext(docx_file)[0] + '.pdf'
    convert(docx_file, pdf_file)
    pdf_files.append(pdf_file)

# 删除文件word
for file in docx_files:
    os.remove(file)

#开始合并pdf文件
from PyPDF2 import PdfReader, PdfWriter
# 获取当前文件夹路径
cur_path = os.path.dirname(__file__)

# 使用 glob 获取文件列表
pdfFiles = glob.glob(os.path.join(cur_path,"output*.pdf"))

# 创建一个列表,包含每个PDF文件的对象
pdfObjects = [PdfReader(open(fname, 'rb')) for fname in pdfFiles]

# 初始化PdfWriter对象,用于写入合并后的PDF
pdfWriter = PdfWriter()

# 循环每个PDF对象
for pdf in pdfObjects:

    # 循环每个PDF对象中的页
    for page in pdf.pages:
        # 添加当前页到PdfWriter对象
        pdfWriter.add_page(page)
     # 关闭PDF文件
    pdf.stream.close()
    del pdf
# 用PdfWriter对象写入结果PDF
pdfWriter.write("merged_output.pdf")

# 关闭每个输入文件
for pdf in pdfFiles:
    os.remove(pdf)

[python][/python]

这里会用到多个库,提示缺那个库就安装那个库。另外如果是SQL server的数据源还需要设置OBDC访问。

这个思路也可以扩展为,给每个客户发送上月的对账单,且批量生成。待后续有时间在琢磨。

标签: 暂无
最后更新:2023年5月12日

zhou

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

COPYRIGHT © 2021 zhoubin.net. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

浙ICP备09065757号-10