#Openpyxlでエクセルの個別セルを自動調整
友達からエクセル表示をセルの中身に合わせて幅を整理(印刷)したいと要望受けたので、エクセルのセル幅を自動調整するマクロを作ってみました。
サイトを調べると、単純なセル文字数だけをカウントしてセル幅を調整するサンプルしかなかったので下記を考慮したマクロを作ってみました
(文字の長さを単純にカウントすると、半角文字も全角文字も1文字としてカウントされてしまいます)
・日本語(全角文字列)を考慮する
・フォントサイズを考慮する
・フォント自体のピクセルサイズ
例えば↓のようなエクセルがあり、セル幅を自動調整してくれます。
###作ったプログラム
import openpyxl
from unicodedata import east_asian_width
width_dict = {
'F': 2, # Fullwidth
'H': 1, # Halfwidth
'W': 2, # Wide
'Na': 1, # Narrow
'A': 2, # Ambiguous
'N': 1 # Neutral
}
Font_depend = 1.2
def sheet_adjusted_width(ws):
# set column width
for col in ws.columns:
max_length= 1
max_diameter = 1
column= col[1].column_letter # Get the column name
for cell in col:
diameter = (cell.font.size*Font_depend)/10
if diameter > max_diameter:
max_diameter = diameter
try:
if(cell.value == None) : continue
chars = [char for char in str(cell.value)]
east_asian_width_list = [east_asian_width(char) for char in chars]
width_list = [width_dict[east_asian_width] for east_asian_width in east_asian_width_list]
if sum(width_list) > max_length:
max_length= sum(width_list)
except:
pass
ws.column_dimensions[column].width= max_length*max_diameter + 1.2
if __name__ == "__main__":
wb = openpyxl.load_workbook("width_before.xlsx")
ws = wb["Sheet1"]
sheet_adjusted_width(ws)
wb.save("width_result.xlsx")
課題点として
・フォントは固定でセル毎にフォントが異なると対応できない
・セルの中にある文字毎にフォントサイズが異なる場合に対応できない
・セルの中に改行があった場合に対応できない
次は改行があった場合の改造を入れてみたいと思います。
プログラムに参考にした記事
https://qiita.com/github-nakasho/items/62eaba26d5ee4f13a8ac
https://gist.github.com/harhogefoo/db69351789dfa2f60e9c5832eef24b13