Excel書き込み (OpenPyXL) | Python-izm

Excel書き込み (OpenPyXL)

ここではExcel操作ライブラリであるOpenPyXLを用いたExcelファイルの書き込みに関連する機能について触れています。

ブックの保存とシートの追加

まずはブックを作成・保存をしてみましょう。ブック内に最低1つはシートが必要となりますが、ブックを作成した際Sheetというシート名で自動的に作成されます。次の例ではNewSheet_1というシート名で新たに作成しているため、SheetNewSheet_1という2つのシートを持つブックが保存されます。

import openpyxl

book = openpyxl.Workbook()
book.create_sheet('NewSheet_1')

book.save('sample.xlsx')

openpyxlモジュールをインポート後、Workbookクラスを生成します。WorkbookへNewSheet_1という名前のシートを追加し、saveでファイル名を指定して保存します。

セル値の設定

次はセル値の設定です。左上からのインデックス値を指定する方法と、<列><行>のようなセル指定を行う方法があります。

import openpyxl

book = openpyxl.Workbook()

active_sheet = book.active
active_sheet.cell(column=1, row=1, value='write A1')
active_sheet['A2'] = 'write A2'

book.save('sample.xlsx')

activeにはブック内において現在選択されているシート(アクティブなシート)が格納されています。先に述べた通り、ブックを作成した際Sheetというシート名で自動的に作成されるため、例のように特にシートを追加、選択しない限りはSheetが取得できます。6行目では列1、行1のセルに対して値を設定しています。開始値は0ではなく1なので注意してください(列1、行1の指定で最も左上のセル「A1」が対象)。また7行目のようにExcel上でも利用可能な指定方法で値を設定することもできます(「A2」のような「A列の2行目」という指定方法)。

列幅設定

列幅の設定も可能です。先程のソースコードに少し追加してみましょう。

import openpyxl

book = openpyxl.Workbook()

active_sheet = book.active
active_sheet.cell(column=1, row=1, value='write A1')
active_sheet['A2'] = 'write A2'

active_sheet.column_dimensions['A'].width = 50

book.save('sample.xlsx')

column_dimensionsを用いて幅を設定します。保存されたファイルを開いてみると「A」の列幅が大きくなっている事を確認出来ると思います。

フォント設定

セルのフォント設定は下記の通りです。Fontへ各属性の設定を行います。

import openpyxl

book = openpyxl.Workbook()

active_sheet = book.active
active_sheet.cell(column=1, row=1, value='write A1')
active_sheet['A2'] = 'write A2'

cell_A1 = active_sheet['A1']
cell_A1.font = openpyxl.styles.Font(bold=True)

font_A2 = openpyxl.styles.Font()
font_A2.bold = True
font_A2.color = openpyxl.styles.colors.BLUE
font_A2.name = 'Arial'
active_sheet['A2'].font = font_A2

book.save('sample.xlsx')

セル「A1」を太字設定、セル「A2」を太字、文字色(青)、Arialフォントを設定しています。少ない設定ならば「A1」のように、多めの設定であれば「A2」のような形で利用するとよいでしょう。

ボーダー設定

罫線を引く事も可能です。Borderへ各属性の設定を行います。

import openpyxl
from openpyxl.styles.borders import (
    Border, 
    Side,
    BORDER_THIN,
    BORDER_DOTTED,
    BORDER_DOUBLE,
    BORDER_MEDIUM,
)

book = openpyxl.Workbook()

active_sheet = book.active
active_sheet.cell(column=2, row=2, value='write B2')
active_sheet['C3'] = 'write C3'

active_sheet['B2'].border = Border(
    left=Side(style=BORDER_THIN),
    right=Side(style=BORDER_THIN),
    top=Side(style=BORDER_THIN),
    bottom=Side(style=BORDER_THIN),
)

border_C3 = Border()
border_C3.left = Side(style=BORDER_DOTTED)
border_C3.right = Side(style=BORDER_DOUBLE)
border_C3.top = Side(style=BORDER_MEDIUM)
border_C3.bottom = Side(style=BORDER_THIN)
active_sheet['C3'].border = border_C3

book.save('sample.xlsx')

