2013-06-26 5 views
26

मुझे कुछ एक्सेल रिपोर्ट जेनरेट करने के लिए कहा जा रहा है। मैं वर्तमान में अपने डेटा के लिए पांडा का उपयोग कर रहा हूं, इसलिए स्वाभाविक रूप से मैं इन रिपोर्टों को उत्पन्न करने के लिए पांडा का उपयोग करना चाहता हूं। एक्सेलवाइटर विधि। हालांकि निश्चित कॉलम चौड़ाई एक समस्या है।क्या pandas.ExcelWriter के साथ Excel कॉलम चौड़ाई स्वत: समायोजित करने का कोई तरीका है?

मेरे पास अब तक का कोड काफी आसान है। मैं एक dataframe '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'' जिसमें कॉल हेडर स्टाइल तत्व हों (डिफ़ॉल्ट '' header_style'' की बजाय जो अब हार्ड कोड को – Jeff

उत्तर

15

शायद यह अभी ऐसा करने के लिए कोई स्वत: तरीका है, लेकिन जैसा कि आप openpyxl का उपयोग करें, निम्न पंक्ति (how to do in manually पर उपयोगकर्ता Bufke द्वारा एक और उत्तर से रूपांतरित) (चरित्र चौड़ाई में) आप एक समझदार मूल्य निर्दिष्ट कर सकते हैं:

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

एक अच्छा पैकेज है जिसे मैंने हाल ही में स्टाइलफ्रेम कहा है।

यह DataFrame हो जाता है और आप बहुत आसानी से यह शैली की सुविधा देता है ...

डिफ़ॉल्ट स्तंभ चौड़ाई द्वारा ऑटो समायोजन है।

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 के लिए आधिकारिक दस्तावेज और पांडा में अभी भी यह कार्यक्षमता असमर्थित के रूप में सूचीबद्ध है। मैंने एक ऐसे समाधान को हैक किया जिसने मुझे जो मुद्दा उठाया था उसे हल किया। मैं मूल रूप से बस प्रत्येक कॉलम के माध्यम से पुनरावृत्ति करता हूं और कॉलम चौड़ाई == उस कॉलम की सामग्री की अधिकतम लंबाई सेट करने के लिए वर्कशीट.सेट_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

अच्छा समाधान।मुझे पसंद है कि आपने दूसरे पैकेज के बजाय पांडा का इस्तेमाल कैसे किया। –

+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

FYI: मेरे मामले में मुझे "df.to_excel (...)" कॉल में "index = False" का उपयोग करने की आवश्यकता है, या फिर कॉलम 1 से बंद थे – denvar

संबंधित मुद्दे