Создание нескольких рабочих книг с помощью 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))
Вернуться на верх