使用xlsxwriter为行中包含的内容着色,但不将颜色锁定为该行号吗?

时间:2019-03-25 21:34:59

标签: python excel pandas xlsxwriter

我将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解决了我的问题。但是后来我遇到了一个问题,即颜色会停留在正确的行上,而其他格式(如字体大小和文本换行)却不会,因此我还必须在黄色格式对象的定义中包括这些内容。

1 个答案:

答案 0 :(得分:0)

我认为您最后不需要循环。 假设您的“也许”条件位于A列中,而您要染成黄色的数据位于B列中。 您只需要这样编写无循环的条件格式:

worksheet.conditional_format('B1:B5', {'type': 'formula',
                                           'criteria': '=$A1="maybe"',
                                           'format': yellow})