Python - Как предотвратить перезапись цикла в том же листе Excel - PullRequest
0 голосов
/ 12 июня 2018

Недавно я работал над своим небольшим проектом, который автоматически генерирует таблицы рабочих часов для меня.Это работает хорошо только для меня, но когда я хочу сгенерировать несколько рабочих листов (позже упоминаемых как листы) или создать несколько электронных таблиц, это перезаписывает старую.

Для открытия, редактирования и создания электронной таблицы я использую openpyxl lib.

Я пытался переместить сохраненную часть и создать часть вне циклов и т. Д., Но ничего из этого мне не помогло.

Вопрос в том, как запретить циклу перезаписывать файл, а не генерировать новый?

Ниже приведен основной фрагмент этого программного обеспечения.

cols = [2, 3, 4, 12]
row = 9
hrs = 0
nhrs = 0


for worker in workers:
    sheet.title = ('{} {}'.format(worker.name, worker.surename))
    for day, hday in itertools.zip_longest(days, holidays):
            if day.weekday() <= 4 and day not in holydays:
                sheet.cell(row=row, column=cols[0]).value = '08:00'
                sheet.cell(row=row, column=cols[1]).value = '16:00'
                sheet.cell(row=row, column=cols[2]).value = '8 h'
                hrs += 8
                row += 1
            elif day.weekday() > 4 and day not in holidays:
                sheet.cell(column=cols[0], row=row).value = ''
                row += 1
            elif day in holidays:
                sheet.cell(column=cols[3], row=row).value = '8 h'
                nhrs += 8
                row += 1

    sheet.cell(column=cols[2], row=40).value = str(hrs) + ' h'
    sheet.cell(column=cols[3], row=40).value = str(nhrs) + ' h'

workbook.save('SPREADSHEET_{}.xlsx'.format(native_month))
print('Done')

Заранее спасибо!


Редактировать из комментария:

# native_month for the workbook name is provided by this function applied to a 1-12 
def month_name_native(month): 
    months = ["Unknown", "Januar", "Februar", "Mart", "April", "Maj", "Jun", 
              "Jul", "August", "Septembar", "Oktobar", "Decembar" ] 
    return months[month].upper() 

1 Ответ

0 голосов
/ 12 июня 2018

Если я вас правильно понимаю, вы хотите для каждого работника новую электронную таблицу, верно?

То, что вы постоянно делаете, это то, что вы используете один и тот же объект листа снова и снова, поэтому он перезаписывается.Вы должны создать новый лист внутри цикла for для каждого работника.Это должно сделать:

cols = [2, 3, 4, 12]
row = 9
hrs = 0
nhrs = 0
workbook = Workbook()  # assuming you imported openpyxl with *, else adjust

for worker in workers:
    sheet = workbook.create_sheet('{} {}'.format(worker.name, worker.surename)) 
    for day, hday in itertools.zip_longest(days, holidays):
           if day.weekday() <= 4 and day not in holydays:
               sheet.cell(row=row, column=cols[0]).value = '08:00'
               sheet.cell(row=row, column=cols[1]).value = '16:00'
               sheet.cell(row=row, column=cols[2]).value = '8 h'
               hrs += 8
               row += 1
           elif day.weekday() > 4 and day not in holidays:
               sheet.cell(column=cols[0], row=row).value = ''
               row += 1
           elif day in holidays:
               sheet.cell(column=cols[3], row=row).value = '8 h'
               nhrs += 8
               row += 1

    sheet.cell(column=cols[2], row=40).value = str(hrs) + ' h'
    sheet.cell(column=cols[3], row=40).value = str(nhrs) + ' h'

workbook.save('SPREADSHEET_{}.xlsx'.format(native_month))
print('Done')
...