OpenPyXl
Pythonからエクセルをいじくり回せる。(ただし.xlsxのみ。.xlsは非対応)
- Python から Excel を扱うパッケージ比較
他は試してないけど、OpenPyXlは十分扱いやすく、情報も公式・非公式ともにあるためこれ選んどけばいい感。
- 操作一覧紹介
基本
パッケージの概観はこんな感じ。ここでは省略するがグラフなど他のも扱える模様。
[Workbook オブジェクト] |- [Worksheet オブジェクト] | |- [Cell オブジェクト] | | |- font ←[各種Styleオブジェクト]を適用 | | |- border | | ... | |- [Cell オブジェクト] ...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
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
をインポート。
1 2 |
import openpyxl import openpyxl.styles # ←これが必要 |
Alignment(文字の中央揃えなど)
1 2 3 4 |
hcentering = openpyxl.styles.Alignment(horizontal = 'center' ) vcentering = openpyxl.styles.Alignment(vertical = 'center' ) cell.alignment = hcentering |
他にも、テキストを折り返すか(wrapText)、最終行を均等割り付けにするか(justifyLastLine)、などを指定できる。
背景色
1 2 3 |
orange_fill = openpyxl.styles.PatternFill(patternType = 'solid' , fgColor = 'FDE9D9' ) cell.fill = orange_fill |
罫線
あるセル範囲の周囲だけに罫線を引く、みたいなことはできず、セル毎に上下左右に罫線を引くかどうかのスタイルを指定するため、ちょっと面倒。
1 2 3 4 5 6 |
# 線のスタイル 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 |
関数化すればよいが、関数自体が野暮ったくなる感は否めない。
列幅・カラム幅
これはセルで無くシートに対して操作する。数値がどれくらいの幅を示すのかちとわかりづらい。(さらに列と行で単位が異なるっぽい)
1 2 |
ws.row_dimensions[ 1 ].height = 12 ws.column_dimensions[ 'A' ].width = 12 |
表示形式
これはセルの属性に直接文字列を指定すればよい。
1 |
cell.number_format = '0.000%;[Red]-0.000%' |