日常業務と最も結びつきの強いアプリケーションの一つであるEXCEL。日々のEXCEL作業を自動化することができればどれくらいの効率化につながるか計り知れません。まずは本文書を通して、Pythonを使ったEXCELファイルの操作方法を確認していきましょう。

openpyxlライブラリ

openpyxlはEXCELファイルを操作するためのPythonライブラリです。

openpyxlライブラリのインストール

パッケージ管理システムpipを使ってopenpyxlライブラリのインストールを行います。


>pip install openpyxl
Collecting openpyxl
  Downloading https://files.pythonhosted.org/packages/ba/06/b899c8867518df19e242d8cbc82d4ba210f5ffbeebb7704c695e687ab59c/openpyxl-2.6.2.tar.gz (173kB)
    100% |████████████████████████████████| 174kB 3.8MB/s
Collecting jdcal (from openpyxl)
  Downloading https://files.pythonhosted.org/packages/f0/da/572cbc0bc582390480bbd7c4e93d14dc46079778ed915b505dc494b37c57/jdcal-1.4.1-py2.py3-none-any.whl
Collecting et_xmlfile (from openpyxl)
  Downloading https://files.pythonhosted.org/packages/22/28/a99c42aea746e18382ad9fb36f64c1c1f04216f41797f2f0fa567da11388/et_xmlfile-1.0.1.tar.gz
Installing collected packages: jdcal, et-xmlfile, openpyxl
  Running setup.py install for et-xmlfile ... done
  Running setup.py install for openpyxl ... done
Successfully installed et-xmlfile-1.0.1 jdcal-1.4.1 openpyxl-2.6.2

EXCELファイルの操作

ワークブックとワークシート

説明の中でワークブックとワークシートいう名前が何度も出てきます。ワークブックはEXCELファイルそのもののことを言います。

ワークシートはEXCELファイルを開いたときに表示される画面です。1つのワークブックに複数のワークシートを作成することができ、ワークシートは下部にあるタブで切り替えることができます。

EXCELのワークシート
EXCELのワークシート

はじめてのEXCEL操作

公式ホームページにサンプルが掲載されているので、サンプルをコピー&ペーストして動作確認を行いましょう。


from openpyxl import Workbook
#1 create a new workbook(新規のワークブック作成)
wb = Workbook()

#2 grab the active worksheet(開いているワークシートを選択)
ws = wb.active

#3 Data can be assigned directly to cells(セルに直接データを挿入)
ws['A1'] = 42

#4 Rows can also be appended(行の追記)
ws.append([1, 2, 3])

#5 Python types will automatically be converted(Pythonタイプは自動で変換される)
import datetime
ws['A2'] = datetime.datetime.now()

#6 Save the file(ファイルを保存する)
wb.save("sample.xlsx")
  1. ワークブックを作成しています。ワークシートを作成するためには、必ずワークブックを作成しておく必要があります。
  2. アクティブはワークシートを選択しています。作成直後は1つ目のワークシートしかないのでそのワークシートを選択しています。
  3. A1セルに42を挿入しています。
  4. 行の追加を行っています。1行目はA1セルが入っているので2行目に追加されます。
  5. datetimeモジュールをimportして現在時刻をA2セルに挿入しています。
  6. ワークブックを保存しています。sample.xlsxという名前のファイルが作成されます。

上記のコードを記述したpyファイルを保存して実行すると同じフォルダ内にsample.xlsxファイルが作成されます。ファイルを開くと下記のような内容で作成されています。

サンプルコードで作成されたEXCEL
サンプルコードで作成されたEXCEL

A2セルについては現在時刻で上書き(1が入っていた)されており、記述したコード通りの内容で作成されていることが確認できます。

ファイルの作成

EXCELファイルを作成するだけであれば、下記の3行で行うことができます。


from openpyxl import Workbook

wb = Workbook()

wb.save("test.xlsx")

実行すると空のtest.xlsxファイルが作成されます。

ワークシート名の付与

デフォルトではワークシート名はSheetとなりますが、任意の名前をつけることができます。


from openpyxl import Workbook

wb = Workbook()

ws = wb.active

ws.title = "テスト"

wb.save("test.xlsx")

作成されたtest.xlsxファイルを開くとワークシートの名前がテストになっていることを確認できます。

任意のシート名を設定
任意のシート名を設定

複数のワークシートの作成

複数のワークシートを作成したい場合はcreate_sheetメソッドを使用します。


from openpyxl import Workbook

wb = Workbook()

ws1 = wb.create_sheet('ワークシート1')

ws2 = wb.create_sheet('ワークシート2')

wb.save("test.xlsx")

実行するとデフォルトのSheetと追加作成したワークシート1、ワークシート2の3つのシートを作成することができます。

ワークシートを指定した場所に追加作成したい場合は、ワークシート名の次の引数に番号を入れることでその場所に追加することができます。


ws2 = wb.create_sheet('ワークシート2',0)

ワークシート2は0を指定したので先頭に追加作成されます。

作成したEXCELファイルを開いた時に表示させておきたいワークシートはactiveで設定を行います。

wb.active=1を指定すると2番目のワークシートを選択した状態で開きます。ワークシートの番号は一番左が0になるため1を指定すると2番名のワークシートになります。


wb.active = 1

ワークシート名の取得

作成したワークシートの名前はWorkbook.sheetnamesで取得することができます。先ほどのコードに以下を追加して再度実行します。


print(wb.sheetnames)

Workbook.sheetnamesを利用すれば、ワークシートの名前を取得することができます。


>py test.py
['Sheet', 'ワークシート1', 'ワークシート2']

また、名前の取得はfor文を利用しても取得することができます。


for sheet in wb:
	print(sheet.title)

>py test.py
Sheet
ワークシート1
ワークシート2

シートへの書き込み(セル指定)

3つの方法でセルの場所を指定してデータの書き込みを行います。


from openpyxl import Workbook

wb = Workbook()

ws = wb.active

# A1のセルを指定
ws['A1'] = 42

# 行番号1、列番号2でB2を指定
ws.cell(row=1, column=2).value = 44

# 行番号3、列番号3でC3を指定
ws.cell(row=3, column=3, value=59)

wb.save("test.xlsx")

cellメソッドを使用する場合は、rowとcolumnの番号を指定する必要があります。

作成したpyファイル実行後にtest.xlsxを開くと指定したセルのA1, B1, C3セルにデータが挿入されます。

指定したセルにデータを挿入
指定したセルにデータを挿入

複数のワークシートを作成した後に特定のワークシートのセルにデータを挿入したい場合は以下のように行うことができます。


from openpyxl import Workbook

wb = Workbook()

ws1 = wb.create_sheet('ワークシート1')

ws2 = wb.create_sheet('ワークシート2')

ws1['A1'] = 100

ws2['A1'] = 500

wb.save("test.xlsx")

ワークシート1という名前のシートのA1セルに100とワークシート2という名前のシートのA1セルに500と書き込まれたファイルが作成されます。

シートへの書き込み(リスト利用)

リストデータをシートに書き込みたい場合はappendメソッドを利用します。


from openpyxl import Workbook

wb = Workbook()

ws = wb.active

rows = [['商品ID', '部門ID', '商品コード', '商品名', '商品単価'],
['1', '1', '1001', '商品A', '1000'],
['2', '1', '1002', '商品B', '1000'],
['3', '1', '1003', '商品C', '1000'],
['4', '1', '1004', '商品D', '2000'],
['5', '1', '1005', '商品E', '2000'],
['6', '1', '1006', '商品F', '2000']]

for row in rows:
	ws.append(row)

wb.save("test.xlsx")

作成したpyファイルを実行するとリストデータがEXCELファイルに書き込まれていることが確認できます。

リストデータを使用してデータ書き込み
リストデータを使用してデータ書き込み

EXCELファイルを開く

openpyxlのload_workbookを利用して作成済みのファイルを開きます。開いた後先ほど学んだsheetnamesを使ってシート名を取得します。


from openpyxl import load_workbook

file_path = 'test.xlsx'

wb = load_workbook(filename=file_path)

pinrt(wb.sheetnames)

wb.close()

次にワークシートを開く方法を確認します。

load_workbookでファイルパスを指定してワークブック(ファイル)を開き、シート名を指定することでシートを開きます。


from openpyxl import load_workbook

file_path = 'test.xlsx'

wb = load_workbook(filename=file_path)

sheet = wb['Sheet']

#操作を行う

wb.close()
上記の方法でシート内のデータを取得する場合は事前にシート名を確認しておく必要があります。今回開いたファイルのシート名はSheetです。

セルから値を取り出す

load_workbookを使用して開いたシートからセルの値を取得します。


from openpyxl import load_workbook

file_path = 'test.xlsx'

wb = load_workbook(filename=file_path)

sheet = wb['Sheet']

print(sheet['C1'].value)

wb.close()

開いたファイルは下記のようにデータが入力されています。C1コードの値を読み取っているので、上記コードを実行すると商品コードが表示されます。

リストデータを使用してデータ書き込み
リストデータを使用してデータ書き込み

シートの値だけではなく、指定したセルの行番号と列番号を取得することができます。


print(sheet['C1'].column)

print(sheet['C1'].row)

実行すると行番号は3、列番号が1であることがわかります。

シートのセルの全データ取得

シートに登録されているデータをすべて表示します。for文を利用してsheetからrow(行情報)を取り出し、rowからcellの値を取得しています。


from openpyxl import load_workbook

file_path = 'test.xlsx'

wb = load_workbook(filename=file_path)

sheet = wb['Sheet']

for row in sheet:
    for cell in row:
    	print(cell.value)

wb.close()

作成したpyファイルを実行すると下記のようにセルの値が改行なしに縦に表示されます。


>py test.py
商品ID
部門ID
商品コード
商品名
商品単価
1
1
1001
商品A
1000
2
1
1002
商品B
1000
 ・
 ・

上記の方法でシート内のすべてのデータを取り出すことに成功していますが、データを読むのが難しいのでforの箇所のみ変更を行います。(内包表記を利用)


for row in sheet:
	values = [cell.value for cell in row]
	print(values)

実行すると行が配列として表示できます。


>py test.py
['商品ID', '部門ID', '商品コード', '商品名', '商品単価']
['1', '1', '1001', '商品A', '1000']
['2', '1', '1002', '商品B', '1000']
['3', '1', '1003', '商品C', '1000']
['4', '1', '1004', '商品D', '2000']
['5', '1', '1005', '商品E', '2000']
['6', '1', '1006', '商品F', '2000']

行、列の削除

シートから行を削除したい場合は、delete_rowsを利用することができます。3行目の行を削除したい場合は下記のように記述します。


sheet = wb['Sheet']

sheet.delete_rows(3)

複数行を削除することも可能です。3行目の行から3行削除したい場合は、下記のように記述することができます。


sheet = wb['Sheet']

sheet.delete_rows(3,3)

列の削除はdelete_columnsで行うことができます。


sheet = wb['Sheet']

sheet.delete_cols(2)

複数列を削除することも可能です。3列目の行から2列削除したい場合は、下記のように記述することができます。


sheet = wb['Sheet']

sheet.delete_cols(3,2)

随時更新中です。