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

问题描述 投票:1回答:1

我正在使用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解决了我的问题。但后来我遇到了一个问题,颜色会粘在正确的行上,但其他格式如字体大小和文本换行不会,所以我也必须在我的黄色格式对象的定义中包含这些。

python excel pandas xlsxwriter
1个回答
0
投票

我想你最后不需要循环。假设您的“可能”标准位于A列内,而您想要染成黄色的数据位于B列中。您只需编写条件格式而不使用循环,如下所示:

worksheet.conditional_format('B1:B5', {'type': 'formula',
                                           'criteria': '=$A1="maybe"',
                                           'format': yellow})
© www.soinside.com 2019 - 2024. All rights reserved.