You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 13:50:11