OpenPyXLを使って、Excelワークシートのフォント指定/塗りつぶし/けい線/文字そろえ/値の表示方法など、セルの書式設定を行う方法を紹介する。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
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.