openpyxlでAutofit的なもの

このところpandasの便利さに惹かれ業務関連のレポート作成をPerlからPythonに移行している。データそのものはpandasのto_excel()で出力しても書式設定が面倒。PerlではAutofitが一発だったのにopenpyxlには見当たらない。Stack Overflowでみつけたやり方だと日本語が含まれるCellがあるとうまくない。要するに英語圏と違い、全角半角混在する環境では文字数のカウントだけでは幅がせまくなりすぎるのだ。

unicodedata.east_asian_width(chr)を使い「全角かな(W)」「全角英数(A)」「特殊文字(F)」は倍の幅としてカウントすることで望みどおりの結果を得ることができる。

def as_text(value):
if value is None:
return ""
return str(value)
def get_east_asian_width_count(text):
count = 0
for c in text:
if unicodedata.east_asian_width(c) in 'FWA':
count += 2
else:
count += 1
return count
for column_cells in worksheet.columns:
length = max(get_east_asian_width_count(as_text(cell.value)) for cell in column_cells)
worksheet.column_dimensions[column_cells[0].column].width = (length+2)*1.3

*1.3はただの調整マージンで意味はない。

(参考) openpyxl – adjust column width size

(参考)Pythonで半角1文字、全角2文字として文字数(幅)カウント