嵌套循环中的 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()
我试过:
- 使用原始工作簿对象(来自摘要代码)
- 在内部和所有变体中实例化一个新的工作簿对象
在每个循环外
- 以上两者相同 sheet object
- 上述设置和应用格式相同
您没有完全呈现 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()
我已经尝试了 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()
我试过:
- 使用原始工作簿对象(来自摘要代码)
- 在内部和所有变体中实例化一个新的工作簿对象 在每个循环外
- 以上两者相同 sheet object
- 上述设置和应用格式相同
您没有完全呈现 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()