2017-10-13 270 views
2

我正在使用pandas和xlsxwriter将许多数据框导出并格式化为Excel。熊猫:如何在导出到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以外的引擎?也许某种方式将数据框导出为ex​​cel后应用格式化?

不管我以后格式化第一列还是列,或反之亦然,它们都没有区别。

它没有在下面的例子中显示,但在我的代码中,我导出了一些数据框,所有列都相同,到同一个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() 

回答

1

在这种情况下,您将需要创建另一种格式,该格式是行和列格式的组合并将其应用于单元格。

为了做到这一点,您需要遍历数据框并直接调用XlsxWriter,而不是使用Pandas-Excel界面。

或者,您可以使用OpenPyXL作为熊猫Excel引擎。最近版本的Pandas界面增加了在使用OpenPyXL编写数据框后向Excel数据添加格式的功能。

+0

所以,如果我理解正确,你的意思是,我需要应用逐格格式化单元格?换句话说,没有办法只是说:列B在%,第2行以粗体显示,并且B2以粗体和百分比表示,如果我要在Excel中手动打开文件,我会这样做吗? 相反,我需要想出一个脚本,其中设置:B2:粗体和%,C2仅粗体,B3:仅限于%等 此外,当您说迭代时,是指迭代应用格式,或不是依靠to_excel()方法,而是通过单元格写入数据框? –

+0

你说OpenPyXL可以让你在写入数据框后添加格式,但是我已经在使用XlsxWriter来做这件事了,所以我有点困惑。使用以xlsxwriter作为引擎的to_excel()方法将数据框导出为ex​​cel,然后使用set_format()和set_column将格式应用于已导出到Excel的数据框。 –

+0

PS或者也许我可以使用win32com模块从Python内控制Excel?Basiclaly我想要的是模仿手动使用Excel时发生的情况,即添加,而不是替换格式。 –

2

作为@jmcnamara笔记openpyxl提供了不同的格式化选项,因为它允许您基本上处理工作表中的数据框。 NB。 openpyxl不支持行或列格式。

openpyxl dataframe_to_rows()函数将数据帧转换为值的生成器,逐行地允许您应用任何格式化或额外的处理。

+0

谢谢。也许这是我的,但这些观点在openpyxl和xlsxwriter的文档中都不完全清楚。 具体而言,我发现误导说优先级与Excel一样,因为在Excel中,您可以在不删除现有格式的情况下应用格式化。如果列B的格式设置为%,则可以选择第2行,将其设为粗体,并且B2将以粗体显示并以%显示。你不能用这些软件包来做到这一点,所以,不,他们不模仿Excel –

+0

我需要看看win32com模块。重新格式化每一个单元格将是一个痛苦。我希望我可以导出到Excel,并使用xlsxwriter应用列格式,然后重新打开相同的文件并应用win32com的行格式。 –

+0

无论你做什么,格式都是**总是**逐个单元格; Excel建议的行和列格式是误导性的。 win32com很慢,最好使用xlwings,但在openpyxl中命名的风格很快。 –