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