プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

PythonでExcelを操作する

作ってみた

ネット銀行の明細を毎月Excelに転記しているのですが、自動化できないかとやってみました。

対象は住信SBIネット銀行とSBI新生銀行です。
どちらも、ネットから明細がcsvでダウンロードできます。

これをデスクトップに保存し、指定のExcelに差分を取得して追記します。
ここで、これらの明細は新しいものが上に来るので、転記先には行を挿入して書き込む必要があります。


フォーマットは住信SBIネット銀行とSBI新生銀行でほぼ同じなので、同じ処理で対応可能でした。

で作ってみたのが以下です。

from openpyxl import Workbook  #pip install openpyxl
from openpyxl import load_workbook
import csv
import glob

WORKBOOK_NAME=r"G:\マイドライブ\銀行明細.xlsx"
DESKTOP=r'C:\Users\とりてん\Desktop'

# SBI
# nyushukinmeisai_20241220.csv
# 新生
# JPY_CH_20241220105525.csv

def main():
    # ワークブックの読み込み
    wb = load_workbook(WORKBOOK_NAME)

    meisai_csv={}

    files = glob.glob(DESKTOP+"/*.csv")
    for source_file in files:
        if "nyushukinmeisai" in source_file:
            meisai_csv["SBI"]=source_file
        elif "JPY_CH" in source_file:
            meisai_csv["新生"]=source_file
    #print(meisai_csv)

    START_ROW =2
    for i in meisai_csv:
        print("【"+str(i)+"】Start")
        ws = wb[i]  # ワークシートを指定
        target_row=START_ROW
        while ws.cell(target_row,1).value ==None:
            target_row+=1
        print("Target row : "+str(target_row)) #データがある行
        if type(ws.cell(target_row,1).value)!= str:
            last_date_s=ws.cell(target_row,1).value.strftime('%Y/%m/%d')
        else:
            last_date_s=ws.cell(target_row,1).value
        last_value_s =str(ws.cell(target_row,5).value)
        print("【Last writen data】" +last_date_s+" / "+last_value_s)

        if i=="新生":
            with open(meisai_csv[i], encoding="utf_8") as source_file:
                csv_lst = list(csv.reader(source_file))
                #print(lst)
        elif i=="SBI":
            with open(meisai_csv[i]) as source_file:
                csv_lst = list(csv.reader(source_file))
                #print(lst)
        
        #転記されていないデータを探す
        data_count=1
        while(True):
            if csv_lst[data_count][0] == last_date_s and csv_lst[data_count][5-1].replace(",", "")==last_value_s.replace(",", ""):
                print("Data count : "+str(data_count))
                break
            data_count+=1
            if data_count>=len(csv_lst)-1:
                print("【"+i+"】"+" : Not found last writen data")
                return
        # 行を追加
        for i in range(data_count-1):
            ws.insert_rows(2)            
        for i in range(data_count-1):
            for j in range(len(csv_lst[0])):
                if ws.cell(target_row+i, j+1).value == None: #書き込み先が空白なら書き込む
                    ws.cell(target_row+i, j+1).value = csv_lst[i+1][j]
                else:
                    print("ERROR: Data Exist!")
                    return

    wb.save(WORKBOOK_NAME)
    print("*** End ***")

main()
input()

exe化

pyinstallerでexeファイルにします。
久しぶりに使ったら、アンチウィルスソフトに隔離される現象が発生しました。
対象ファイルを除外ファイルに指定することで対処できます。
qiita.com

まとめ

これで毎月の定型業務が自動化できました。
さらに、これをpyinstallerでexe化しておくことで1クリックで実行できます。