先頭行固定・フィルタ設定・列幅調整

投稿者: | 2024-06-26
  • すでに保存されたExcelをOpenpyxlで開いてから、処理する流れを想定している
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows

# 既存Excelファイルを開く
wb = load_workbook(output_file)

# シートを選択(最初のシートであれば ws = wb.active でもよい)
ws = wb['Sheet1']

目次

先頭行を固定する

# 先頭行を固定する
ws.freeze_panes = 'A2'

フィルタを設定する

# 先頭行にフィルタを設定する
ws.auto_filter.ref = ws.dimensions

列幅を調整する

  • lenだと英語と日本語混在だとうまくカウントできないため、関数 get_east_asian_width() を利用する(別頁参照)
import unicodedata

def get_east_asian_width(text):
  width = 0
    for char in text:
      if unicodedata.east_asian_width(char) in ('F', 'W', 'A'):
        width += 2
      else:
        width += 1
    return width
# 各列の幅を自動で調整する(ぴったりにはならない)

from openpyxl.utils.dataframe import dataframe_to_rows
from openpyxl.utils import get_column_letter

for column in ws.columns:
  max_length = 0
  column = [cell for cell in column]
  for cell in column:
    v = cell.value
    if v:
      try:
        if get_east_asian_width(v) > max_length:
          print(v)
          max_length = get_east_asian_width(v)
      except:
        pass
  print(max_length)
  adjusted_width = max_length
  ws.column_dimensions[column[0].column_letter].width = adjusted_width

上書きして終了

# Excelファイルを上書き
wb.save(output_file)
wb.close()

# エラー防止のため以下(「Pythonによってファイルは開かれているため、操作を完了できません」)

# ファイルの参照を解放
del wb

# ガバレージコレクションを削除
import gc
gc.collect()