openpyxlはExcelの読み書きを行うためのPythonのライブラリです.
csvを用いてxlsx形式のファイルを自動出力させたいときに特に有用です.
ここではいくつかの機能について記します.

ライセンスによりExcelそのものを動かしてマクロ実行やPDF出力するにはxlwingsを使います.openpyxlはExcelアプリケーションを動かさずにxlsxファイルを生成できる点が優れています.

目次

  1. インストール
  2. ワークブックの作成と保存
  3. ファイルを開く
  4. シートの作成
  5. セルの指定
    1. 単独セル
    2. セル範囲
    3. 番地変換
    4. 相対位置
  6. 行列の追記
  7. 表示形式
    1. 時刻
    2. 3桁区切り
  8. 行・列の挿入と削除
  9. セル背景色
  10. 文字配置
  11. セル結合
  12. 罫線
  13. ウィンドウ枠の固定
  14. オートフィルタ
  15. 印刷設定
    1. 印刷範囲
    2. 印刷位置
    3. 見出し行
    4. ヘッダー・フッター
    5. 全ての列を印刷

インストール

macOS 11では

pip3 install openpyxl

によりインストールします.

ワークブックの作成と保存

Macではpython 3系の操作のため,python3で入って,

from openpyxl import Workbook
wb = Workbook()
wb.save("test.xlsx")

とすることで,新規ワークブック(=ファイル)の作成と保存が行えます.

ファイル作成時のワークシートをアクティブにするには

ws = wb.active

とすればよく,

ws.title = "シート名"

とすることでシート名の変更が行えます.
以下,wsを作業するワークシートとします.

ファイルを開く

ファイルを開くには

from openpyxl import load_workbook
wb = load_workbook('template.xlsx')

のようにします.

シートの作成

ワークシートを新規作成するには,

new_ws = wb.create_sheet('シート名', 挿入位置)

とします.
変数にする必要がないならnew_ws =は不要です.

挿入位置は省略しても構いません.
数値型であり,先頭に挿入するなら0です.

セルの指定

単独セル

VBAでCells(i,j)を使って書くセル指定は,openpyxlではcell(i,j)と書きます.
次の例は(i,j)セルに1を代入する例です.

ws.cell(i,j).value = 1

セル範囲

VBAでRange("A1")に相当するセル範囲の指定は,openpyxlでは文字列として次のように書きます.

ws['A1'] = 1
ws["A1"] = "=SUM(A2:A5)"

後者は関数を代入する例で,Excelのセルに直接入力するときのように文字列を入力できることを表しています.

番地変換

番地変換も用意されています.
openpyxl上でワークシートがwsに格納されているとき,cell(2,1)からA2を得るには

ws.cell(2,1).coordinate

とします.
同様に,A2からcell(2,1)を得るには

ws.cell(2, openpyxl.utils.get_column_letter('A'))

とします.

相対位置

入力範囲をスライドするには

ws.move_range("D4:F10", rows=-1, cols=2)

のような形にします.

さらに,末尾にtranslate=trueのオプションを付加すると,数式中の相対参照を動かしてくれます.

行列の追記

行列をwsに追記するには次のようにします.

mat = [['1-1', '1-2'],
['2-1', '2-2']]

for row in mat:
ws.append(row)

表示形式

時刻

A1セルに入力した2020年2月22日の時刻表示形式を変更して,2020-02-22と表示する例です.

ws['A1'] = datetime.datetime(2020, 2, 22)
ws['A1'].number_format = 'yyyy-mm-dd'

3桁区切り

A1セルに入力した123456789を3桁区切りで123,456,789と表示する例です.

ws['A1'] = 123456789
ws['A1'].number_format = '#,##0'

行・列の挿入と削除

行挿入は

ws.insert_rows(開始行の数値, 挿入行数)

によって行います.

  • 列ならrowscolsとします.
  • 削除はinsertdeleteとします.
  • 挿入行数は省略でき,デフォルトは1です.

セル背景色

モジュールを使って,網掛けパターンや色を定めます.

from openpyxl.styles import PatternFill

pattern_fill = PatternFill(patternType='solid', fgColor='00f07f', bgColor='00f07f')

そして,セルのfillプロパティにパターンを代入します.
ワークシートがwsのときにcell(1,1)に網掛けするなら,

ws.cell(1,1).fill = pattern_fill

です.

文字配置

from openpyxl.styles.alignment import Alignment

しておき,

ws.cell(1,1).alignment = Alignment(horizontal='right', vertical='center')

で天地センターの右揃えとなります.

セル結合

セル結合は例えば,

ws.merge_cells('A1:C3')

とシンプルに書けます.
しかし,次のように書く方が変数を使いやすいでしょう.

ws.merge_cells(start_row=1, start_column=1, end_row=3, end_column=3)

セル結合解除はmergeに代えてunmergeとします.

罫線

表全体に罫線を引くには次のようにします.

from openpyxl.styles import Border, Side

side = Side(style='thin', color='000000')
for i in range(1, ws.max_row + 1):
for j in range(1, ws.max_column + 1):
ws.cell(i,j).border = Border(top=side, bottom=side, left=side, right=side)

ただし,最終行・最終列をws.max_rowws.max_columnで取得しています.

ウィンドウ枠の固定

D4セルの左上を固定する例は次の通りです.

ws.freeze_panes = 'D4'

オートフィルタ

A1:B15の範囲にオートフィルタを設定する例は次の通りです.

ws.auto_filter.ref = "A1:B15"

印刷設定

印刷範囲

A1からZ99を印刷範囲に設定する場合は

ws.print_area = 'A1:Z99'

とします.

印刷位置

印刷範囲が狭い場合,用紙の中央に印刷したいなら,

ws.print_options.horizontalCentered = True
ws.print_options.verticalCentered = True

とします.

見出し行

シート1行目を全ての印刷ページで見出しとするには,

ws.print_title_rows = '1:1'

とします.

ヘッダー・フッター

ヘッダーの設定は次の通りです.

ws.oddHeader.left.text = "Page &[Page] of &N"
ws.oddHeader.left.size = 14

位置はleft/center/rightで決めます.

全ての列を印刷

列を合わせて印刷するには,

ws.page_setup.fitToWidth = 1
ws.page_setup.fitToHeight = 0
ws.sheet_properties.pageSetUpPr.fitToPage = True

とします.