webentwicklung-frage-antwort-db.com.de

Python - Breite der Spalten einer Excel-Datei automatisch anpassen

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!

7
Aditya
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 =)

25
oldsea

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
3
Virako

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
1
Manuel G