Neuling - Ich habe ein Python-Skript, das die Breite der verschiedenen Spalten einer Excel-Datei entsprechend den angegebenen Werten anpasst:
import openpyxl
from string import ascii_uppercase
newFile = "D:\Excel Files\abc.xlsx"
wb = openpyxl.load_workbook(filename = newFile)
worksheet = wb.active
for column in ascii_uppercase:
if (column=='A'):
worksheet.column_dimensions[column].width = 30
Elif (column=='B'):
worksheet.column_dimensions[column].width = 40
Elif (column=='G'):
worksheet.column_dimensions[column].width = 45
else:
worksheet.column_dimensions[column].width = 15
wb.save(newFile)
Gibt es einen Weg, durch den wir die Breite jeder Spalte auf den optimalen Wert einstellen können, ohne sie explizit für verschiedene Spalten anzugeben (bedeutet, ohne diese " if-Elif-elif -......- Elif -else "Struktur)? Vielen Dank!
for col in worksheet.columns:
max_length = 0
column = col[0].column # Get the column name
for cell in col:
try: # Necessary to avoid error on empty cells
if len(str(cell.value)) > max_length:
max_length = len(cell.value)
except:
pass
adjusted_width = (max_length + 2) * 1.2
worksheet.column_dimensions[column].width = adjusted_width
Dies könnte wahrscheinlich sauberer gemacht werden, aber es macht den Job. Sie sollten mit dem adjusted_width-Wert herumspielen, je nachdem, was für die Schriftart, die Sie beim Anzeigen verwenden, gut ist. Wenn Sie einen Monotyp verwenden, können Sie ihn genau bestimmen, es ist jedoch keine Eins-zu-Eins-Korrelation, sodass Sie ihn noch ein wenig anpassen müssen.
Wenn Sie ohne Monotypie Phantasie und Exaktheit erzielen möchten, können Sie die Buchstaben nach der Breite sortieren und jeder Breite einen Float-Wert zuweisen, den Sie dann addieren. Dies würde eine dritte Schleife erfordern, bei der jedes Zeichen im Zellenwert analysiert und das Ergebnis für jede Spalte aufsummiert wird, und wahrscheinlich ein Wörterbuch, das die Zeichen nach Breite sortiert.
Edit: Eigentlich scheint es eine bessere Methode zu geben, die visuelle Größe des Textes zu messen: link Ich persönlich würde die Matplotlib-Technik bevorzugen.
Hoffe, ich könnte helfen, meine allererste Stackoverflow-Antwort =)
Ich habe ein Problem mit merged_cells und autosize funktioniert nicht richtig. Wenn Sie dasselbe Problem haben, können Sie das Hinzufügen der nächsten Zeilen im Code von oldsea lösen.
for col in worksheet.columns:
max_length = 0
column = col[0].column # Get the column name
for cell in col:
if cell.coordinate in worksheet.merged_cells: # not check merge_cells
continue
try: # Necessary to avoid error on empty cells
if len(str(cell.value)) > max_length:
max_length = len(cell.value)
except:
pass
adjusted_width = (max_length + 2) * 1.2
worksheet.column_dimensions[column].width = adjusted_width
Aktualisierte Version von openpyxl 3.0.0 (Verwendung von .columns schlägt fehl mit TypeError: expected <class 'str'>
:
for column_cells in ws.columns:
length = max(len(as_text(cell.value)) for cell in column_cells)
ws.column_dimensions[column_cells[0].column_letter].width = length