PythonでExcelファイルを編集できるOpenpyxlでワークブック・ワークシート・セルを操作する方法

Python

PythonでExcelファイルを操作するには、openpyxlライブラリが便利です。
Pythonを使って、Excelを一切開かずにセルの操作を行うことができるようになります。

openpyxl最大のメリットは、他のPythonライブラリの機能を組み合わせる処理ができること。
他の機能と組み合わせることで、Webスクレイピング→Excelに自動記入といったこともできます。

今回はopenpyxlを使った、ワークブックからセルまでExcelファイルを操作する方法を紹介します。

Excelファイルをワークブックとして読み込む

openpyxlライブラリでは、ExcelファイルをWorkbookオブジェクトとして扱います。

まずはじめに、ワークブックを作成または読み込んで、Workbookオブジェクトを取得します。
今回はWorkbookオブジェクトを変数wbとして、以降の説明を進めていきます。

ワークブックを新規作成

openpyxl.Workbook()
Workbook()で、Workbookオブジェクトを新規作成します。
ワークブックを作成すると、自動でワークシートも1つ作成されます。

既存のワークブックを読み込む

openpyxl.load_Workbook('開きたいファイルパス')
load_workbook()は、Excelファイルを読み込んで、Workbookオブジェクトを返す関数です。
MicrosoftOffice2010以降の以下の拡張子のExcelファイルに対応しています。

  • xlsx
  • xlsm
  • xltx
  • xltm

ワークブックを保存

wb.save('保存後のファイル名')
wb.save()で、WorkbookオブジェクトをExcelファイルで保存します。
引数には保存後のExcelファイルの名前を指定することができます。

ワークブックの中からワークシートを選択

ワークブックを取得したら、次はワークシートを取り出します。
Pythonからワークシートを操作するには、Worksheetオブジェクトを取得します。

ws = wb['シート名']
ワークシートは上記のようにして選択できます。
今回はWorksheetオブジェクトを変数wsとして、以降の処理を進めていきます。

ワークシートを新規作成

wb.create_sheet(index=インデックス番号, title=’シート名’)
wb.create_sheet()で、ワークブックにWorksheetオブジェクトを新規作成します。
引数を使うと、以下のように指定した条件でワークシートを作成することがもできます。

  • 新規シートを右端に作成
  • wb.create_sheet()

  • 新規シートを左端に作成
  • wb.create_sheet(0)

  • シート名を指定して作成
  • wb.create_sheet(title='シート名')

既存のワークシートを選択

wb.active
wb.activeで、ワークブックにあるアクティブ中のワークシートを取得できます。
返り値はWorksheetオブジェクトで、コマンドを与えることで操作可能です。

ワークシートをコピー

wb.copy_worksheet(コピーしたいワークシート)
copy_worksheet()で、引数に指定したワークシートをコピーします。
引数には、コピーしたいシートのWorksheetオブジェクトを指定します。

ワークシートを削除

wb.remove_sheet(削除したいワークシート)
remove_sheet()で、引数に指定したワークシートを削除します。
引数には、削除したいシートのWorksheetオブジェクトを指定します。

ワークシート名を取得

wb.get_sheet_names()
wb.get_sheet_names()で、ワークブックにあるワークシート名を取得できます。
返り値はリスト型で、ワークブックに含まれる全てのワークシート名が一覧で取得されます。

ワークシートの列数を取得

ws.min_column
ws.min_columnで、ワークシートにある列の最小値を取得できます。

ws.max_column
ws.max_columnで、ワークシートにある列の最大値を取得できます。

ワークシートの行数を取得

ws.min_row
ws.min_columnで、ワークシートにある行の最小値を取得できます。

ws.max_row
ws.max_columnで、ワークシートにある行の最大値を取得できます。

ワークシート名を変更

ws.title = '変更後のワークシート名'
ws.titleで、ワークシートのシート名を取得できます。
このtitle属性へ新しい文字列を与えることで、ワークシート名を変更可能です。

ワークシートを移動

wb.move_sheet(移動したいワークシート, offset=移動する値)
move_worksheet()で、引数に指定したワークシートを移動します。
引数には、移動したいシートのWorksheetオブジェクト移動したいシートの数を指定します。
offsetに指定した数だけ、指定したワークシートが右に移動します。

ワークシートから編集したいセルを選択

ワークシートの次は、その中にあるセルを取得します。
PythonでExcelのセルを操作するには、Cellオブジェクトを取得します。

cell = ws['セル番号']
セルは上記のようにして、Excel座標のセル番号で選択できます。
セル番号とは、[‘A1’]のようにアルファベットの列番号数字の行番号を組み合わせた表記です。

