2013-06-26 1162 views
26

我被要求生成一些Excel報告。我目前對我的數據使用相當龐大的熊貓,所以很自然地我想使用pandas.ExcelWriter方法來生成這些報告。但是固定的列寬是一個問題。有沒有辦法使用pandas.ExcelWriter自動調整Excel列的寬度?

我到目前爲止的代碼很簡單。說我有一個名爲「DF」數據框:

writer = pd.ExcelWriter(excel_file_path) 
df.to_excel(writer, sheet_name="Summary") 

我一直在尋找在大熊貓代碼,我真的沒有看到任何選項來設置列寬。宇宙中是否有一個技巧可以使列自動適應數據?還是有事情後,我可以做xlsx文件來調整列寬?

(我用的是OpenPyXL庫,以及產生的.xlsx文件 - 如果有什麼差別)

謝謝。

+1

看起來並不可能在此刻,請打開一個問題,這增強GitHub上(和也許是公關?)。看起來不那麼難。 – Jeff

+0

謝謝傑夫,我已經提交了這個問題。我不確定是否有時間真的潛入熊貓代碼庫解決它,但你永遠不知道:) – badideas

+0

是的....看到你的問題.....如果你需要一些幫助的問題的評論! (本質上需要將一個可選參數傳遞給''to_excel'',也許''col_style = dict''包含col頭文件樣式元素(而不是默認的''header_style'',現在好像是硬編碼的 – Jeff

回答

15

有可能是沒有自動的方式去做的權利,但你用openpyxl,以下行(改編自另一個答案被用戶Bufkehow to do in manually)允許你指定一個理智的值(以字符寬度):

writer.sheets['Summary'].column_dimensions['A'].width = 15 
6

有一個很好的包,我開始使用最近稱爲StyleFrame。

它得到數據框,讓你很容易樣式吧...

默認列寬的自動調整。

例如:

from StyleFrame import StyleFrame 
import pandas as pd 

df = pd.DataFrame({'aaaaaaaaaaa': [1, 2, 3], 'bbbbbbbbb': [1, 1, 1], 'ccccccccccc': [2, 3, 4]}) 
excel_writer = StyleFrame.ExcelWriter('example.xlsx') 
sf = StyleFrame(df) 
sf.to_excel(excel_writer=excel_writer, row_to_add_filters=0, columns_and_rows_to_freeze='B2') 
excel_writer.save() 

,您還可以更改列寬:

sf.set_column_width(columns=['aaaaaaaaaaa', 'bbbbbbbbb'], width=35.3) 
5

我張貼這一點,因爲我只是碰到了同樣的問題,並發現了Xlsxwriter的官方文檔熊貓仍然將此功能列爲不受支持。我一起砍了解決方案,解決了我遇到的問題。我基本上只是遍歷每列,並使用worksheet.set_column設置列寬==該列的內容的最大長度。

但是,一個重要的注意事項。該解決方案不適合列標題,只是列值。這應該是一個簡單的改變,但如果你需要改頭換面。希望這可以幫助別人:)

import pandas as pd 
import sqlalchemy as sa 
import urllib 


read_server = 'serverName' 
read_database = 'databaseName' 

read_params = urllib.quote_plus("DRIVER={SQL Server};SERVER="+read_server+";DATABASE="+read_database+";TRUSTED_CONNECTION=Yes") 
read_engine = sa.create_engine("mssql+pyodbc:///?odbc_connect=%s" % read_params) 

#Output some SQL Server data into a dataframe 
my_sql_query = """ SELECT * FROM dbo.my_table """ 
my_dataframe = pd.read_sql_query(my_sql_query,con=read_engine) 

#Set destination directory to save excel. 
xlsFilepath = r'H:\my_project' + "\\" + 'my_file_name.xlsx' 
writer = pd.ExcelWriter(xlsFilepath, engine='xlsxwriter') 

#Write excel to file using pandas to_excel 
my_dataframe.to_excel(writer, startrow = 1, sheet_name='Sheet1', index=False) 

#Indicate workbook and worksheet for formatting 
workbook = writer.book 
worksheet = writer.sheets['Sheet1'] 

#Iterate through each column and set the width == the max length in that column. A padding length of 2 is also added. 
for i, col in enumerate(my_dataframe.columns): 
    # find length of column i 
    column_len = my_dataframe[col].astype(str).str.len().max() 
    # Setting the length if the column header is larger 
    # than the max column value length 
    column_len = max(column_len, len(col)) + 2 
    # set the column length 
    worksheet.set_column(i, i, column_len) 
writer.save() 
+0

好的解決方案。我喜歡你如何使用熊貓而不是其他軟件包。 – 2016-04-13 02:32:33

+0

此鏈接可能也有用:http://xlsxwriter.readthedocs.io/worksheet.html – Mahdi

7

通過上述user6178746的回答啓發,我有以下幾點:

# Given a dict of dataframes, for example: 
# dfs = {'gadgets': df_gadgets, 'widgets': df_widgets} 

writer = pd.ExcelWriter(filename, engine='xlsxwriter') 
for sheetname, df in dfs.items(): # loop through `dict` of dataframes 
    df.to_excel(writer, sheet_name=sheetname) # send df to writer 
    worksheet = writer.sheets[sheetname] # pull worksheet object 
    for idx, col in enumerate(df): # loop through all columns 
     series = df[col] 
     max_len = max((
      series.astype(str).map(len).max(), # len of largest item 
      len(str(series.name)) # len of column name/header 
      )) + 1 # adding a little extra space 
     worksheet.set_column(idx, idx, max_len) # set column width 
writer.save() 
+1

僅供參考:在我的情況下,我需要在「df.to_excel(...)」調用中使用「index = False」或者列數減1 – denvar

相關問題