2
1

More than 1 year has passed since last update.

OpenpyxlでExcelシートのセル幅を自動調整させる[日本語対応,フォントサイズ対応](1)

Posted at

Openpyxlでエクセルの個別セルを自動調整

友達からエクセル表示をセルの中身に合わせて幅を整理(印刷)したいと要望受けたので、エクセルのセル幅を自動調整するマクロを作ってみました。
サイトを調べると、単純なセル文字数だけをカウントしてセル幅を調整するサンプルしかなかったので下記を考慮したマクロを作ってみました
(文字の長さを単純にカウントすると、半角文字も全角文字も1文字としてカウントされてしまいます)
・日本語(全角文字列)を考慮する
・フォントサイズを考慮する
・フォント自体のピクセルサイズ

例えば↓のようなエクセルがあり、セル幅を自動調整してくれます。

元ファイル(width_before.xlsx)
before.png

変換結果ファイル(width_result.xlsx)
result.png

作ったプログラム

adjust_width.py
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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1