openpyxlでExcel出力
openpyxlはExcelの読み書きを行うためのPythonのライブラリです.
csvを用いてxlsx形式のファイルを自動出力させたいときに特に有用です.
ここではいくつかの機能について記します.
ライセンスによりExcelそのものを動かしてマクロ実行やPDF出力するにはxlwingsを使います.openpyxlはExcelアプリケーションを動かさずにxlsxファイルを生成できる点が優れています.
目次
インストール
macOS 11では
pip3 install openpyxl |
によりインストールします.
ワークブックの作成と保存
Macではpython 3系の操作のため,python3
で入って,
from openpyxl import Workbook |
とすることで,新規ワークブック(=ファイル)の作成と保存が行えます.
ファイル作成時のワークシートをアクティブにするには
ws = wb.active |
とすればよく,
ws.title = "シート名" |
とすることでシート名の変更が行えます.
以下,ws
を作業するワークシートとします.
ファイルを開く
ファイルを開くには
from openpyxl import load_workbook |
のようにします.
シートの作成
ワークシートを新規作成するには,
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 |
後者は関数を代入する例で,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'], |
表示形式
時刻
A1セルに入力した2020年2月22日の時刻表示形式を変更して,2020-02-22と表示する例です.
ws['A1'] = datetime.datetime(2020, 2, 22) |
3桁区切り
A1セルに入力した123456789を3桁区切りで123,456,789と表示する例です.
ws['A1'] = 123456789 |
行・列の挿入と削除
行挿入は
ws.insert_rows(開始行の数値, 挿入行数) |
によって行います.
- 列なら
rows
をcols
とします. - 削除は
insert
をdelete
とします. - 挿入行数は省略でき,デフォルトは
1
です.
セル背景色
モジュールを使って,網掛けパターンや色を定めます.
from openpyxl.styles import PatternFill |
そして,セルの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 |
ただし,最終行・最終列をws.max_row
とws.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 |
とします.
見出し行
シート1行目を全ての印刷ページで見出しとするには,
ws.print_title_rows = '1:1' |
とします.
ヘッダー・フッター
ヘッダーの設定は次の通りです.
ws.oddHeader.left.text = "Page &[Page] of &N" |
位置はleft
/center
/right
で決めます.
全ての列を印刷
列を合わせて印刷するには,
ws.page_setup.fitToWidth = 1 |
とします.