Pandas:如何在导出到Excel时格式化行和列(以行格式为优先)?

3
我正在使用pandas和xlsxwriter将多个数据框导出并格式化到Excel中。
xlsxwriter文档提到: http://xlsxwriter.readthedocs.io/worksheet.html?highlight=set_column
A row format takes precedence over a default column format

优先级指的是,如果您将B列格式设置为百分比,然后将第2行设置为粗体,单元格B2将不会以粗体和百分比的形式呈现-它只会以粗体的形式呈现,但不包含百分比!

我在下面提供了一个示例。有没有什么方法可以解决这个问题?也许有其他引擎可以使用,而不是xlsxwriter?也许有一些方法可以在将数据框导出到Excel之后应用格式?

无论我是先格式化行还是先格式化列都没有区别。

在下面的示例中没有显示,但在我的代码中,我将许多具有相同列的数据框导出到同一个Excel表格中。这些数据框相当于Excel数据透视表,在底部有一个“总计”行。我希望标题行和总计行都是粗体,并且每个列根据数据具有特定的格式(百分比、千位分隔符、百万等)。以下是示例代码:

import pandas as pd

writer = pd.ExcelWriter('test.xlsx')
wk = writer.book.add_worksheet('Test')

fmt_bold = writer.book.add_format({'bold':True})
fmt_pct = writer.book.add_format({'num_format': '0.0%'})

wk.write(1,1,1)
wk.write(2,1,2)

wk.set_column(1,1, None, fmt_pct)
wk.set_row(1,None, fmt_bold)

writer.close()
2个回答

2
如@jmcnamara所指出,openpyxl提供不同的格式选项,因为它允许您在工作表内部处理数据帧。注意:openpyxl不支持行或列格式。
openpyxl的"dataframe_to_rows()"函数将数据帧转换为逐行值的生成器,允许您应用任何格式或其他处理。

谢谢。也许是我自己的问题,但是在openpyxl和xlsxwriter的文档中,这些点并不是很清晰明了。 具体来说,我认为将优先级描述为类似于Excel是有误导性的,因为在Excel中,您可以应用格式而不删除现有格式,例如,如果将B列格式化为%,则可以选择第2行,使其加粗,那么B2将是加粗的且仍然是%。但是,使用这些软件包时无法做到这一点,因此,不,它们并不模仿Excel。 - Pythonista anonymous
我需要研究win32com模块。一个一个重新格式化每个单元格会很麻烦。我希望能够使用xlsxwriter将数据导出到Excel并应用列格式,然后重新打开同一文件并使用win32com应用行格式。 - Pythonista anonymous
无论如何,格式化始终是逐个单元格进行的;Excel建议的行和列格式可能会误导。win32com速度较慢,最好使用xlwings,但openpyxl中的命名样式很快。 - Charlie Clark

1
在这种情况下,您需要创建另一种格式,该格式是行和列格式的组合,并将其应用于单元格。
为了做到这一点,您需要遍历数据框并直接调用XlsxWriter,而不是使用Pandas-Excel接口。
或者,您可以使用OpenPyXL作为pandas Excel引擎来完成。当使用OpenPyXL时,最近版本的Pandas接口添加了在写入数据框后向Excel数据添加格式的功能。

所以,如果我理解正确,你的意思是说,我需要逐个单元格地应用格式?换句话说,没有办法只是说:B列为%,第2行为粗体,并且让B2成为粗体和%,就像我手动在Excel中打开文件时所做的那样? 相反,我需要编写一个脚本来设置:B2:粗体和%,C2仅为粗体,B3:仅为%,等等。此外,当你说迭代时,是指迭代应用格式,还是逐个单元格地编写数据框,而不是依赖于to_excel()方法? - Pythonista anonymous
你说OpenPyXL可以在写入数据框后添加格式,但我已经用XlsxWriter做到了这一点,所以有点困惑。我使用to_excel()方法将数据框导出到Excel,引擎为xlsxwriter,然后使用set_format()和set_column来对已经导出到Excel的数据框应用格式。 - Pythonista anonymous
“我需要逐个单元格地应用格式吗?”是的。“没有办法只是说…”没错。“你的意思是迭代应用格式,还是逐个单元格编写数据框?”是的,如果你想使用XlsxWriter,你需要逐个单元格地编写数据。 - jmcnamara
1
"...但是我已经使用XlsxWriter在做这件事情了,所以有点困惑。" OpenPyXL允许您单独为单元格添加格式,而不需要同时写入数据。XlsxWriter则不行,必须同时写入数据和格式。请参见Pandas Excel样式文档。" - jmcnamara
换句话说,OpenPyXL可以格式化它没有写入的数据,而XlsxWriter则不能。这是正确的吗? - Pythonista anonymous
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接