我正在使用python和pandas以及xlsxwriter模块来格式化动态生成的excel文件。我需要将某些行涂成黄色,具体取决于一列的内容。这是我的代码(“data”是一个pandas DataFrame,其中每行代表一个人)。查找#comment,指出我正在谈论的相关代码:
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
解决了我的问题。但后来我遇到了一个问题,颜色会粘在正确的行上,但其他格式如字体大小和文本换行不会,所以我也必须在我的黄色格式对象的定义中包含这些。
我想你最后不需要循环。假设您的“可能”标准位于A列内,而您想要染成黄色的数据位于B列中。您只需编写条件格式而不使用循环,如下所示:
worksheet.conditional_format('B1:B5', {'type': 'formula',
'criteria': '=$A1="maybe"',
'format': yellow})