Форматирование XlsxWriter во вложенном цикле - PullRequest
0 голосов
/ 07 апреля 2019

Я перепробовал все мыслимые комбинации из https://xlsxwriter.readthedocs.io/format.html и любой ответ о переполнении стека, который я нашел, связанный с ним.

99,99% вероятность, что это что-то простое, потому что это обычно причина, по которой я зашел в тупик.

Я записываю сводку на первый лист и перебираю подсказки df, чтобы записать число df на отдельные листы (это прекрасно работает)

Я могу применять числовые форматы к сводке, но не в цикле.

writer = ExcelWriter('Players ' + str(date.datetime.now().strftime("%d-%m-%Y %H;%M;%S")) +'.xlsx', engine='xlsxwriter')
summary.to_excel(writer,'Summary',index=False)
workbook  = writer.book
worksheet = writer.sheets['Summary']
format1 = workbook.add_format({'num_format': '0.000'})
worksheet.set_column('A:A', 15)
worksheet.set_column('B:B', 15)
worksheet.set_column('C:C', 6, format1)
worksheet.set_column('D:D', 15)
worksheet.conditional_format('C2:C100', {'type': '3_color_scale',
                                         'min_color': "green",
                                         'mid_color': "yellow",
                                         'max_color': "red"})
#Above works
#below doesn't format

#loop through summary and players individual tables
#write an individual table to excel if score > 0
for index, row in summary.iterrows():
    for tbl in player_df_dict:
        if (row['Player_1'] == tbl[0]) & (row['Player_2'] == tbl[1]) & (row['Score']>0):
            player_df_dict[tbl].to_excel(writer,str(tbl[0])+" and "+str(tbl[1]),index=False, columns=cols)
            worksheet = writer.sheets[str(tbl[0])+" and "+str(tbl[1])]
            #format2 = workbook.add_format({'num_format': '0.000'})
            #worksheet.set_column('D:D', 20, format1)
            #worksheet.set_column('D:D', 20, format2)

writer.save()

Я пробовал:

  • с использованием исходного объекта книги (из сводного кода)
  • создание нового объекта книги во всех вариациях внутри и вне каждой петли
  • то же самое для обоих выше с объектом листа
  • одинаково для обоих выше с настройкой и применением формата

1 Ответ

2 голосов
/ 08 апреля 2019

Вы точно не представили mcve

Все, что я могу вам сказать, это то, что настройка столбца работает; Я также делаю это двумя немного разными способами (ваш + с использованием writer.sheets[tabname], т.е. без создания явной переменной для рабочего листа.

В моем примере ниже форматирование применяется в обоих случаях.

Также определите форматирование вне цикла - это атрибут книги, а не листа.

Приведенный ниже код создает фрейм данных случайных чисел с плавающей запятой, экспортирует его в excel и форматирует столбцы B и C - помните, что столбец Python 0 - это столбец A)

import numpy as np
import pandas as pd

writer =pd.ExcelWriter('xlsx_test.xlsx')
format_1 = writer.book.add_format({'num_format': '0.000'})
for i in range(3):
    tabname = str(i)
    pd.DataFrame(np.random.rand(10,4) ).to_excel(writer, tabname)
    writer.sheets[tabname].set_column(1,2, None, format_1)

for i in ["a","b"]:
    tabname = i
    pd.DataFrame(np.random.rand(10,4) ).to_excel(writer, tabname)
    ws = writer.sheets[i]
    ws.set_column(1,2, None, format_1)

writer.close()
...