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)
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.
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
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)
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
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