我将python和pandas和xlsxwriter模块一起使用来格式化动态生成的Excel文件。我需要将某些行的颜色设置为黄色,具体取决于一列的内容。这是我的代码(“数据”是一个熊猫DataFrame,其中每一行代表一个人)。寻找#注释,将您指向我正在谈论的相关代码:
def format_excel(data):
writer = pd.ExcelWriter('InviteList.xlsx', engine='xlsxwriter')
data.style.to_excel(writer, sheet_name='Sheet1', startrow=1, header=False, index=False)
workbook = writer.book
worksheet = writer.sheets['Sheet1']
# Styles
yellow = workbook.add_format({'bg_color': '#fdf2d0', 'border': 1, 'border_color': '#C0C0C0'})
# Hacky bypass of default header style that pandas imposes
for idx, val in enumerate(data.columns):
worksheet.write(0, idx, val)
# THIS IS THE RELEVANT CODE
for row, employee in data.iterrows():
if data.loc[row, 'rsvp'] == 'maybe':
worksheet.conditional_format(row + 1, 0, row + 1, 15, {'type': 'no_errors', 'format': yellow})
writer.save()
因此,基本上,for循环会检查该行是否在“ rsvp”列中包含“ maybe”,如果是,则在该行上使用黄色格式对象。效果很好,但是...
比方说,第4行和第7行在我的Excel工作表中显示为黄色。现在,如果我选择一列并按字母顺序或类似的方式对该列进行排序,则在第4行和第7行中显示黄色格式的STAYS,而不是MOVING及其所需的内容。
因此,当我需要使其更具动态性时,看起来我的实现将其永久锁定为黄色格式的第4行和第7行:它应坚持在“ rsvp”列中包含“ maybe”的行,否不管我把它们移到哪里。
编辑:
好的,我通过使用worksheet.set_row
而不是worksheet.conditional_format
解决了我的问题。但是后来我遇到了一个问题,即颜色会停留在正确的行上,而其他格式(如字体大小和文本换行)却不会,因此我还必须在黄色格式对象的定义中包括这些内容。
答案 0 :(得分:0)
我认为您最后不需要循环。 假设您的“也许”条件位于A列中,而您要染成黄色的数据位于B列中。 您只需要这样编写无循环的条件格式:
worksheet.conditional_format('B1:B5', {'type': 'formula',
'criteria': '=$A1="maybe"',
'format': yellow})