基于Python根据数据量动态插入数据至多个Excel工作表
解决Excel模板追加数据超量时自动新增工作表并合并为PDF的问题
核心方案
- 根据总数据量计算所需工作表数:每8条数据占用一个工作表,用向上取整得到总数
- 基于原模板工作表复制出新表,完整保留预格式化样式
- 分批次将数据写入对应工作表,每个表最多处理8条数据
- 最后批量生成PDF并合并为单个文件
完整代码实现
import openpyxl import math from PyPDF2 import PdfMerger # 用于合并PDF,需提前安装:pip install PyPDF2 # 加载模板文件 quotation = openpyxl.load_workbook("Path/Quotation_Template.xlsx") template_sheet = quotation.active total_products = len(product_data["Quantity"]) # 计算需要的工作表数量:不足8条数据也单独占一个表 num_sheets = math.ceil(total_products / 8) sheets = [] # 复制模板生成所需工作表 for i in range(num_sheets): if i == 0: # 第一个表直接复用原模板,重命名避免重复 sheet = template_sheet sheet.title = f"Quotation_{i+1}" else: # 复制模板表,保留所有格式样式 sheet = quotation.copy_worksheet(template_sheet) sheet.title = f"Quotation_{i+1}" sheets.append(sheet) # 分批次写入数据到各工作表 for sheet_idx, sheet in enumerate(sheets): # 确定当前工作表处理的数据区间 start_idx = sheet_idx * 8 end_idx = min((sheet_idx + 1) * 8, total_products) # 截取当前批次的数据 batch_data = { "Quantity": product_data["Quantity"][start_idx:end_idx], "Description": product_data["Description"][start_idx:end_idx], "Product_Name": product_data["Product_Name"][start_idx:end_idx], "Price": product_data["Price"][start_idx:end_idx], "Total": product_data["Total"][start_idx:end_idx] } # 获取当前表的可写入行范围(和原代码一致:14到21行) rows = sheet.iter_rows(min_row=14, max_row=14 + 7, min_col=1, max_col=10) # 写入数据 for i, row in enumerate(rows): if i >= len(batch_data["Quantity"]): break # 数据写完就停止,避免空行写入 # 填充数量 row[6].value = batch_data["Quantity"][i] # 填充产品名称/描述 if batch_data["Description"][i] is None: row[0].value = batch_data["Product_Name"][i] else: row[0].value = batch_data["Description"][i] # 填充单价、总价、产品名称(修正原代码大写I为小写i的笔误) row[7].value = batch_data["Price"][i] row[8].value = batch_data["Total"][i] row[9].value = batch_data["Product_Name"][i] # 处理PDF生成与合并 # 1. 为每个工作表生成单独PDF(需调整submit_quotation_to_db支持指定输出路径) pdf_paths = [] for idx, sheet in enumerate(sheets): pdf_path = f"Quotation_{idx+1}.pdf" submit_quotation_to_db(session["user_id"], quotation, sheet, pdf_path) pdf_paths.append(pdf_path) # 2. 合并所有PDF为单个文件 merger = PdfMerger() for path in pdf_paths: merger.append(path) merger.write("Final_Combined_Quotation.pdf") merger.close() # 可选:保存修改后的多表Excel文件 quotation.save("Path/Updated_MultiSheet_Quotation.xlsx")
关键说明
- 复制工作表:使用
copy_worksheet方法复制原模板,能完整保留单元格格式、样式等预设置,避免新建空白表丢失模板样式 - 数据分批次:通过
start_idx和end_idx切割数据,确保每个工作表只处理对应区间的8条(或剩余)数据 - 笔误修正:原代码中
row[9].value = product_data["Product_Name"][I]的大写I是错误,需改为小写i - PDF合并:如果原
submit_quotation_to_db不支持指定PDF输出路径,需调整函数参数,使其能生成单独的PDF文件后再合并
内容的提问来源于stack exchange,提问作者Mohamed Amr
相关产品推荐
相关产品推荐

