openpyxl-ajuster la largeur de la colonne

j'ai le script suivant qui convertit un fichier CSV en fichier XLSX, mais ma taille de colonne est très étroite. Chaque fois que je dois les faire glisser avec la souris pour lire des données. Quelqu'un sait comment faire pour définir la largeur des colonnes dans openpyxl?

Voici le code que j'utilise.

#!/usr/bin/python2.6
import csv
from openpyxl import Workbook
from openpyxl.cell import get_column_letter

f = open('users_info_cvs.txt', "rU")

csv.register_dialect('colons', delimiter=':')

reader = csv.reader(f, dialect='colons')

wb = Workbook()
dest_filename = r"account_info.xlsx"

ws = wb.worksheets[0]
ws.title = "Users Account Information"

for row_index, row in enumerate(reader):
    for column_index, cell in enumerate(row):
        column_letter = get_column_letter((column_index + 1))
        ws.cell('%s%s'%(column_letter, (row_index + 1))).value = cell

wb.save(filename = dest_filename)
36
demandé sur Yaron 2012-11-02 18:50:05

5 réponses

Vous pouvez estimer (ou utiliser une police mono width) pour atteindre cet objectif. Supposons de données est un tableau imbriqué comme [["a1", "a2'], ["b1", "b2']]

nous pouvons obtenir les caractères max dans chaque colonne. Le réglage de la largeur. La largeur est exactement la largeur d'une police monospace (bien ne changeant pas les autres styles au moins). Même si vous utilisez une police de largeur variable, c'est une estimation correcte. Cela ne fonctionnera pas avec des formules.

column_widths = []
for row in data:
    for i, cell in enumerate(row):
        if len(column_widths) > i:
            if len(cell) > column_widths[i]:
                column_widths[i] = len(cell)
        else:
            column_widths += [len(cell)]

for i, column_width in enumerate(column_widths):
    worksheet.column_dimensions[get_column_letter(i+1)].width = column_width

un peu Un hack mais vos rapports seront plus lisible.

50
répondu Bufke 2013-01-22 02:20:42

ma variation de la réponse de Bufke. Évite un peu de branchement avec le tableau et ignore les cellules / colonnes vides.

maintenant corrigé pour les valeurs des cellules non-string.

ws = your current worksheet
dims = {}
for row in ws.rows:
    for cell in row:
        if cell.value:
            dims[cell.column] = max((dims.get(cell.column, 0), len(str(cell.value))))    
for col, value in dims.items():
    ws.column_dimensions[col].width = value
25
répondu velis 2018-08-13 15:44:03

encore plus de méthode pythonique pour définir la largeur de toutes les colonnes qui fonctionnent au moins dans la version 2.4.0 d'openpyxl:

for column_cells in worksheet.columns:
    length = max(len(as_text(cell.value)) for cell in column_cells)
    worksheet.column_dimensions[column_cells[0].column].width = length

la fonction as_text doit être quelque chose qui convertit la valeur en une chaîne de longueur appropriée, comme pour Python 3:

def as_text(value):
    if value is None:
        return ""
    return str(value)
22
répondu User3759685 2016-12-02 15:03:24

j'ai un problème avec merged_cells et le redimensionnement automatique ne fonctionne pas correctement, si vous avez le même problème, vous pouvez résoudre avec le code suivant:

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
4
répondu Virako 2017-04-24 23:26:57

une légère amélioration de la réponse acceptée ci-dessus, que je pense plus pythonique (demander pardon est mieux que demander la permission)

column_widths = []
for row in workSheet.iter_rows():
    for i, cell in enumerate(row):
        try:
            column_widths[i] = max(column_widths[i], len(cell.value))
        except IndexError:
            column_widths.append(len(cell.value))

for i, column_width in enumerate(column_widths):
    workSheet.column_dimensions[get_column_letter(i + 1)].width = column_width
2
répondu shayst 2016-10-17 12:50:10