【挑戦】PythonでExcelを操作してみた【12日目】

仕事が忙しく手を付けられなかった。

前回まで、記事を読み返さないと分からないくらい間が空いてしまいました。

BeautifulSoupで、何となくサイトの情報が取れるところまでやりました。

書籍の中では、1章が終わりましたのでいったん休憩して、今度はPythonでExcelを操作出来ることを知ったので少し試してみました。

スポンサーリンク

Openpyxlを使用してExcelを操作してみる

import openpyxl

workbook = openpyxl.load_workbook('リスト.xlsx')
sheet = workbook["Sheet1"]

suppliers = []

for i in range(3,9):
cell_value = sheet.cell(row=i, column=2).value

 if cell_value not in suppliers:
 suppliers.append(cell_value)

print(suppliers)

transaction_amounts = []

for i in suppliers:
transaction_amount = 0

for j in range(3,9):
supplier = sheet.cell(row=j, column=2).value
if supplier == i :
transaction_amount += sheet.cell(row=j, column=6).value

 transaction_amounts.append(transaction_amount)

print(transaction_amounts)

new_sheet = workbook.create_sheet("集計")
new_sheet["A1"] = "取引先"
new_sheet["B1"] = "取引金額"

for i, j, k in zip(list(range(3,9)), suppliers, transaction_amounts):
new_sheet.cell(row=i, column=1, value=j)
new_sheet.cell(row=i, column=2, value=k)

print(list(new_sheet.values))

workbook.save("結果.xlsx")

うまく貼りつかなかったのでインデントはご了承ください。

Excelは、「元の表」をpythonと同じフォルダに入れています。

Jupyterノートブックで実行すると

pythonでExcelを操作

こんな結果が出るのと、元のExcelと同じフォルダに「結果.xlsx」が出来上がります。

pythonでExcelを操作 でやっていること

こんなことが出来たということになります。

ソースコードの解説

import openpyxl

#openpyxl.load_workbook()の引数にはファイルのパス
#workbook[]の引数にシートの名前を指定
workbook = openpyxl.load_workbook('リスト.xlsx')
sheet = workbook["Sheet1"]

#取引先を入れる空のリスト
suppliers = []

#B列(column=2)の3-9行目、各取引先の名前が入っているセルに対して、次の処理
#row=1が3~9の範囲で繰り返しますよ、でcolumn=2はB列ですよ。その値Valueをcell_valueに入れますよ。
for i in range(3,9):
cell_value = sheet.cell(row=i, column=2).value

#ここからが処理 #cell_valueに入っている値が、リストsuppliersにないならば(not in)、リストsuppliersに値cell_valueを追加
#リストsuppliersにあった場合は、何もしない。 #ということは、ここでは重複が無くなるということだ。
#なので結果は、['北海道商事', '青森商会', '武田INTナショナル'] となる
if cell_value not in suppliers:
suppliers.append(cell_value)

#リストsuppliersを表示
print(suppliers)

#取引金額を集計を入れる空のリスト
transaction_amounts = []

#リストsuppliersには取引先が入っているので、その取引先に対して繰り返しfor処理
for i in suppliers:
#合計を出したいので、まずは0リセット
transaction_amount = 0
#取引先ではiに3~9行目を入れていたが、今は取引先が入っているのでjにしてる3~9が入る。
for j in range(3,9):
#supplierには、column=2のB列の取引先が3~9で入る
supplier = sheet.cell(row=j, column=2).value
#取引先supplier と取引先iが同じ==だったら
#ここでは会社ごとに集計をしたいため、iとjで整合させて集計している
if supplier == i :
#空リストで初期0のtransaction_amountに、column=6のF列の値を追加+=する。
transaction_amount += sheet.cell(row=j, column=6).value

#集計を入れる空のリストtransaction_amountsに、合計したtransaction_amountを入れる。 transaction_amounts.append(transaction_amount)

#集計値transaction_amountsを表示
print(transaction_amounts)

#変数new_sheetに、集計シートを作って変数に入れる
new_sheet = workbook.create_sheet("集計")

#集計シートのA1、B1にタイトル取引先、取引金額を設定する
new_sheet["A1"] = "取引先"
new_sheet["B1"] = "取引金額"

#i=行3~9、j=supploersで取引先が入ってる、k=transaction_amountsで集計値が入ってる 時in 繰り返す
for i, j, k in zip(list(range(3,9)), suppliers, transaction_amounts):

#i行、A列にjの値、B列にkの値を入れる
new_sheet.cell(row=i, column=1, value=j)
new_sheet.cell(row=i, column=2, value=k)

print(list(new_sheet.values))

workbook.save("結果.xlsx")

コマンドラインから実行

python python-excel.py

リストファイルと、結果ファイルが同じところに出来上がりました。

フォルダの中身

まとめ

今回は簡単なExcelの集計と転記でしたが、Excelを操作できることが分かりました。

まだ慣れているVBAのほうが書きやすいですが、どちらが良いんでしょうね。

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