Pythonを使うとエクセルのデータを読み込み、処理結果を書き込むことができます。
しかし、PythonでのExcel仕事の効率化について事例をもとにした情報は多くありません。
そこで、PythonでExcel作業を自動化する事例を紹介していきます。
・テンプレートシートへデータを書き込む
・任意のファイル名で保存する
それでは以下で詳しく紹介していきます。
目次
- 1 ExcelデータをPythonで処理するプログラムの概要
- 2 Pythonプログラムを実行するための準備
- 3 Pythonプログラム解説
- 3.1 #プログラム1|ライブラリの設定
- 3.2 プログラム2|対象エクセルのファイルパスを指定(ここでは「sample.xlsx」)
- 3.3 プログラム3|「sample.xlsx」を開いて指定して読み込む
- 3.4 プログラム4|シート1のデータをリスト化
- 3.5 プログラム5|取引先のリストを作成
- 3.6 プログラム6|取引先ごとに処理
- 3.7 プログラム7|空リストを作成
- 3.8 プログラム8|取引先とマッチングする行をproduct_dataのリストに格納
- 3.9 プログラム9|templateシートをコピー
- 3.10 プログラム10|プログラム8で格納したリストをエクセルへ出力
- 3.11 プログラム11|エクセルファイルの保存
- 4 Pythonについて詳しく理解したいなら
ExcelデータをPythonで処理するプログラムの概要
今回は、Pythonを使って取引先ごとに新しいシートを作成し、そこにデータを転記していくプログラムを解説します。
実際に以下の作業をpythonで行うことを目指します。
やること|「シート1」の取引先ごとに「template」シートへ書き出す
シート1のA列「取引先」ごとに「template」シートへ転記していく。
最終的には以下のように、各シートに各取引先のデータが転記されている状態を作る。
この作業をPythonでやってみる。
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 |
#プログラム1|ライブラリの設定 from openpyxl import load_workbook from datetime import datetime #プログラム2|対象エクセルのファイルパスを指定(ここでは「sample.xlsx」) filepath = 'sample.xlsx' #プログラム3|「sample.xlsx」を開いて指定して読み込む wb = load_workbook(filename=filepath) ws1 = wb['Sheet1'] ws2 = wb['template'] #プログラム4|シート1のデータをリスト化 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シートをコピー ws3 = wb.copy_worksheet(ws2) ws3.title = torihiki # プログラム10|プログラム8で格納したリストをエクセルへ出力 for y, row in enumerate(product_data): for x, cell in enumerate(row): ws3.cell(row= y+2, column= x+1, value=product_data[y][x]) # プログラム11|エクセルファイルの保存 now = datetime.now() hiduke = now.strftime('%Y-%m-%d') filename = hiduke + '_' + 'Excel.xlsx' wb.save(filename) |
以下で詳細の解説をしていきます。
#プログラム1|ライブラリの設定
1 2 |
from openpyxl import load_workbook from datetime import datetime |
ライブラリの設定です。
from openpyxl import load_workbook
エクセルを操作するためのライブラリ
openpyxl以外にもエクセルを操作するためのライブラリはありますが、openpyxlを使うことをオススメします。
理由はウェブで紹介されている情報が多く、アレンジをしやすいからです。
from datetime import datetime
日時を操作するためのライブラリ
日時を操作するライブラリも設定しておきます。
これはプログラム11で、エクセルをファイル名を変更して保存するときに使います。
プログラム2|対象エクセルのファイルパスを指定(ここでは「sample.xlsx」)
1 |
filepath = 'sample.xlsx' |
変数filepathに「’sample.xlsx’」を設定
今回使うエクセルファイルは、pythonプログラムと同じフォルダに保存しておきます。(画像はDropboxのもの)
もし違うフォルダで保存したい場合は、「D:\Website_パソコンスキルの教科書\201_Pythonでエクセルシートへ転記\sample.xlsx」のようなフルパスを設定する方法があります。
プログラム3|「sample.xlsx」を開いて指定して読み込む
1 2 3 |
wb = load_workbook(filename=filepath) ws1 = wb['Sheet1'] ws2 = wb['template'] |
wb = load_workbook(filename=filepath)
プログラム2のエクセルファイルを読み込んで、変数wbとして設定
ws1 = wb[‘Sheet1’]
変数ws1にエクセルwbの「シート1」を設定
この「シート1」のデータに記載されているA列の取引先ごとに別シートに転記していきます。
ws2 = wb[‘template’]
変数ws2にエクセルwbの「template」を設定
1行目にヘッダー情報が入れてあります。
「シート1」のデータの転記先が「template」シートで、2行目以降に書き出していきます。
プログラム4|シート1のデータをリスト化
1 |
values1=[[cell.value for cell in row1] for row1 in ws1] |
シート1のデータを変数values1にリストとして格納
これで「シート1」のデータを全て取得します。
プログラム5以降では、このvalues1を活用して処理を行います。
プログラム5|取引先のリストを作成
1 2 3 |
del values1[0] conv_values1 = list(zip(*values1)) torihiki_list = list(set(conv_values1[0])) |
ここでは取引先リストを取得します。
プログラム6以降で、取引先ごとに処理を行うためです。
しかし、A列の取引先をそのまま取得すると、「ヘッダー情報が不要」、「取引先が重複」という課題があります。
そこで以下のステップで解決をしていきます。
2. values1の配列を転置する
3. 取引先の行を取得し重複を削除する
del values1[0]
リストvalues1の0番目の要素(ここではヘッダー)を削除
conv_values1 = list(zip(*values1))
リストvalue1の行と列を入れ替える
torihiki_list = list(set(conv_values1[0]))
conv_values1[0]の重複を削除し、それをリストとしてtorihiki_listとする
この事例では取引先は、[a,b,c,d,e,f,g,h,i,j]です。
上の画像ではアルファベット順に並んでいないため分かりづらいですが、約950行あるA列から重複を削除できているのが分かります。
プログラム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]) |
for i in range(len(values1)):
value1の要素数だけ処理を繰り返す
if values1[i][0] == torihiki:
もし「values1のi行目0番目の要素(A列:取引先)」と「torihiki」が一致していれば
A列の取引先と、プログラム6で処理中の取引先が一致しているかどうかをif文で比較する
product_data.append(values1[i])
変数product_dataにvalues1[i]を追加
プログラム8でデータをマッチングして、product_dataに格納する。
プログラム9|templateシートをコピー
1 2 |
ws3 = wb.copy_worksheet(ws2) ws3.title = torihiki |
ws3 = wb.copy_worksheet(ws2)
ws2をコピーし、変数ws3として設定
ws3.title = torihiki
ws3(ws2のコピー)のシート名を「torihiki」に変更
プログラム10|プログラム8で格納したリストをエクセルへ出力
1 2 3 |
for y, row in enumerate(product_data): for x, cell in enumerate(row): ws3.cell(row= y+2, column= x+1, value=product_data[y][x]) |
プログラム8で情報を入れこんだproduct_dataのデータをws3に出力する。
for y, row in enumerate(product_data):
「product_data」の要素番号y、要素rowを取り出して処理
たとえば、取引先がaのとき、要素番号yは「0~110」で要素rowは「各行に含まれる5つの情報」として取り出すことができる。
yはエクセルに書き出すときの行番号、rowは次の「for x, cell in enumerate(row):」でそれぞれ使用する。
for x, cell in enumerate(row):
「row」の要素番号x、要素cellを取り出して処理
たとえば、取引先がaのとき、要素番号xは「0~4」で要素cellは「1つ1つの情報」として取り出すことができる。
xはエクセルに書き出すときの列番号、cellはエクセルに書き出す文字列となる。
ws3.cell(row= y+2, column= x+1, value=product_data[y][x])
ws3の(y+2)行目、(x+1)列目の値をproduct_data[y][x]とする
product_dataのリストの値をws3に書き出します。
ここでは、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 + '_' + 'Excel.xlsx' wb.save(filename) |
now = datetime.now()
変数nowに現在の日時を取得
プログラムを実行をすると、以下のように今の日時を取得します。
hiduke = now.strftime(‘%Y-%m-%d’)
変数nowを「%Y-%m-%d」形式に変換する
filename = hiduke + ‘_’ + ‘Excel.xlsx’
変数filenameを「hiduke_Excel.xlsx」にする
変数filenameは以下のようになる。
wb.save(filename)
エクセルを変数filenameの名前で保存する
プログラムの解説はここまでです。
Pythonについて詳しく理解したいなら
Pythonを活用すると、仕事を効率化できる幅を広げることができます。
たとえば私が実際にPythonを活用して効率化してきた作業は以下の記事で紹介しています。
興味がある人は以下の記事もご覧ください。
Pythonの難易度などについては、以下で紹介しています。
勉強の参考になれば幸いです。