[解決!Python]OpenPyXLを使ってExcelワークシートのセルの書式設定をするには解決!Python

OpenPyXLを使って、Excelワークシートのフォント指定/塗りつぶし/けい線/文字そろえ/値の表示方法など、セルの書式設定を行う方法を紹介する。

» 2022年02月15日 05時00分 公開
[かわさきしんじDeep Insider編集部]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「解決!Python」のインデックス

連載目次

書体の指定

from openpyxl.styles import Font
header_font = Font(name='メイリオ', size=16, bold=True, color='000000ff')
value_font = Font(name='MS ゴシック')

for idx in range(5):
    r = chr(ord('A')+idx)
    ws[f'{r}1'].font = header_font
    ws[f'{r}2'].font = value_font


 詳細は以下の「書体の指定」を参照のこと。

セルの塗りつぶし

from openpyxl.styles import PatternFill
pf = PatternFill(patternType='solid', fgColor='bbbb00')
ws['A1'].fill = pf

# パターンを使った塗りつぶし
pf = PatternFill(patternType='darkUp', fgColor='ffffff', bgColor='ff0000')
ws['B1'].fill = pf

# グラデーションを使った塗りつぶし
from openpyxl.styles import GradientFill
gf = GradientFill(type='linear', stop=('ffffff', '888888'))
ws['C1'].fill = gf


 詳細は以下の「セルの塗りつぶし」を参照のこと。

けい線

from openpyxl.styles import Border, Side
side = Side(border_style='dashDot', color='000000')
border0 = Border(left=side, right=side, top=side, bottom=side)
border1 = Border(top=side, bottom=side)
ws['B4'].border = border0
ws['D4'].border = border1


border_styles = ['dashDot','dashDotDot', 'dashed','dotted', 'double','hair'
                'medium', 'mediumDashDot', 'mediumDashDotDot', 'mediumDashed'
                'slantDashDot', 'thick', 'thin']

for idx, style in enumerate(border_styles):
    side = Side(border_style=style, color='000000')
    border0 = Border(top=side, bottom=side, left=side, right=side)
    col_idx = f'{chr(ord("A") + (idx % 7) * 2)}'
    row_idx = idx // 7 + 14 + (idx // 7)
    cell_idx = f'{col_idx}{row_idx}'
    ws[cell_idx].border = border0
    ws[cell_idx].value = style
    ws[cell_idx].font = font


 詳細は以下の「けい線」を参照のこと。

セルの値の文字そろえ

from openpyxl.styles import Alignment
alignment = Alignment(horizontal='center', vertical='center')
ws['A1'].alignment = alignment


 詳細は以下の「セルの値の文字そろえ」を参照のこと。

セルの書式設定

ws['A2'].number_format = 'yyyy年mm月dd日'
ws['B2'].number_format = 'hh時mm分ss秒 AM/PM'

from openpyxl.styles.numbers import FORMAT_NUMBER_00, FORMAT_PERCENTAGE_00
ws['D2'].number_format = FORMAT_NUMBER_00
ws['E2'].number_format = FORMAT_PERCENTAGE_00


 詳細は以下の「セルの書式設定」を参照のこと。

サンプルのワークシート

from openpyxl import Workbook
from datetime import datetime

wb = Workbook()
ws = wb.active

header = ['日付', '時間', '名前', '年齢', 'おじさん度']
dt = datetime(2022, 2, 15, 12, 34, 56)
values = [dt.date(), dt.time(), 'かわさきしんじ', 123, .87]

for idx in range(1, 6):
    ws.cell(row=1, column=idx, value=header[idx-1])
    ws.cell(row=2, column=idx, value=values[idx-1])

wb.save('myworkbook.xlsx')


 本稿では上記のコードで作成したExcelワークシートを例として使用する(セルの幅や高さは適宜変更する)。

サンプルのワークシート サンプルのワークシート

書体の指定

 セルに表示される値の書体を変更するには、フォント名、フォントサイズ、文字色などを指定してopenpyxl.styles.Fontクラスのオブジェクトを作成し、それをセルのfont属性にセットする。

 以下に例を示す。

from openpyxl.styles import Font
header_font = Font(name='メイリオ', size=16, bold=True, color='000000ff')
value_font = Font(name='MS ゴシック')

for idx in range(5):
    r = chr(ord('A')+idx)
    ws[f'{r}1'].font = header_font
    ws[f'{r}2'].font = value_font


 一度にまとめて複数のセルのフォントを変更するときには、上の例のように個別にセルのfont属性をセットする必要がある。これは以下の他の書式設定でも同様だ。

 サンプルのワークシートに対して、これを行った結果を以下に示す。

フォントの設定が行われたワークシート フォントの設定が行われたワークシート

 Fontクラスのインスタンスを生成する際には以下のような引数を指定可能だ(一部)。「b/bold」は「b」「bold」のどちらを使用しても構わないことを意味する(他の引数も同様)。

引数 説明
name フォント名
sz/size フォントサイズ
b/bold ボールド体か否か(True/False)
i/italic イタリック体か否か(True/False)
strike/strikethrough 打ち消し線を引くか否か(True/False)
u/underline 下線の種類('none'/'single'/'double'/'singleAccounting'/'doubleAccounting')
vertAlign 上付き文字/下付き文字の指定('superscript'/'subscript'/'baseline')
color 文字色(6桁の16進数値、またはアルファ値を含む8桁の16進数値)
フォントに指定可能な属性(一部)

