Saltar al contenido

Python: ajuste automáticamente el ancho de las columnas de un archivo de Excel

Agradeceríamos tu ayuda para extender nuestras secciones referente a las ciencias de la computación.

Solución:

for col in worksheet.columns:
     max_length = 0
     column = col[0].column # Get the column name
# Since Openpyxl 2.6, the column name is  ".column_letter" as .column became the column number (1-based) 
     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

Esto probablemente podría hacerse más ordenado, pero hace el trabajo. Querrá jugar con el valor de added_width de acuerdo con lo que es bueno para la fuente que está usando cuando la ve. Si usa un monotipo, puede obtenerlo exacto, pero no es una correlación de uno a uno, por lo que aún deberá ajustarlo un poco.

Si desea ser elegante y exacto sin monotipo, puede ordenar las letras por ancho y asignar a cada ancho un valor flotante que luego suma. Esto requeriría un tercer ciclo que analice cada carácter en el valor de la celda y resuma el resultado de cada columna y probablemente un diccionario que clasifique los caracteres por ancho, quizás exagerado pero genial si lo hace.

Editar: en realidad, parece haber una mejor manera de medir el tamaño visual del texto: enlace personalmente, preferiría la técnica matplotlib.

Espero poder ser de ayuda, mi primera respuesta de stackoverflow =)

Versión actualizada a partir de openpyxl 3.0.0 (el uso de .columns falla con TypeError: expected :

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

Tengo un problema con merged_cells y autosize no funciona correctamente, si tienes el mismo problema, puedes resolverlo agregando las siguientes líneas dentro del código 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

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *