2013-06-26 1164 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

相关问题