Создание нескольких рабочих книг с помощью xlsxwriter в Django/Python
Я нахожусь в середине работы над функцией отчетности, которая будет разбивать отчеты на различные рабочие книги, затем застегивать файлы и рассылать их пользователям.
В это время я получаю успешную книгу для второй итерации, но первая итерация, похоже, отменяется/теряется, когда объект bytesIO повторно инициализируется на последующих итерациях.
def runPullReports():
sharedOrderFxs.sendEmail([], 'Starting..', "Running")
start = datetime.date(2022, 7, 7) #now
start += datetime.timedelta(2)#running sunday means we've already run tuesday labels
dateList = [start + datetime.timedelta(days=x) for x in range(4)]
food_programs = list(refModels.FoodProgram.objects.all().values_list('id', flat=True))
pack_list = ['HOT PACK', 'COLD PACK']
workBookList = []
SA = refModels.ServiceArea.objects.all()
for service_area in SA:
fileName = str(service_area.name) + '.xlsx'
output = BytesIO()
## Other Processing here irrelevant to the question
book.close()
output.seek(0)
# resetting BytesIO() buffer before we add workbooks to the list, since we're using BytesIO again in the generate_zip function
workBookList.append((fileName, output))
archive = generate_zip(workBookList)
dateRange = f'{dateList[0].month}-{dateList[0].day}_{dateList[-1]}'
#email send fnx sending archive.
Функция Zip/Email:
def generate_zip(files):
zip_buffer = BytesIO()
with zipfile.ZipFile(zip_buffer, "a", zipfile.ZIP_DEFLATED, False) as zip_file:
for fName, file in files:
zip_file.writestr(fName, file.read())
zip_file.close()
zip_buffer.seek(0)
return zip_buffer.getvalue()
Возможно, будет достаточно удалить output.seek(0)
из вашего while
цикла.
Нет причин для сброса созданного объекта BytesIO
, так как вы используете независимый new on в вашем generate_zip()
.
for service_area in SA:
fileName = str(service_area.name) + '.xlsx'
output = BytesIO()
## Other Processing here irrelevant to the question
book.close()
workBookList.append((fileName, output))