見出し画像

便利ライブラリ openpyxl③ フォント・セル設定(配置、塗りつぶし)

前回は罫線の設定について書きましたが、最終的には罫線を消す(リセットする)コードとしました。

from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill, Border, Side, Alignment

# ファイルの読み込み
wb = load_workbook("コロナ重症者数2022-12.xlsx")
ws = wb.active
# 行・列の挿入
ws.insert_rows(1, 2)
ws.insert_cols(idx=1, amount=1)
# 行・列幅の調節
cols = ["A", "B", "C", "D", "E", "F"]
widths = [3, 11, 9, 7, 7, 8]
for i in range(len(cols)):
    ws.column_dimensions[cols[i]].width = widths[i]
ws.row_dimensions[2].height = 5
# 任意のセルに文字を入力
ws["A1"] = 'COVID-19重症者数の推移(2022年12月)'
# 表全体の罫線設定をリセット
last_row = ws.max_row
last_col = ws.max_column
rows = ws.iter_rows(3, last_row, 2, last_col)
for row in rows:
    for cell in row:
        cell.border = Border()
# ブックを別名で保存
wb.save('コロナ重症者数2022-12【openpyxl】.xlsx')

今回はこの続きからです。
※説明の都合上、2行目のimportの中に"Alignment"を追加しています。


フォントの設定

font_style = Font(name='書体名', size=字の大きさ,
                  bold=True, italic=True,
                  color='カラーコード'
                  )
cell.font = font_style

構文は罫線の時とほぼ同じで、先にFont()でスタイルを指定しておきます。その設定をcellごとに適用していくイメージです。
試しに、A1セルのタイトルのスタイルを変更してみます。

title_font = Font(name='游ゴシック', size=12, bold=True, color='1F497D')
ws['A1'].font = title_font

指定した通りのスタイルに変更することができました。

表全体も同じようにスタイルを変更していきます。これも、罫線の時と同じく、iter_rows()で1行ずつ取得しスタイルを設定していきます(詳細は前回の投稿をご参照ください)。

table_font = Font(name='游ゴシック', size=10, color='000000')
rows = ws.iter_rows(3, last_row, 2, last_col)
for row in rows:
    for cell in row:
        cell.font = table_font


セル設定

配置

alignment_style = Alignment(horizontal=水平方向,
                            vertical=垂直方向
                            )
cell.alignment = alignment_style

horizontal のオプション

  • 'general' セルのデータ型に応じたデフォルト配置

  • 'left' 左寄せ

  • 'center' 中央揃え

  • 'right' 右寄せ

  • 'fill' セルをデータで埋めるように配置

  • 'justify' 両端揃え

  • 'centerContinuous' セル結合後に中央揃え

  • 'distributed' 均等割り付け

vertical のオプション

  • 'top' 上寄せ

  • 'center' 中央揃え

  • 'bottom' 下寄せ

  • 'justify' 両端揃え

  • 'distributed' 均等割り付け

もはや解説は不要ですね。以下のようにすれば、文字をセンタリングすることができます。

alignment_style = Alignment(horizontal='center', vertical='center')


塗りつぶし

fill = PatternFill(start_color=開始色,
                   end_color=終了色,
                   fill_type=塗りつぶしのパターン
                   )
cell.fill = fill

fill_typeのオプション

  • 'solid' 単一色での塗りつぶし

  • 'gray125' 125% の濃度のグレーで塗りつぶし

  • 'lightDown' 上から下へ向かって明るいグラデーション

  • 'lightUp' 下から上へ向かって明るいグラデーション

  • 'darkDown' 上から下へ向かって暗いグラデーション

  • 'darkDown' 下から上へ向かって暗いグラデーション

前回、罫線を消したので代わりにシマシマの表に仕上げようと思います。何行もあったり横に長い表を作成する時は、この方が格段に見やすくなります。
タイトル行だけは色を変えた方がカッコいいので、濃いめの色で塗りつぶし、文字色も白にして太字にしてみます。

titleRow_fill = PatternFill(start_color='1F497D', end_color='1F497D', fill_type='solid')
titleRow_font = Font(name='游ゴシック', size=12, bold=True, color='FFFFFF')

titleRow = ws.iter_rows(3, 3, 2, last_col)
for row in titleRow:
    for cell in row:
        cell.fill = titleRow_fill
        cell.font = titleRow_font