今回はCellオブジェクトを変数cellとして、以降の処理を進めていきます。

行数・列数でセルを選択する

ws.cell(row=行数, column=列数)

コードを数字で記述したい場合は、指定した行数・列数でセルを取得することもできます。
セル番号の方がわかりやすいですが、複雑な処理をしたい時は行数・列数で指定するこちらが便利です。

複数のセルを選択する方法

セルを選択する方法 コード例 返り値
セル番号 ws[‘セル番号1’:’セル番号2’] タプル型
行数・列数 ws.iter_rows(min_row, max_row, min_col, max_col) ジェネレータ
行数 list(ws.rows)[行数] リスト型
列数 list(ws.columns)[列数] リスト型

複数のセルを選択したい場合も、セル番号や行数・列数を使った4パターンで選択できます。
ただし返り値のデータ型がそれぞれ違うため、その後の処理が変わる点に注意です。

  • セル番号で指定した範囲のセルを選択する
  • ws['1つ目のセル番号':'2つ目のセル番号']
    返り値はタプル型で、2次元のタプル型の中にCellオブジェクトが格納されています。
    タプル型はデータの絞り込みが容易なので、選択した後の処理は簡単です。

  • 行数・列数で指定した範囲のセルを選択する
  • ws.iter_rows(min_row=行の最小値, max_row=行の最大値, min_col=列の最小値, max_col=列の最大値)
    返り値はジェネレータですが、list()でCellオブジェクトを要素とするリスト型にできます。
    最大値(max_rowとmax_col)を入力しない場合は、値の存在するセルまでが選択されます。
    for文などでデータを取り出す必要があるので、選択した後の処理がやや面倒です。

  • 指定した行・列のセルを選択する
  • list(ws.rows)[行数]
    list(ws.columns)[列数]
    ある特定の1列・1行だけを指定して、行・列にあるcellオブジェクトをリスト型で返します。
    こちらもCellオブジェクトを取り出す必要があるので、選択した後の処理がやや面倒です。

Cellオブジェクトの属性でセルを操作

Cellオブジェクトには、属性としてセルについての情報が格納されています。
以下のような属性を使って、セルに関する情報を取得・編集することができます。

セルの番号(Excel座標) cell.coordinate
セルの行数(縦軸の座標) cell.row
セルの列数(横軸の座標) cell.column
セルの値 cell.value
セルのフォント cell.font
セルの背景色 cell.fill
セルの罫線 cell.border

セルに値を書き込む

cell.value = '入力したい値'
セルの値を変更するには、value属性に入力したい値を指定します。
既にデータが存在するセルには上書き処理、データがないセルには新しいセルが追加されます。

セルのフォントを変更する

cell.font = Font(name='フォント名', size=サイズ, color='色コード')
フォントの色を指定するには、Fontオブジェクトをfont属性に指定します。
Fontオブジェクトは、以下のようにして作成することができます。

  1. Fontオブジェクトを作成するため、Fontクラスをインポートしておきます。
  2. from openpyxl.styles import Font

  3. Font()関数で、フォントの書式を示したFontオブジェクトを作成します。
  4. font = Font(name='メイリオ', size=14, bold=False, italic=False, underline='single', strike=False, color='FF000000')
    上記の例のように、Font()関数の引数には設定したいフォントを記述します。
    以下の引数で、フォントについての情報を設定することができます。

    キーワード引数 内容
    name 指定した文字フォントに変更
    size 指定した数値に文字サイズを変更
    bold 文字を太字に変更(Trueで太字、Falseでそのまま)
    italic 文字を斜体に変更(Trueで斜体、Falseでそのまま)
    underline 下線を追加(’single’で一重線、’double’で二重線)
    strike 打ち消し線を追加(Trueで打ち消し線を追加、Falseでそのまま)
    color 指定した色コードに文字色を変更


    ↑フォントを変更する引数の一覧と、使用例の画像です。

セルの文字の位置を変更する

