嵌套循环中的 XlsxWriter 格式化

XlsxWriter formatting in nested loop

我已经尝试了 https://xlsxwriter.readthedocs.io/format.html 中所有可以想象的组合以及我能找到的任何 Stack Overflow 答案。

99.99% 的可能性是简单的事情,因为这些通常是我走入死胡同的原因。

我正在为第一个 sheet 写一个摘要,并循环遍历 df 的字典以编写多个 df 来分隔 sheets(这很好用)

我可以对摘要应用数字格式,但不能在循环中应用。

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()

我试过:

您没有完全呈现 mcve

我只能告诉你,设置列是有效的;我也用两种稍微不同的方式来做这件事(你的+使用 writer.sheets[tabname] ,即没有为工作sheet.

创建显式变量

在我下面的示例中,两种情况都应用了格式设置。

此外,在循环外定义格式 - 这是书的属性,而不是 sheet。

下面的代码创建了一个随机浮点数的数据帧,将其导出到 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()