Python Xlsxwriter - 行格式覆盖列格式

Python Xlsxwriter - Row format overwrites column format

我在 pandas 数据框中有数据。我需要不同的列具有不同的对齐方式(一些居中,一些 left-aligned)。在 headers 列中写入后,我使用以下方法设置每列的格式:

centered = workbook.add_format()
centered.set_align('center')

right = workbook.add_format()
right.set_align('right')

left = workbook.add_format()
left.set_align('left')

cols = len(df.columns))

worksheet.set_column(1, 1, cell_format = left)
worksheet.set_column(2, 2, cell_format = centered)
worksheet.set_column(3, 3, cell_format = right)

然后我遍历我的 df 中的行并在 using 中写入每一行:

for index, row in df.iterrows():
    worksheet.write_row(index, 1, list(row))

这让我得到了这个结果:

现在我想突出显示“右”列值为 1 的每一行数据。

为此,我创建了一个新格式 object 并将数据写入修改为:


highlight_format = workbook.add_format()
highlight_format.set_fg_color('#f0e5ec')

for index, row in df.iterrows():
    if row['Right'] == 1:
        worksheet.write_row(index, 1, list(row), cell_format = highlight_format)
    else:
        worksheet.write_row(index, 1, list(row))

这是结果:

就好像新格式覆盖旧格式一样。我怎样才能保留旧格式,只添加新格式(仅突出显示)?

这是期望的结果:

如果您在 Excel 中在运行时叠加行和列格式,那么它将创建第三种格式,该格式是行和列格式的组合,并将其应用于交叉点中的单元格。

XlsxWriter 不会像那样自动创建和应用新格式,因此如果您希望使用两种组合格式的属性设置单元格格式,则需要显式创建该格式并将其应用于相关单元格。这需要一些逻辑和工作,但没有简单的解决方法。

但是,在这种特殊情况下,您可以应用 conditional format 来突出显示基于 C 列中的值的行(这似乎是您正在尝试做的)。

更新,这里有一个条件格式的例子:

import random
import xlsxwriter

workbook = xlsxwriter.Workbook('test.xlsx')
worksheet = workbook.add_worksheet()

centered = workbook.add_format()
centered.set_align('center')

right = workbook.add_format()
right.set_align('right')

left = workbook.add_format()
left.set_align('left')

highlight_format = workbook.add_format({'bg_color': '#FFC7CE',
                                        'font_color': '#9C0006'})

worksheet.set_column(0, 0, cell_format = left)
worksheet.set_column(1, 1, cell_format = centered)
worksheet.set_column(2, 2, cell_format = right)

# Simulate the data.
for row_num in range(9):
    worksheet.write(row_num, 0, 'Data')
    worksheet.write(row_num, 1, 'Data')
    worksheet.write(row_num, 2, random.choice(('Y', 'N')))

# Add a conditional format.
worksheet.conditional_format(0, 0, 8, 2, {'type':     'formula',
                                          'criteria': '=$C1="Y"',
                                          'format':   highlight_format})

workbook.close()

输出: