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オブジェクトは、以下のようにして作成することができます。
- Fontオブジェクトを作成するため、Fontクラスをインポートしておきます。
- Font()関数で、フォントの書式を示したFontオブジェクトを作成します。
from openpyxl.styles import Font
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オブジェクトは、以下のように作成することができます。
- Alignmentオブジェクトの作成するため、Alignmentクラスをインポートします。
- Alignment()関数で文字の位置を指定するAlignmentオブジェクトを作成します。
from openpyxl.styles import Alignment
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属性に指定します。
- PatternFillオブジェクトの作成には、PatternFillクラスをインポートしておきます。
- PatternFill()関数で塗り方について指定したPatternFillオブジェクトを作成します。
from openpyxl.styles import PatternFill
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オブジェクトは、以下の手順で作成することができます。
- Borderオブジェクトを作成するため、Borderクラス・Sideクラスをインポートします。
- Side()関数で罫線の書式を指定するSideオブジェクトを作成します。
- Border()関数で、罫線の配置を指定するBorderオブジェクトを作成します。
from openpyxl.styles import Border, Side
Side(style='罫線の書式', color='罫線の色コード')
styleには、罫線の太さといった書式を指定することができます。
colorには、罫線の色を色コードで指定することができます。
style | 罫線の種類 |
None | 罫線なし |
Dotted | 点線 |
Dashed | 破線 |
DashDotDot | 二点鎖線 |
DashDot | 一点鎖線 |
Hair | 極細線 |
Thin | 細線 |
MediumDashDotDotDot | 中二点鎖線 |
SlantedDashDat | 一点鎖斜線 |
MediumDashDot | 中一点鎖線 |
MediumDashed | 中細破線 |
Medium | 中細線 |
Thick | 太線 | Double | 二重線 |
↑セルの罫線を変更する引数の一覧と、使用例の画像です。
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')
コメント