Pythonのライブラリpandasで作ったdataframeをそのままExcelに出力することがよくあります。
この場合はdf.to_excel()メソッドで簡単にExcel出力できます。ただ、Excel出力したデータはそのまま出力されるだけで、罫線などもなく、非常に味気ないです。
出力後にExcelを開いて、自分で書式設定すればいいんですけど、どうせならPythonでやりたい。
なのでdf.to_excel()で機械的に出力したデータに書式設定を行うPythonの関数を作ってみました。
Openpyxlというライブラリを使えば結構簡単にできます。
やりたいことは以下の通りです。
- データが入力されているセルのみ罫線を引きたい
- 1行ごと(交互)にセルの背景色を変更して表を見やすくしたい。
- ヘッダ行がある場合はヘッダ行に別の背景色をつけたい。
ソース
下記ソースは、関数all_sheets_orgformat()にファイルのフルパスとヘッダフラグを渡すと
以下の書式設定をしてくれるプログラムです。関数を別ファイルにして、呼び出すこともできます。
関数の内容
- データが出力されているセルに黒の細線で罫線をつける
- ヘッダーフラグにTrueを渡すとヘッダ行の背景色を黄色にする。
- 偶数行の背景色には、薄い黄色を設定する。
前提条件
- to_excelなどでA1セルにdataframeをそのまま出力していることを想定
※A1で始まっていない場合や歯抜けがある場合は、Excelに出力時に調整するか、独自で処理を組む必要があります。
ソース
import openpyxl as px
from openpyxl.styles.borders import Border,Side
from openpyxl.styles import PatternFill
#すべてのシートに罫線をつけて1行おきに背景色をつける関数
def all_sheets_orgformat(filename,headercolorflg):
#黒の細線で罫線を引く
side1 = Side(style='thin',color = '000000')
border1 = Border(top=side1,bottom=side1,left=side1,right=side1)
wb = px.load_workbook(filename)
#すべてのシート
for ws in wb.worksheets:
#データが入っているすべてのセル
for row in ws.rows:
for cell in row:
#ヘッダがある場合はTrueにする
if headercolorflg:
if cell.row == 1:
#ヘッダーは、黄色にする
cell.fill = PatternFill(fgColor='FFFF00',bgColor='FFFF00',fill_type='solid')
if cell.row %2 == 0:
#ヘッダ以外で偶数行の場合は,薄い黄色にする
cell.fill = PatternFill(fgColor='FFFFE0',bgColor='FFFFE0',fill_type='solid')
cell.border = border1
wb.save(filename)
実行結果
実行前は罫線と背景色なし


実行後は、罫線と背景色が付く


ポイント
Sideオブジェクト
Sideオブジェクトで罫線の色とスタイルを設定できます。
Side(color=RGB形式の色, border_style=線スタイル)
設定値 | 線のスタイル |
---|---|
hair | 極細 |
thin | 細線(デフォルト) |
medium | 少し太い |
thick | 太線 |
double | 2重線 |
Borderオブジェクト
上記で設定したsideオブジェクトを使って、罫線を引きます。上のプログラムは上下左右すべて黒の細線を引く設定にしています。
Border(top=side,bottom=side,left=side,right=side)
罫線の位置
top | 上罫線 |
bottom | 下罫線 |
left | 左罫線 |
right | 右罫線 |
1行おきに背景色をつける
if cell.row %2 == 0は、セルの行数が2で割り切れる=偶数の場合は色を変更しています。奇数行の場合は、デフォルトのままにしています。1行おきに色を付けるとExcelの表形式のデータが非常に見やすくなります。
最終の行列は取得しなくてよい?
上記プログラムでは、最終行や最終列を取得していませんが、罫線は、データが存在する場所のみに罫線が設定されています。これは、データの途中に歯抜けの行がない場合のみに有効です。空白行が存在する場合などは、別途除外する設定が必要なので注意が必要です。歯抜けの行列がないことが約束されているのであれば、範囲をしてしなくてもいいのでto_excelなどで出力するときなどは、vbaより簡単にかけたりします。
コメント