さて、表のタイトル行以外のところですが、シマシマにするにはひと工夫が必要です。
これまでと同様にiter_rows()で1行ずつ取得していきますが、塗りつぶす行と塗りつぶさない行(もしくは色Aで塗りつぶす行と色Bで塗りつぶす行)を区別する必要があります。
そこで、cell.rowで行番号を取得し、それが奇数が偶数か判断する方法で区別してみます。行番号を2で割ったときの余りが1なら奇数、0なら偶数なので、「cell.row % 2 == 1」がTrueの時に塗りつぶすようif文を書きます(%は余りを求める演算子です)。

records_fill = PatternFill(start_color='C5D9F1', end_color='C5D9F1', fill_type='solid')

records = ws.iter_rows(5, last_row, 2, last_col)
for row in records:
    for cell in row:
        if cell.row % 2 == 1:
            cell.fill = records_fill

ここまでをまとめると、以下のようになります。同じ範囲に対する設定はまとめることができるので、表全体に対する罫線、フォント、セル位置の設定は同じfor文の中に入れています。
また、タイトル行の文字を太字にしたので列幅の設定も微妙に変えました。列幅については前々回の投稿をご参照ください。

from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill, Border, Side, Alignment

# ファイルの読み込み
wb = load_workbook("コロナ重症者数2022-12.xlsx")
ws = wb.active
# 行・列の挿入
ws.insert_rows(1, 2)
ws.insert_cols(idx=1, amount=1)
# 行・列幅の調節
cols = ["A", "B", "C", "D", "E", "F"]
widths = [3, 11, 10, 8, 8, 9]
for i in range(len(cols)):
    ws.column_dimensions[cols[i]].width = widths[i]
ws.row_dimensions[2].height = 5
# 任意のセルに文字を入力
ws["A1"] = 'COVID-19重症者数の推移(2022年12月)'
#フォントのスタイルを設定(太字、イタリック、フォントサイズ、フォント名など)
title_font = Font(name='游ゴシック', size=12, bold=True, color='1F497D')
table_font = Font(name='游ゴシック', size=10, color='000000')
# セルにフォントを適用
ws['A1'].font = title_font
# セル配置
alignment_style = Alignment(horizontal='center', vertical='center')
# 表全体に適用
last_row = ws.max_row
last_col = ws.max_column
rows = ws.iter_rows(3, last_row, 2, last_col)
for row in rows:
    for cell in row:
        cell.border = Border()  #罫線設定をリセット
        cell.font = table_font
        cell.alignment = alignment_style
# 塗りつぶし
titleRow_fill = PatternFill(start_color='1F497D', end_color='1F497D', fill_type='solid')
titleRow_font = Font(name='游ゴシック', size=12, bold=True, color='FFFFFF')
titleRow = ws.iter_rows(3, 3, 2, last_col)
for row in titleRow:
    for cell in row:
        cell.fill = titleRow_fill
        cell.font = titleRow_font
records_fill = PatternFill(start_color='C5D9F1', end_color='C5D9F1', fill_type='solid')
records = ws.iter_rows(5, last_row, 2, last_col)
for row in records:
    for cell in row:
        if cell.row % 2 == 1:
            cell.fill = records_fill
# ブックを別名で保存
wb.save('コロナ重症者数2022-12【openpyxl】.xlsx')
After

DataFrameをそのままExcelとして出力したもの(下図)に比べると、洗練された感じになりました!

Before

次回は、もう少し手を加えていきたいと思います。


おまけの話:Excelでシマシマな表

シマシマな表はExcel操作でもよく使っています。テーブルに変えればシマシマになりますが、テーブルにしたくない時は条件付き書式を使用します。

適用したい範囲を選択し、「新しいルール」から「数式を使用して、書式設定するセルを決定」を選びます。

数式を入力するボックスに「=mod(row(), 2) = 1」と入力し、書式から塗りつぶしの設定を行います。
mod()は余りを返すExcel関数で、上記コードの「%」に相当します。row()で行番号を取得できるので、2で割った余りが1のセル(=奇数行のセル)は条件がTrueとなるため塗りつぶしが実行されます。もちろん、=0にすれば偶数行に対して書式を設定できます。
行番号に対して書式を設定するので、表の途中の行を削除してもシマシマは常にキープされるので便利です。

いいなと思ったら応援しよう!