目次

OpenPyXl

Pythonからエクセルをいじくり回せる。(ただし.xlsxのみ。.xlsは非対応)

他は試してないけど、OpenPyXlは十分扱いやすく、情報も公式・非公式ともにあるためこれ選んどけばいい感。

基本

パッケージの概観はこんな感じ。ここでは省略するがグラフなど他のも扱える模様。

[Workbook オブジェクト]
  |- [Worksheet オブジェクト]
  |    |- [Cell オブジェクト]
  |    |    |- font            ←[各種Styleオブジェクト]を適用
  |    |    |- border
  |    |    ...
  |    |- [Cell オブジェクト]
  ...                          

import openpyxl

# (仮想)Workbook を新規作成
wb = openpyxl.Workbook()

# 既存の Workbook を開く
wb = openpyxl.load_workbook('path.xlsx')

# 保存
wb.save('path.xlsx')

# Worksheet を取得
ws = wb.active                        # 現在アクティブ
ws = wb.worksheets['sheetname']       # 名前を指定
ws = wb.create_sheet('sheetname', 0)  # 新規作成(0番目に配置)
ws = wb.copy_worksheet('sheetname')   # 既存からコピー

# Cell を取得
cell = ws['A1']       # A1方式
cell = ws.cell(1, 1)  # R1C1方式

# Cell の値を取得
val = cell.value

# Cell に値を代入
cell.value = val
ws.cell(1, 1, val)    # R1C1方式なら指定と同時に代入可

# Cell に関数を代入
cell.value = '=SUM(A1:B2)'  # そのまま文字列で

スタイル

見栄えに関する指定の多くは、単一セルに対して個々におこなうことになる。

追加でopenpyxl.stylesをインポート。

import openpyxl
import openpyxl.styles  # ←これが必要

Alignment(文字の中央揃えなど)

hcentering = openpyxl.styles.Alignment(horizontal='center')
vcentering = openpyxl.styles.Alignment(vertical='center')

cell.alignment = hcentering

他にも、テキストを折り返すか(wrapText)、最終行を均等割り付けにするか(justifyLastLine)、などを指定できる。

背景色

orange_fill = openpyxl.styles.PatternFill(patternType='solid', fgColor='FDE9D9')

cell.fill = orange_fill

罫線

あるセル範囲の周囲だけに罫線を引く、みたいなことはできず、セル毎に上下左右に罫線を引くかどうかのスタイルを指定するため、ちょっと面倒。

#   線のスタイル
bd_style = openpyxl.styles.Side(style=openpyxl.styles.borders.BORDER_THIN, color='000000')
#   セルの上下左右の線の配置
bd_o = openpyxl.styles.Border(top=bd_style, bottom=bd_style, left=bd_style, right=bd_style)
#   セルに適用
cell.border = bd_o

関数化すればよいが、関数自体が野暮ったくなる感は否めない。

列幅・カラム幅

これはセルで無くシートに対して操作する。数値がどれくらいの幅を示すのかちとわかりづらい。(さらに列と行で単位が異なるっぽい)

ws.row_dimensions[1].height = 12
ws.column_dimensions['A'].width = 12

表示形式

これはセルの属性に直接文字列を指定すればよい。

cell.number_format = '0.000%;[Red]-0.000%'