web-dev-qa-db-fra.com

Python - Ajuste automatiquement la largeur des colonnes d'un fichier Excel

Débutant - J'ai un script Python qui ajuste la largeur de différentes colonnes d'un fichier Excel, en fonction des valeurs spécifiées:

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)

Existe-t-il un moyen de régler la largeur de chaque colonne à sa valeur optimale, sans la spécifier explicitement pour différentes colonnes (signifie, sans utiliser ce " if-Elif-elif -......- Elif -else "structure)? Merci!

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

Cela pourrait probablement être rendu plus propre, mais cela fait l'affaire. Vous voudrez jouer avec la valeur adjust_width en fonction de ce qui convient à la police que vous utilisez lorsque vous la visualisez. Si vous utilisez un monotype, vous pouvez l’obtenir exactement, mais ce n’est pas une corrélation un à un; vous devrez donc l’ajuster un peu.

Si vous voulez obtenir des images sophistiquées et exactes sans monotype, vous pouvez trier les lettres par largeur et attribuer à chaque largeur une valeur flottante que vous additionnerez ensuite. Cela nécessiterait une troisième boucle analysant chaque caractère de la valeur de la cellule et récapitulant le résultat pour chaque colonne, et probablement un dictionnaire triant les caractères par largeur, peut-être excessif mais cool si vous le faites. 

Edit: En fait, il semble exister un meilleur moyen de mesurer la taille visuelle du texte: link personnellement, je préférerais la technique matplotlib. 

J'espère pouvoir vous aider, ma toute première réponse de stackoverflow =)

25
oldsea

J'ai un problème avec merged_cells et l'autosize ne fonctionne pas correctement, si vous rencontrez le même problème, vous pouvez résoudre l'ajout des lignes suivantes dans le code de oldsea

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