cell.alignment = Alignment(horizontal='横方向の位置', vertical='縦方向の位置')
セルの文字の位置を変えるには、Alignmentオブジェクトをalignment属性に指定します。
Alignmentオブジェクトは、以下のように作成することができます。

  1. Alignmentオブジェクトの作成するため、Alignmentクラスをインポートします。
  2. from openpyxl.styles import Alignment

  3. Alignment()関数で文字の位置を指定するAlignmentオブジェクトを作成します。
  4. Alignment(horizontal='横方向の位置', vertical='縦方向の位置')
    horizontalには、左揃えや右揃えといった横方向の位置を指定します。
    verticalには、上揃えや下揃えなど下方向の位置を指定できます。

    horizontal 横方向の位置
    left 左揃え
    center 中央揃え
    distributed 均等割り付け
    general 標準
    justify 両端揃え
    centerContinuous 選択範囲内で中央
    fill 繰り返し
    right 右揃え
    vertical 縦方向の位置
    bottom 下揃え
    center 中央揃え
    distributed 均等割り付け
    justify 両端揃え
    top 上揃え
    textRotation 文字を回転する角度
    90 反時計回りに90°
    180 反時計回りに180°
    wrap_text 文字の改行
    True 改行する
    False 改行しない

セルの背景色を変更する

cell.fill = PatternFill(patternType='セルの塗り方', fgColor='セルの背景色')
セルの背景色を変更するには、PatternFillオブジェクトをfill属性に指定します。

  1. PatternFillオブジェクトの作成には、PatternFillクラスをインポートしておきます。
  2. from openpyxl.styles import PatternFill

  3. PatternFill()関数で塗り方について指定したPatternFillオブジェクトを作成します。
  4. PatternFill(patternType='セルの塗り方', fgColor='セルの背景色')
    patterntypeには、ベタ塗りや斜線といった塗り方のパターンを指定します。
    fgColorでは、塗りたい色をaRGBの16進数のカラーコードで指定できます。

    patternType セルの塗り方
    solid 単色
    gray0625 6.25%灰色
    gray125 12.5%灰色
    lightGray 25%灰色
    mediumGray 50%灰色
    darkGray 75%灰色
    darkVertical 縦縞
    darkHorizontal 横縞
    lightVertical 細い縦縞
    lightHorizontal 細い横縞
    lightGrid 細い横格子
    lightUp 細い右上がり斜線縞
    lightTrellis 細い右上がり斜線格子
    darkUp 右上がり斜線縞
    darkGrid 右上がり斜線格子
    darkTrellis 太い右上がり斜線格子
    lightDown 右下がり斜線縞
    darkDown 右下がり斜線縞


    ↑セルの背景色を変更する引数の一覧と、使用例の画像です。

セルの罫線を変更する

cell.border = Border(left, right, top, bottom)
セルの罫線を変更するには、Borderオブジェクトをborder属性に指定します。
Borderオブジェクトは、以下の手順で作成することができます。

  1. Borderオブジェクトを作成するため、Borderクラス・Sideクラスをインポートします。
  2. from openpyxl.styles import Border, Side

  3. Side()関数で罫線の書式を指定するSideオブジェクトを作成します。
  4. Side(style='罫線の書式', color='罫線の色コード')
    styleには、罫線の太さといった書式を指定することができます。
    colorには、罫線の色を色コードで指定することができます。

    style 罫線の種類
    None 罫線なし
    Dotted 点線
    Dashed 破線
    DashDotDot 二点鎖線
    DashDot 一点鎖線
    Hair 極細線
    Thin 細線
    MediumDashDotDotDot 中二点鎖線
    SlantedDashDat 一点鎖斜線
    MediumDashDot 中一点鎖線
    MediumDashed 中細破線
    Medium 中細線
    Thick 太線
    Double 二重線


    ↑セルの罫線を変更する引数の一覧と、使用例の画像です。

  5. Border()関数で、罫線の配置を指定するBorderオブジェクトを作成します。
  6. Border(left=左の罫線, right=右の罫線, top=上の罫線, bottom=下の罫線)
    4つの引数には、それぞれ上下左右の罫線としてSideオブジェクトを指定します。

セルの幅を変更する

ws.row_dimensions[行数].height = 幅サイズ
ws.column_dimensions["列"].width = 幅サイズ
セルの幅を変更するには、ワークシートの行または列のheight属性とwidth属性を変更します。

プログラムを使ってExcelファイルを作成してみる

最後はopenpyxlを使って、実際にExcelファイルを作成してみましょう。

この下にあるプログラムを実行すると、サンプルのExcelファイル「test.xlsx」が新規作成されます。
こちらのサンプルは今回紹介したセルの編集方法を全て網羅しているので、ぜひ参考にしてみてください。

#①ライブラリをインポート
import openpyxl
from openpyxl.styles import Font,Alignment,PatternFill,Border,Side

#②ワークブックを作成
wb = openpyxl.Workbook()
ws = wb.active
ws.title = 'フォント'

#③セルの文字フォントの操作
cell1 = ws['A1']
font1 = Font(name='メイリオ')
cell1.font = font1
cell1.value  = 'フォント'