セル「B2」には上下左右すべて同じ罫線を適用し、「C3」ではそれぞれ異なる罫線を設定している形です。指定可能なstyleは例で使用した以外にも下記にようなものがあります。

  • BORDER_NONE
  • BORDER_DASHDOT
  • BORDER_DASHDOTDOT
  • BORDER_DASHED
  • BORDER_HAIR
  • BORDER_MEDIUMDASHDOT
  • BORDER_MEDIUMDASHDOTDOT
  • BORDER_MEDIUMDASHED
  • BORDER_SLANTDASHDOT
  • BORDER_THICK

塗りつぶし設定

セルの塗りつぶし設定は下記の通りです。PatternFillへ各属性の設定を行います。

import openpyxl
from openpyxl.styles.colors import (
    Color,
    BLUE,
    RED,
    GREEN,
)
from openpyxl.styles.fills import (
    PatternFill,
    FILL_SOLID,
    FILL_PATTERN_MEDIUMGRAY,
    FILL_PATTERN_GRAY125,
)

book = openpyxl.Workbook()

active_sheet = book.active
active_sheet.cell(column=2, row=2, value='write B2')
active_sheet['C3'] = 'write C3'
active_sheet['D4'] = 'write D4'

active_sheet['B2'].fill = PatternFill(
    patternType=FILL_SOLID,
    fgColor=openpyxl.styles.colors.Color(rgb=BLUE),
)


fill_C3 = PatternFill()
fill_C3.patternType = FILL_PATTERN_MEDIUMGRAY
fill_C3.fgColor = RED
active_sheet['C3'].fill = fill_C3

fill_D4 = PatternFill()
fill_D4.patternType = FILL_PATTERN_GRAY125
fill_D4.fgColor = GREEN
active_sheet['D4'].fill = fill_D4

book.save('sample.xlsx')

「B2」で設定しているFILL_SOLIDは完全な塗りつぶしで、「C3」「D4」ではそれぞれ異なるパターン(FILL_PATTERN_MEDIUMGRAYFILL_PATTERN_GRAY125を設定)で赤、緑を設定している形です。指定可能なpatternTypeは例で使用した以外にも下記にようなものがあります。

  • FILL_PATTERN_DARKDOWN
  • FILL_PATTERN_DARKGRAY
  • FILL_PATTERN_DARKGRID
  • FILL_PATTERN_DARKHORIZONTAL
  • FILL_PATTERN_DARKTRELLIS
  • FILL_PATTERN_DARKUP
  • FILL_PATTERN_DARKVERTICAL
  • FILL_PATTERN_GRAY0625
  • FILL_PATTERN_LIGHTDOWN
  • FILL_PATTERN_LIGHTGRAY
  • FILL_PATTERN_LIGHTGRID
  • FILL_PATTERN_LIGHTHORIZONTAL
  • FILL_PATTERN_LIGHTTRELLIS
  • FILL_PATTERN_LIGHTUP
  • FILL_PATTERN_LIGHTVERTICAL

文字寄せ設定

Alignmentクラスを利用し、セル内文字列の寄せ方を指定します。

import openpyxl
from openpyxl.styles import Alignment

book = openpyxl.Workbook()

active_sheet = book.active
active_sheet.cell(column=2, row=2, value='write B2')
active_sheet['C3'] = 'write C3'
active_sheet['D4'] = 'write D4'
active_sheet['E5'] = 'write E5'

active_sheet['B2'].alignment = Alignment(
    horizontal='center',
    vertical='bottom',
)

align_C3 = Alignment()
align_C3.horizontal = 'right'
align_C3.vertical = 'bottom'
active_sheet['C3'].alignment = align_C3

align_D4 = Alignment()
align_D4.horizontal = 'left'
align_D4.vertical = 'center'
active_sheet['D4'].alignment = align_D4

align_E5 = Alignment()
align_E5.horizontal = 'left'
align_E5.vertical = 'top'
active_sheet['E5'].alignment = align_E5

book.save('sample.xlsx')

セル「B2」は横方向の中央寄せ、「C3」は横方向の右寄せ、「D4」は縦方向の中央寄せ、「E5」は縦方向の上寄せになります。

Excel関数の埋め込み

Excel関数の埋め込みも可能です。代表的なExcel関数であるSUM関数を埋め込んでみましょう。

import openpyxl
from openpyxl.styles import Alignment

book = openpyxl.Workbook()

active_sheet = book.active
active_sheet['B2'] = 1
active_sheet['B3'] = 10
active_sheet['B4'] = 100
active_sheet['B5'] = '=sum(B2,B3,B4)'

book.save('sample.xlsx')

セル「B2」「B3」「B4」の合計値が「B5」へ表示されます。