2017-10-13 239 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中命名的風格很快。 –