2017-10-18 81 views
2

我正在使用python包openpyxl將數據寫入excel工作表。我有一個三列的excel文件。我將把數千行數據存入其中。我想要一種風格的特定格式的標題和其他風格的所有數據。我不想迭代所有單元格並專門設置樣式,因爲每當添加更多數據時,我都必須爲它們設置樣式。所以我想要創建一個excel模板,通過爲標題行應用'style1'和爲其餘行應用'style2',所以我不必爲他們的樣式打擾並轉儲數據。無論如何設置預定義預定義所有樣式到表?如何使用openpyxl將excel中的所有單元格格式化爲單一樣式?

+1

因爲這樣的文件格式的作品風格必須始終被應用到單個細胞。命名樣式提供了將相同樣式應用於多個單元格的最佳方法。 –

回答

1

提供一個示例,說明如何使用特定格式格式化一行,然後使用其他格式格式化其餘格。

請注意,您將不得不爲我以前工作的樣式調用保存的工作簿。也就是說,在這個例子中,我創建一個工作簿,保存它,然後加載它並格式化單元格,然後再次保存。

您可以在openpyxl docs section on styles中使用不同格式的一堆示例。

這是一個使用pandas_datareader模塊的數據的完全可重複的示例。

import pandas as pd 
from openpyxl import Workbook 
from openpyxl import load_workbook 
from openpyxl.styles import Font 
from openpyxl.utils.dataframe import dataframe_to_rows 
import pandas_datareader.data as web #optional for example only 

#pull in your own dataframe and remove the next two lines if you want to 
df = web.DataReader("AMZN", 'google') 
df = df.tail(180) 

wb = Workbook() 
ws = wb.active 

for r in dataframe_to_rows(df, index=False, header=True): 
    ws.append(r) 

wb.save("test.xlsx") 

wb = load_workbook('test.xlsx') 
ws = wb['Sheet'] 
style_1 = Font(color='0000FF00', bold=True, underline="single", size=15) 
style_2 = Font(color='000000FF', italic=True, size=10) 

for cell in ws["1:1"]: 
    cell.font = style_1 

for row in ws.iter_rows(min_row=2, max_col=5, max_row=len(df)+2): 
    for cell in row: 
     cell.font = style_2 

#commented out my original snippet - preferred method recommended by Charlie Clark is ws.iter_rows() - above 
''' 

for i in range(2, len(df)+2): 
    current = "%d:%d" % (i, i) 
    for cell in ws[current]: 
     cell.font = style_2 
''' 

wb.save("test.xlsx") 

Resulting Sheet

**更新(基於由OP詢問格式附加到現有工作表單元評論):

如果要添加更多的這種表以後,你可以做新細胞同時進行格式化。將以下代碼片段添加到原始答案中。

wb = load_workbook('test.xlsx') 
ws = wb['Sheet'] 
ws['A182'] = "New String" 

for cell in ws["182:182"]: 
    cell.font = style_1 
wb.save("test.xlsx") 

Third update to worksheet

+0

我會每天向這張表添加數據,所以每次我轉儲數據時,都應該再次爲這些單元應用樣式。很好的解決方法。但是當我創建這個表單並轉儲數據而不再打擾單元格樣式時,我想預先定義所有單元格。可能嗎 ? –

+0

我打算在答案中提供更新,希望能夠解決此評論。 – patrickjlong1

+1

當設計多個單元格時,我建議使用命名樣式。另外,嘗試避免使用'ws ['「%d:%d」%(i,i)]',並使用'ws.iter_rows()'或'ws.iter_cols()'代替。 –

相關問題