cell2 = ws['B1']
font2 = Font(size=14)
cell2.font = font2
cell2.value  = 'サイズ'

cell3 = ws['C1']
font3 = Font(bold=True)
cell3.font = font3
cell3.value  = '太字'

cell4 = ws['A2']
font4 = Font(italic=True)
cell4.font = font4
cell4.value  = '斜体'

cell5 = ws['B2']
font5 = Font(underline='single')
cell5.font = font5
cell5.value  = '下線'

cell6 = ws['C2']
font6 = Font(strike=True)
cell6.font = font6
cell6.value  = '打ち消し線'

cell7 = ws['D2']
font7 = Font(color='FF00FF')
cell7.font = font7
cell7.value  = '文字の色'

#④セルの文字の位置の操作
wb.create_sheet(index=2, title='文字の位置')
ws2 = wb['文字の位置']

cell1_2 = ws2['A1']
alignment1 = Alignment(horizontal='left')
cell1_2.alignment = alignment1
cell1_2.value  = 'left'

cell2_2 = ws2['B1']
alignment2 = Alignment(horizontal='center')
cell2_2.alignment = alignment2
cell2_2.value  = 'center'

cell3_2 = ws2['C1']
alignment3 = Alignment(horizontal='distributed')
cell3_2.alignment = alignment3
cell3_2.value  = 'distributed'

cell4_2 = ws2['D1']
alignment4 = Alignment(horizontal='general')
cell4_2.alignment = alignment4
cell4_2.value  = 'general'

cell5_2 = ws2['E1']
alignment5 = Alignment(horizontal='justify')
cell5_2.alignment = alignment5
cell5_2.value  = 'justify'

cell6_2 = ws2['F1']
alignment6 = Alignment(horizontal='centerContinuous')
cell6_2.alignment = alignment6
cell6_2.value  = 'centerContinuous'

cell7_2 = ws2['G1']
alignment7 = Alignment(horizontal='fill')
cell7_2.alignment = alignment7
cell7_2.value  = 'fill'

cell8_2 = ws2['H1']
alignment8 = Alignment(horizontal='right')
cell8_2.alignment = alignment8
cell8_2.value  = 'right'

cell9_2 = ws2['A2']
alignment9 = Alignment(vertical = 'bottom')
cell9_2.alignment = alignment9
cell9_2.value  = 'bottom'

cell10_2 = ws2['B2']
alignment10 = Alignment(vertical = 'center')
cell10_2.alignment = alignment10
cell10_2.value  = 'center'

cell11_2 = ws2['C2']
alignment11 = Alignment(vertical = 'distributed')
cell11_2.alignment = alignment11
cell11_2.value  = 'distributed'

cell12_2 = ws2['D2']
alignment12 = Alignment(vertical = 'justify')
cell12_2.alignment = alignment12
cell12_2.value  = 'justify'

cell13_2 = ws2['E2']
alignment13 = Alignment(vertical = 'top')
cell13_2.alignment = alignment13
cell13_2.value  = 'top'

cell14_2 = ws2['A3']
alignment14 = Alignment(textRotation = 90)
cell14_2.alignment = alignment14
cell14_2.value  = '90'

cell15_2 = ws2['B3']
alignment15 = Alignment(textRotation = 180)
cell15_2.alignment = alignment15
cell15_2.value  = '180'

cell16_2 = ws2['A4']
alignment16 = Alignment(wrap_text=True)
cell16_2.alignment = alignment16
cell16_2.value  = 'wrap_text=True'

cell17_2 = ws2['B4']
alignment17 = Alignment(wrap_text=False)
cell17_2.alignment = alignment17
cell17_2.value  = 'wrap_text=False'

#⑤セルの背景色の操作
wb.create_sheet(index=3, title='背景色')
ws3 = wb['背景色']

cell1_3 = ws3['A1']
fill1 = PatternFill(patternType='solid', fgColor='808080')
cell1_3.fill = fill1

cell2_3 = ws3['B1']
fill2 = PatternFill(patternType='gray0625', fgColor='808080')
cell2_3.fill = fill2

cell3_3 = ws3['C1']
fill3 = PatternFill(patternType='gray125', fgColor='808080')
cell3_3.fill = fill3

cell4_3 = ws3['A2']
fill4 = PatternFill(patternType='lightGray', fgColor='808080')
cell4_3.fill = fill4

cell5_3 = ws3['B2']
fill5 = PatternFill(patternType='mediumGray', fgColor='808080')
cell5_3.fill = fill5

