Pythonを使うとエクセルのデータを読み込み、処理結果を書き込むことができます。
しかし、PythonでのExcel仕事の効率化について事例をもとにした情報は多くありません。
そこで、PythonでExcel作業を自動化する事例を紹介していきます。
・テンプレートシートへデータを書き込む
・新しいファイルとして別ファイル名で保存する
それでは以下で詳しく紹介していきます。
ExcelデータをPythonで処理するプログラムの概要
今回は、Pythonを使って取引先ごとに新しいシートを作成し、そこにデータを転記していくプログラムを解説します。
実際に以下の作業をpythonで行うことを目指します。
1. 「sample.xlsx」のデータを読み込んで、取引先ごとに「template.xlsx」へ書き出す
2. 書き出したExcelを新しいファイルとして保存する
3. 取引先の件数分、1と2を繰り返す
たとえば今回は取引先は[a,b,c,d,e,f,g,h,i,j]の10件あるので、最終的には10のExcelファイルが保存されるようにします。
Pythonプログラムを実行するための準備
事前の準備として、Excelを使えるようにライブラリ設定をします。
準備|openpyxlモジュールのインストール
1. コマンドプロンプトを起動(ショートカットキー[windows] + [R])
2. 「cmd」と記入して[Enter]
3. 「pip install openpyxl」と入力して[Enter]
4. インストール完了
これでインストールが完了し、openpyxlを使えるようになります。
それでは以下でプログラムを解説していきます。
Pythonプログラム解説
この記事で紹介するプログラムを解説しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
#プログラム1|ライブラリの設定 from datetime import datetime from openpyxl import load_workbook #プログラム2|対象エクセルのファイルパスを指定 filepath1 = 'sample.xlsx' filepath2 = 'template.xlsx' #プログラム3|エクセルを読み込む wb1 = load_workbook(filename=filepath1) ws1 = wb1['Sheet1'] wb2 = load_workbook(filename=filepath2) ws2 = wb2['template'] #プログラム4|ws1のデータをリスト化 values1=[[cell.value for cell in row1] for row1 in ws1] #プログラム5|取引先のリストを作成 del values1[0] conv_values1 = list(zip(*values1)) torihiki_list = list(set(conv_values1[0])) #プログラム6|取引先ごとに処理 for torihiki in torihiki_list: # プログラム7|空リストを作成 product_data =[] # プログラム8|取引先とマッチングする行をproduct_dataのリストに格納 for i in range(len(values1)): if values1[i][0] == torihiki: product_data.append(values1[i]) # プログラム9|templateシートをコピー ws2.title = torihiki # プログラム10|プログラム8で格納したリストをエクセルへ出力 for y, row in enumerate(product_data): for x, cell in enumerate(row): ws2.cell(row= y+2, column= x+1, value=product_data[y][x]) # プログラム11|エクセルファイルの保存 now = datetime.now() hiduke = now.strftime('%Y-%m-%d') filename = hiduke + '_' + torihiki + '.xlsx' wb2.save(filename) |
以下で詳細の解説をしていきます。
#プログラム1|ライブラリの設定
1 2 |
from openpyxl import load_workbook from datetime import datetime |
このプログラムでは、2つのライブラリ設定をします。
・エクセルを操作するためのライブラリ
・日時を操作するためのライブラリ
まず、openpyxlでExcelを操作できるようにします。
また、datetimeで日時を操作するライブラリも設定しておきます。
datetimeはプログラム11で、エクセルをファイル名を変更して保存するときに使います。
#プログラム2|対象エクセルのファイルパスを指定
1 2 |
filepath1 = 'sample.xlsx' filepath2 = 'template.xlsx' |
・変数filepath1に「’sample.xlsx’」を設定
・変数filepath2に「’template.xlsx’」を設定
今回使うエクセルファイルは、pythonプログラムと同じフォルダに保存しておきます。
もし違うフォルダで保存したい場合は、「C:\Users\xxx\Dropbox\Python\Program\100_Excel\104_Excel_fileTenki\sample.xlsx」や「C:\Users\xxx\Dropbox\Python\Program\100_Excel\104_Excel_fileTenki\template.xlsx」のようなフルパスを設定する方法があります。
プログラム3|エクセルを読み込む
1 2 3 4 5 |
wb1 = load_workbook(filename=filepath1) ws1 = wb1['Sheet1'] wb2 = load_workbook(filename=filepath2) ws2 = wb2['template'] |
・「sample.xlsx」を読み込んで、変数wb1として設定
・「sample.xlsx」の「Sheet1」を変数ws1として設定
・「template.xlsx」を読み込んで、変数wb2として設定
・「template.xlsx」の「template」を変数ws2として設定
プログラム4|シート1のデータをリスト化
1 |
values1=[[cell.value for cell in row1] for row1 in ws1] |
ws1のデータを変数values1にリストとして格納
これで「Sheet1」のデータを全て取得します。
プログラム5以降では、このvalues1を活用して処理を行います。
プログラム5|取引先のリストを作成
1 2 3 |
del values1[0] conv_values1 = list(zip(*values1)) torihiki_list = list(set(conv_values1[0])) |
ここでは取引先リストの取得を目指します。
プログラム6以降で、取引先ごとに処理を行うためです。
しかし、A列の取引先をそのまま取得すると、「ヘッダー情報が余計」、「取引先の重複」という課題があります。
そこで、このプログラム5で「ヘッダー情報を削除」と「取引先の重複を削除」を実行し、取引先のリストを取得します。
・リストvalues1の0番目の要素(ここではヘッダー)を削除
・リストvalue1の行と列を入れ替える
・conv_values1[0]の重複を削除し、それをリストとしてtorihiki_listとする
この事例では取引先は、[a,b,c,d,e,f,g,h,i,j]です。
プログラム6|取引先ごとに処理
1 |
for torihiki in torihiki_list: |
torihiki_listから一要素ずつ処理を実行
プログラム5で設定したとおり、torihiki_list = [a,b,c,d,e,f,g,h,i,j]となっている。
この要素から一つずつ処理を実行していく。
プログラム7|空リストを作成
1 |
product_data =[] |
product_dataという空リストを設定
product_dataというリストを空にして、プログラム8でvalues1の中でマッチングした取引先のデータを格納していく。
プログラム8|取引先とマッチングする行をproduct_dataのリストに格納
1 2 3 |
for i in range(len(values1)): if values1[i][0] == torihiki: product_data.append(values1[i]) |
・value1の要素数だけ処理を繰り返す
・もし「values1のi行目0番目の要素(A列:取引先)」と「torihiki」が一致していれば
・変数product_dataにvalues1[i]を追加
「プログラム6で処理中の取引先」と「A列の取引先」のデータマッチングを行い、一致していれば、product_dataに格納していきます。
プログラム9|templateシートをコピー
1 |
ws2.title = torihiki |
ws2のシート名を「torihiki」に変更
「torihiki」は[a,b,c,d,e,f,g,h,i,j]の各要素であり、シート名を取引先に変更する。
プログラム10|プログラム8で格納したリストをエクセルへ出力
1 2 3 |
for y, row in enumerate(product_data): for x, cell in enumerate(row): ws2.cell(row= y+2, column= x+1, value=product_data[y][x]) |
プログラム8で情報を入れこんだproduct_dataのデータをws3に出力する。
・「product_data」の要素番号y、要素rowを取り出して処理
・「row」の要素番号x、要素cellを取り出して処理
・ws2の(y+2)行目、(x+1)列目の値をproduct_data[y][x]とする
product_dataのリストの値をws2に書き出します。
なお、1行目はヘッダー情報があり、かつyは0から開始するため(y+2)としています。
また、xは0から開始するため(x+1)としています。
プログラム11|エクセルファイルの保存
1 2 3 4 |
now = datetime.now() hiduke = now.strftime('%Y-%m-%d') filename = hiduke + '_' + torihiki + '.xlsx' wb2.save(filename) |
・変数nowに現在の日時を取得
・変数nowを「%Y-%m-%d」形式に変換する
・変数filenameを「hiduke_Excel.xlsx」にする
・変数filenameの名前でExcel(元はtemplateファイル)を保存する
プログラムの解説はここまでです。
Pythonについて詳しく理解したいなら
Pythonを活用すると、仕事を効率化できる幅を広げることができます。
たとえば私が実際にPythonを活用して効率化してきた作業は以下の記事で紹介しています。
興味がある人は以下の記事もご覧ください。
Pythonの難易度などについては、以下で紹介しています。
勉強の参考になれば幸いです。