这个项目起因也是解决错误率(摸鱼)驱使的,白天加晚上4个小时,一共耗费约8个小时;使用了ChatGPT3.5和Claude-instant的AI模型。从数据库拉取录入的结果,根据word模板生成对应的内容。请注意这个是批量性质!当然也可以从excel获取内容。这里我将分享两个方案。
1、从数据库获得数据。(excel也是一样的。)
2、将格式以一定的规则替换模板内的文字。
3、有几行数据,就生成几个独立的文件。
4、遍历转换pdf文件。
5、删除原有生成的word文件。
6、遍历所有的pdf文件,合并文件。
7、合并完成后,遍历删除所有单个的pdf文件。
[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]
[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]
这个思路也可以扩展为,给每个客户发送上月的对账单,且批量生成。待后续有时间在琢磨。