Ich werde gebeten, einige Excel-Berichte zu erstellen. Ich verwende derzeit ziemlich häufig Pandas für meine Daten, daher möchte ich natürlich die pandas.ExcelWriter-Methode verwenden, um diese Berichte zu generieren. Die festen Spaltenbreiten sind jedoch ein Problem.
Der Code, den ich bisher habe, ist einfach genug. Angenommen, ich habe einen Datenrahmen mit dem Namen 'df':
writer = pd.ExcelWriter(excel_file_path, engine='openpyxl')
df.to_excel(writer, sheet_name="Summary")
Ich habe den Pandas-Code durchgesehen und sehe keine Optionen zum Festlegen der Spaltenbreite. Gibt es da draußen im Universum einen Trick, um die Spalten automatisch an die Daten anzupassen? Oder kann ich nachträglich etwas an der xlsx-Datei tun, um die Spaltenbreiten anzupassen?
(Ich verwende die OpenPyXL-Bibliothek und generiere XLSX-Dateien - wenn das einen Unterschied macht.)
Danke dir.
to_excel
, das möglicherweisecol_style=dict
Elemente im Col-Header-Stil enthält (anstelle der Standardeinstellung,header_style
die derzeit fest codiert zu sein scheintAntworten:
Inspiriert von der Antwort von user6178746 habe ich Folgendes:
quelle
worksheet.set_column(idx+nlevels, idx+nlevels, max_len)
. Andernfalls wird die Länge für die erste Spalte des Frames berechnet und dann auf die erste Spalte im Excel angewendet , bei der es sich wahrscheinlich um den Index handelt.enumerate(df)
sollte es sein , dassenumerate(df.columns)
Sie über jede Spalte in iterierendf
.dict
tatsächlich über die Schlüssel in derdict
(Sie müssen nicht manuell sagendict.keys()
) iteriert, iteriert über einepd.DataFrame
Iteration über die Spalten. Sie müssen nicht manuell durchlaufendf.columns
.Ich poste dies, weil ich gerade auf dasselbe Problem gestoßen bin und festgestellt habe, dass in der offiziellen Dokumentation für Xlsxwriter und Pandas diese Funktionalität weiterhin als nicht unterstützt aufgeführt ist. Ich habe eine Lösung gehackt, die das Problem gelöst hat, das ich hatte. Ich iteriere einfach durch jede Spalte und benutze worksheet.set_column, um die Spaltenbreite == die maximale Länge des Inhalts dieser Spalte festzulegen.
Ein wichtiger Hinweis jedoch. Diese Lösung passt nicht zu den Spaltenüberschriften, sondern nur zu den Spaltenwerten. Dies sollte jedoch eine einfache Änderung sein, wenn Sie stattdessen die Header anpassen müssen. Hoffe das hilft jemandem :)
quelle
()
innerhalb der Max-Funktion: `max (column_len (), len (col)) + 2`Derzeit gibt es wahrscheinlich keine automatische Möglichkeit, dies zu tun. Wenn Sie jedoch openpyxl verwenden, können Sie in der folgenden Zeile (angepasst an eine andere Antwort von Benutzer Bufke zur manuellen Vorgehensweise ) einen vernünftigen Wert (in Zeichenbreiten) angeben:
quelle
column_dimensions
Attribut enthält. Wenn Sie weiterhin openpyxl verwenden möchten, geben Sie es einfach an, wenn Sie den Writer mitpd.ExcelWriter(excel_filename, engine='openpyxl')
Xlsxwriter
als Engine verwendet werden, um festzustellen , wie die Spaltenbreite mit der heutigen Standard-Engine angegeben wird.Es gibt ein schönes Paket, das ich kürzlich verwendet habe und das StyleFrame heißt.
Es erhält DataFrame und ermöglicht es Ihnen, es sehr einfach zu gestalten ...
Standardmäßig wird die Spaltenbreite automatisch angepasst.
beispielsweise:
Sie können auch die Spaltenbreite ändern:
AKTUALISIEREN
In Version 1.4 wurde das
best_fit
Argument hinzugefügtStyleFrame.to_excel
. Siehe die Dokumentation .quelle
best_fit
Parameter angepasst werden sollen. Als ich das versuchte, bekam ich auch sehr schlechte Ergebnisse .index
Parameter zu aktivieren und zu deaktivieren , aber keine Würfel.sf.apply_headers_style(Styler(bold=False))
Ich habe lange gebraucht, um das herauszufinden. Und in der import-Anweisung ,from StyleFrame import StyleFrame, Styler
. Hier sind alle Optionen außer fett: styleframe.readthedocs.io/en/2.0.5/…Mit Pandas und xlsxwriter können Sie Ihre Aufgabe erledigen. Der folgende Code funktioniert perfekt in Python 3.x. Weitere Informationen zum Arbeiten mit XlsxWriter mit Pandas finden Sie unter https://xlsxwriter.readthedocs.io/working_with_pandas.html
quelle
Bei der Arbeit schreibe ich immer die Datenrahmen, um Dateien zu übertreffen. Anstatt immer wieder denselben Code zu schreiben, habe ich einen Modul erstellt. Jetzt importiere ich es einfach und benutze es, um die Excel-Dateien zu schreiben und zu formatieren. Es gibt jedoch einen Nachteil: Es dauert lange, wenn der Datenrahmen besonders groß ist. Also hier ist der Code:
quelle
Ich fand, dass es nützlicher war, die Spalte basierend auf der Spaltenüberschrift anzupassen, als den Spalteninhalt.
Mit
df.columns.values.tolist()
I generiere ich eine Liste der Spaltenüberschriften und benutze die Länge dieser Überschriften, um die Breite der Spalten zu bestimmen.Siehe den vollständigen Code unten:
quelle
Passen Sie alle Spaltenlängen dynamisch an
Passen Sie eine Spalte manuell mit dem Spaltennamen an
Passen Sie eine Spalte mithilfe des Spaltenindex manuell an
Falls einer der oben genannten Fehler auftritt
Stellen Sie sicher, dass Sie Folgendes installieren
xlsxwriter
:quelle
Kombinieren Sie die anderen Antworten und Kommentare und unterstützen Sie auch Multi-Indizes:
quelle
quelle
Die einfachste Lösung besteht darin, die Spaltenbreite in der Methode set_column anzugeben.
quelle
quelle