write tutorial read instalar for espaƱol como python openpyxl

tutorial - python openpyxl read xlsx



openpyxl-ajuste el ancho de columna (5)

Tengo el script siguiente que convierte un archivo CSV a un archivo XLSX, pero el tamaño de mi columna es muy estrecho. Cada vez que tengo que arrastrarlos con el mouse para leer datos. ¿Alguien sabe cómo establecer el ancho de la columna en openpyxl ?

Aquí está el código que estoy usando.

#!/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)


Aún más manera pitónica de establecer el ancho de todas las columnas que funciona al menos en openpyxl versión 2.4.0:

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 función as_text debe ser algo que convierta el valor a una cadena de longitud adecuada, como para Python 3:

def as_text(value): if value is None: return "" return str(value)


Mi variación de la respuesta de Bufke. Evita un poco de ramificación con la matriz e ignora celdas / columnas vacías.

Ahora se ha corregido para valores de celdas que no sean cadenas.

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


Puede calcular (o usar una fuente de ancho mono) para lograr esto. Supongamos que los datos son una matriz anidada como [[''a1'', ''a2''], [''b1'', ''b2'']]

Podemos obtener los caracteres máximos en cada columna. El conjunto de ancho a eso. El ancho es exactamente el ancho de una fuente monoespacial (y no cambia otros estilos al menos). Incluso si usa una fuente de ancho variable, es una estimación decente. Esto no funcionará con fórmulas.

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 poco de hack, pero tus informes serán más legibles.


Tengo un problema con merged_cells y autosize no funciona correctamente, si tiene el mismo problema, puede resolverlo con el siguiente código:

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


Una ligera mejora de la respuesta aceptada anteriormente, que creo que es más pitonica (pedir perdón es mejor que pedir permiso)

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