Я добавляю данные в существующий предварительно отформатированный шаблон Excel. Проблема в том, что в зависимости от ввода пользователя размер данных может меняться и выходить за пределы доступных ячеек шаблона. Есть ли способ сделать так, чтобы, если размер данных превышает, скажем, 8 записей, новый лист добавлялся к предыдущему, а данные добавлялись на новый лист, а затем все это объединялось в PDF-файл в конце? ? Единственная часть, с которой у меня возникли проблемы, - это как сделать так, чтобы Python сохранял открытыми несколько экземпляров листа одновременно и только столько, сколько необходимо. Я использую Openpyxl, и это код, который я сейчас использую, который обрабатывает один лист Excel только до 8 строк.
# Open Template file
quotation = openpyxl.load_workbook("Path/Quotation_Template.xlsx")
sheet = quotation.active
# Add the product data to the quotation template and assign the cells to add data to
rows = sheet.iter_rows(
min_row=14, max_row=14 + 7, min_col=1, max_col=10
)
# Insert Data into Template by looping over rows and inserting data into corresponding columns
for i, row in enumerate(rows):
if i == len(product_data):
break
row[6].value = product_data["Quantity"][i]
if product_data["Description"][i] == None:
row[0].value = product_data["Product_Name"][i]
else:
row[0].value = product_data["Description"][i]
row[7].value = product_data["Price"][i]
row[8].value = product_data["Total"][i]
row[9].value = product_data["Product_Name"][I]
# Direct all information to the function that creates PDF from the single Excel sheet
submit_quotation_to_db(session["user_id"], quotation, sheet)






Вы можете попробовать код ниже.
Я составил случайные данные о продукте и установил num_rows_per_sheet = 3
В выходном файле result.xlsx вы видите 4 листа (один оригинал, 3 скопированные), и на каждом листе есть 3 строки.
import openpyxl
import pandas as pd
import math
# Open Template file
quotation = openpyxl.load_workbook("template.xlsx")
sheet = quotation.active
product_data = pd.DataFrame({
"Quantity": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
"Description": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
"Product_Name": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
"Price": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
"Total": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
})
num_rows_per_sheet = 3
min_row = 14
max_row = min_row + num_rows_per_sheet - 1
min_col = 1
max_col = 10
num_products = len(product_data)
num_sheets_to_copy = math.ceil(num_products / num_rows_per_sheet) - 1
sheets = [sheet]
for _ in range(num_sheets_to_copy):
ws = quotation.copy_worksheet(sheet)
sheets.append(ws)
# Insert Data into Template by looping over rows and inserting data into corresponding columns
for j in range(len(sheets)):
ws = sheets[j]
rows = ws.iter_rows(min_row=min_row, max_row=max_row, min_col=min_col, max_col=max_col)
for n, row in enumerate(rows):
i = j * num_rows_per_sheet + n
if i == len(product_data):
break
row[6].value = product_data["Quantity"][i]
if product_data["Description"][i] is None:
row[0].value = product_data["Product_Name"][i]
else:
row[0].value = product_data["Description"][i]
row[7].value = product_data["Price"][i]
row[8].value = product_data["Total"][i]
row[9].value = product_data["Product_Name"][i]
quotation.save('result.xlsx')
Вы можете использовать
new_ws = quotation.copy_worksheet(sheet), чтобы скопировать формат в листе шаблона.