cell6_3 = ws3['C2']
fill6 = PatternFill(patternType='darkGray', fgColor='808080')
cell6_3.fill = fill6

cell7_3 = ws3['A3']
fill7 = PatternFill(patternType='darkVertical', fgColor='808080')
cell7_3.fill = fill7

cell8_3 = ws3['B3']
fill8 = PatternFill(patternType='darkHorizontal', fgColor='808080')
cell8_3.fill = fill8

cell9_3 = ws3['C3']
fill9 = PatternFill(patternType='lightVertical', fgColor='808080')
cell9_3.fill = fill9

cell10_3 = ws3['A4']
fill10 = PatternFill(patternType='lightHorizontal', fgColor='808080')
cell10_3.fill = fill10

cell11_3 = ws3['B4']
fill11 = PatternFill(patternType='lightGrid', fgColor='808080')
cell11_3.fill = fill11

cell12_3 = ws3['C4']
fill12 = PatternFill(patternType='lightUp', fgColor='808080')
cell12_3.fill = fill12

cell13_3 = ws3['A5']
fill13 = PatternFill(patternType='lightTrellis', fgColor='808080')
cell13_3.fill = fill13

cell14_3 = ws3['B5']
fill14 = PatternFill(patternType='darkUp', fgColor='808080')
cell14_3.fill = fill14

cell15_3 = ws3['C5']
fill15 = PatternFill(patternType='darkGrid', fgColor='808080')
cell15_3.fill = fill15

cell16_3 = ws3['A6']
fill16 = PatternFill(patternType='darkTrellis', fgColor='808080')
cell16_3.fill = fill16

cell17_3 = ws3['B6']
fill17 = PatternFill(patternType='lightDown', fgColor='808080')
cell17_3.fill = fill17

cell18_3 = ws3['C6']
fill18 = PatternFill(patternType='darkDown', fgColor='808080')
cell18_3.fill = fill18

#⑥セルの罫線の操作
wb.create_sheet(index=4, title='罫線')
ws4 = wb['罫線']

cell1_4 = ws4['A1']
side1 = Side(style='thin', color='000000')
cell1_4.border = Border(left=side1, right=side1, top=side1, bottom=side1)

cell2_4 = ws4['B1']
side2 = Side(style='dashDot', color='000000')
cell2_4.border = Border(left=side2, right=side2, top=side2, bottom=side2)

cell3_4 = ws4['C1']
side3 = Side(style='dashDotDot', color='000000')
cell3_4.border = Border(left=side3, right=side3, top=side3, bottom=side3)

cell4_4 = ws4['A2']
side4 = Side(style='double', color='000000')
cell4_4.border = Border(left=side4, right=side4, top=side4, bottom=side4)

cell5_4 = ws4['B2']
side5 = Side(style='hair', color='000000')
cell5_4.border = Border(left=side5, right=side5, top=side5, bottom=side5)

cell6_4 = ws4['C2']
side6 = Side(style='dotted', color='000000')
cell6_4.border = Border(left=side6, right=side6, top=side6, bottom=side6)

cell7_4 = ws4['A3']
side7 = Side(style='mediumDashDotDot', color='000000')
cell7_4.border = Border(left=side7, right=side7, top=side7, bottom=side7)

cell8_4 = ws4['B3']
side8 = Side(style='dashed', color='000000')
cell8_4.border = Border(left=side8, right=side8, top=side8, bottom=side8)

cell9_4 = ws4['C3']
side9 = Side(style='mediumDashed', color='000000')
cell9_4.border = Border(left=side9, right=side9, top=side9, bottom=side9)

cell10_4 = ws4['A4']
side10 = Side(style='slantDashDot', color='000000')
cell10_4.border = Border(left=side10, right=side10, top=side10, bottom=side10)

cell11_4 = ws4['B4']
side11 = Side(style='thick', color='000000')
cell11_4.border = Border(left=side11, right=side11, top=side11, bottom=side11)

cell12_4 = ws4['C4']
side12 = Side(style='thin', color='000000')
cell12_4.border = Border(left=side12, right=side12, top=side12, bottom=side12)

cell13_4 = ws4['A5']
side13 = Side(style='medium', color='000000')
cell13_4.border = Border(left=side13, right=side13, top=side13, bottom=side13)

cell14_4 = ws4['B5']
side14 = Side(style='mediumDashDot', color='000000')
cell14_4.border = Border(left=side14, right=side14, top=side14, bottom=side14)

#⑦ワークブックをExcelファイルとして保存
wb.save('test.xlsx')

コメント

タイトルとURLをコピーしました