web-dev-qa-db-ja.com

Python-Excelファイルの列の幅を自動的に調整する

初心者-Python指定した値に応じて、Excelファイルの異なる列の幅を調整するスクリプトがあります。

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)

異なる列に明示的に指定せずに、すべての列の幅を最適な値に調整する方法はありますか(つまり、この「if-Elif-elif -...... -Elif-else "構造))?ありがとう!

11
Aditya
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

これはおそらくよりきれいにすることができますが、それは仕事をします。フォントを表示するときに使用しているフォントに適したものに応じて、adjusted_widthの値をいろいろ試してみてください。モノタイプを使用すると、正確に取得できますが、1対1の相関関係ではないため、少し調整する必要があります。

モノタイプを使わずに派手で正確にしたい場合は、文字を幅でソートし、各幅にfloat値を割り当ててから合計します。これには、セル値内の各文字を解析し、各列の結果を合計する3番目のループと、おそらく幅で文字をソートする辞書が必要になります。

編集:実際には、テキストの視覚的なサイズを測定するより良い方法があるようです: link 個人的にはmatplotlibテクニックを好むでしょう。

私が助けになることを願っています、私の最初のstackoverflowの答え=)

33
oldsea

Merged_cellsに問題があり、自動サイズ調整が正しく機能しません。同じ問題がある場合は、 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

Openpyxl 3.0.0の時点で更新されたバージョン(.columnsを使用するとTypeError: expected <class 'str'>

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
1
Manuel G