セルの塗りつぶし

 セルを塗りつぶすには、openpyxl.styles.PatternFillクラスまたはopenpyxl.styles.GradientFillクラスのオブジェクトを作成して、それをセルのfill属性にセットする。

 PatternFillクラスを使用した簡単な塗りつぶしの例を以下に示す。

from openpyxl.styles import PatternFill
pf = PatternFill(patternType='solid', fgColor='bbbb00')
ws['A1'].fill = pf


 ここではPatternFillクラスのインスタンス生成でpatternTypeに'solid'を、fgColorに'bbbb00'(暗めの黄色)を渡している。これはfgColorに指定した色のみでセルを塗りつぶすことを意味する。

 簡単な例をもう1つ以下に示す。これは、patternTypeに'darkUp'を、fgColorには'ffffff'を、bgColorには'ff0000'を指定している。'darkup'はfgColorの地に、左下から右上に向けた直線をbgColorに指定した色で引いていくことを意味する。

pf = PatternFill(patternType='darkUp', fgColor='ffffff', bgColor='ff0000')
ws['B1'].fill = pf


 上の2つの例を実行した結果を以下に示す。

セルの塗りつぶしを行った結果 セルの塗りつぶしを行った結果

 このように、fgColorとbgColorに塗りつぶしに使う色を、patternTypeに塗りつぶしのパターンを指定するのがPatternFillクラスの使い方だ。patternTypeにはさまざまなパターンを指定できる。以下のコードは、これらのパターンでどのような塗りつぶしが行われるかを試すコードだ。

fgColor= 'FF92D050'
bgColor = 'FFFFC000'
ptypes = ['solid', 'darkGray', 'mediumGray', 'lightGray', 'gray125'
          'gray0625', 'darkHorizontal', 'darkVertical', 'darkDown', 'darkUp',
          'darkGrid', 'darkTrellis', 'lightHorizontal', 'lightVertical',
          'lightDown', 'lightUp', 'lightGrid', 'lightTrellis']
font = Font(size=14, color='FF0000')

for idx, ptype in enumerate(ptypes):
    ptn = PatternFill(patternType=ptype, fgColor=fgColor, bgColor=bgColor)
    col_idx = chr(ord('A') + (idx % 6))
    row_idx = idx // 6 + 6
    cell_idx = f'{col_idx}{row_idx}'
    ws[cell_idx].fill = ptn
    ws[cell_idx].value = ptypes[idx]
    ws[cell_idx].font = font


 実行した結果を以下に示す。

さまざまな塗りつぶしパターン さまざまな塗りつぶしパターン

 塗りつぶしパターンを指定するのではなく、グラデーションを用いてセルを塗りつぶすこともできる。これにはもう1つのGradientFillクラスを使用する。簡単な例を以下に示す。セルを塗りつぶすには、先ほどと同じく、GradientFillクラスのオブジェクトを生成して、それをセルのfill属性にセットすればよい。

from openpyxl.styles import GradientFill
gf = GradientFill(type='linear', stop=('ffffff', '888888'))
ws['C1'].fill = gf


 このコードでは、GradientFillクラスのインスタンスを生成する際に、typeに'linear'を、stopにグラデーションの先頭と最後の色('ffffff'と'888888')を指定している。これにより、白からグレーに滑らかに変化するグラデーションを使ってセルが塗りつぶされる。

白からグレーへのグラデーションでセルが塗りつぶされたところ 白からグレーへのグラデーションでセルが塗りつぶされたところ

 グラデーションのかかり方はデフォルトでは左端がグラデーションの最初の色となり、右端がグラデーションの最後の色となる。この方向はdegree引数に角度を与えることで変更できる。また、なお、stopには3個以上のRGB値を渡すこともできる。以下の例では、3色(黒、赤、白)をstop引数に渡している。この場合は黒→赤→白という順でグラデーションがかかる。

stop = ('000000', 'ff0000', 'ffffff')
degrees = (0, 45, 90)
for idx, degree in enumerate(degrees):
    fill = GradientFill(type='linear', stop=stop, degree=degree)
    col_idx = chr(idx + ord('A'))
    cell = ws[f'{col_idx}10'].fill = fill


 この例では、degreesに0、45、90を指定しているので、それらに応じてグラデーションのかかり方が右→左、左上→右下、上→下と変わっている。

グラデーションのかかり方の違い グラデーションのかかり方の違い

 typeには'linear'以外に'path'を指定できる。この場合は、top、left、right、bottomに指定した値に応じて、どんなグラデーションになるかが変わる。以下に幾つか例を示す。

stop = ('000000', 'ffffff')
fill = GradientFill(type='path', stop=stop, top=0.5, left=0.5)
ws['A12'].fill = fill
fill = GradientFill(type='path', stop=stop, top=0.2, left=0.2)
ws['B12'].fill = fill
fill = GradientFill(type='path', stop=stop, top=0.4, left=0.4, right=0.6, bottom=0.6)
ws['C12'].fill = fill


 このコードを実行すると、以下のようなグラデーションがかかる。

実行結果 実行結果

けい線

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。