仕事が忙しく手を付けられなかった。
前回まで、記事を読み返さないと分からないくらい間が空いてしまいました。
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ノートブックで実行すると
こんな結果が出るのと、元のExcelと同じフォルダに「結果.xlsx」が出来上がります。
こんなことが出来たということになります。
ソースコードの解説
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のほうが書きやすいですが、どちらが良いんでしょうね。