ビジネスパーソン・ガジェット置場 empty lot for business

営業や仕事、それに伴う生活を便利に楽にするツール、ガジェットを作ります。既にあるツールも自分用にカスタマイズ。

PySimpleGUI で条件に沿ってデータを集計したものをopenpyxlで規定のフォーマット化

今回のガジェットはある動画を見ていて僕も作ってみようと思って作ったものです。

例えばこんな状況で

状況説明、いつも自分は下手なのですが、今回の状況はこちらの動画をご覧いただくとわかるかなと思います。

エンジニアチャンネルさんはいつもかっこいいプログラマーの動画を制作投稿されているので大好きなチャンネルです。

youtu.be

 

このエンジニアチャンネルさんの動画で、エンジニアさんはサクッとツールを作り上げてしまいます。

僕にもできるかな、僕が作ったらどうなるかなと思い作成したのが今回のガジェットです。

下記の動画は今回僕が作成したものです。

(注)エンジニアチャンネルさんのものと比べるとかなり見劣りします。。。

youtu.be

youtu.be

 

このガジェットでできることはこちら

  • 今回作ったものはPuSimpleGUIでデスクトップ上で操作できるようにしました。
  • 動画に説明が何も入っていないので分かりづらいのですが、作成者、上限年収、加減年齢という条件、振込金額を入力し、データ集計ボタンを押すと保存してある住民のデータから条件に合ったデータを絞り込んでくれます。
  • 一旦GUIで件数(世帯数)と振込合計金額を算出し表示します。
  • その後、依頼書作成ボタンを押すと、抽出したデータを振込依頼書のフォーマットに落としてくれます。
  • 条件入力と金額入力の数ステップだけで条件に合った人の振込依頼書が完成できます

評価(自己)

役立ち度  ★★★★(良し)
効率化   ★★★★(良し)
ミス防止  ★★★★(良し)
楽しさ   ★★★★(良し)
操作    ★★★★(良し)

 

かなり、業務を楽になるものができたかなと思います。サクッと作るを目的としたのであまり細部にまで手を加えていません。元々のデータも綺麗なものを使用しているので、実際の現場ならデータを綺麗にすることなども必要かな。その他、金額の桁区切り入れるとかもう少し修正は必要かなと思います。

 

実行環境

使用環境    デスクトップ PySimpleGUI 
使用言語    python
使用ライブラリ  pandas、openpyxl、PySimpleGUI、datetime

 

コードはこちらです

import pandas as pd
import PySimpleGUI as sg
import datetime as dt
from datetime import timedelta
import openpyxl


family_num = 0
payment = 0

# citizn.csv ←保持している住民データとお考えください
# データの読み込みと今日の日付をとっておく
df_citizn = pd.read_csv('citizn.csv')
today = dt.date.today().strftime('%Y%m%d')
payday = dt.date.today() + timedelta(days=2)


# ウィンドウのテーマを設定しておく
sg.theme('DarkBlue13')



# メインウィンドウのレイアウト設定    
layout = [
    [sg.Text('振込み依頼書作成画面')],
    [sg.Text('作成者を入力'), sg.InputText('', size=(50, 10), key='author')],
    [sg.Text('上限年収を入力'), sg.InputText('', size=(50, 10), key='income')],
    [sg.Text('下限年齢を入力'), sg.InputText('', size=(50, 10), key='age')],
    [sg.Text('給付金額を入力'), sg.InputText('', size=(50, 10), key='payment')],
    [sg.Text(f'世帯数:{family_num}', key='num')],
    [sg.Text(f'総額:{payment}', key='total_amount')],
    [sg.Button('データ集計'), sg.Button('キャンセル'), sg.Button('依頼書作成')]
]

window =  sg.Window('振込み依頼書作成プログラム', layout, size=(800, 500), font=('Meiryo', 20), element_padding=((10,10),(10,10)))



# ループ処理
while True:
    event, values = window.read()
    
    
    # 作業キャンセルボタン処理
    if event == sg.WIN_CLOSED or event == 'キャンセル':
        break
    # データフレーム開始処理    
    elif event == 'データ集計':
        # 各入力値を変数に格納
        payment = int(values['payment'])
        income = int(values['income'])
        age = int(values['age'])

        # 対象顧客の絞り込み
        df_pay = df_citizn[(df_citizn['前年度所得'] <= income)&(df_citizn['年齢']>=age)]
        # 世帯数の取得
        family_num = len(df_pay)
        # 入金列を追加
        df_pay['入金'] = int(payment)
        # データフレームの作成
        trf = df_pay[['登録銀行', '種別', '口座番号', '世帯主', '入金']]
        # 一旦CSVで吐き出し
        trf.to_csv(f'trf_{today}.csv', index=False)
        # 世帯数をアップデート
        window['num'].update(f'世帯数:{family_num}')
        window['total_amount'].update(f'総額:{payment * family_num}')
        
    elif event == '依頼書作成':
       # 以下抽出した情報をopenpyxlで元々ある依頼書フォーマットに転記しています
        author = values['author']
        df_trf = pd.read_csv(f'trf_{today}.csv')
        book = openpyxl.load_workbook('furikomiirai.xlsx')
        sh = book['data']
        sh['F4'] = dt.date.today().strftime('%Y年%m月%d日')
        sh['F6'] = author
        sh['C6'] = df_trf['入金'].sum()
        sh['C7'] = payday.strftime('%Y年%m月%d日')
        sh['C8'] = 'フリコミカブシキガイシャ'
        sh['C9'] = '振込株式会社'

        for i in range(len(df_trf)):
            sh[f'A{12+i}'] = i+1
            sh[f'B{12+i}'] = df_trf.iloc[i, 0]
            sh[f'C{12+i}'] = df_trf.iloc[i, 3]
            sh[f'D{12+i}'] = df_trf.iloc[i, 1]
            sh[f'E{12+i}'] = df_trf.iloc[i, 2]
            sh[f'F{12+i}'] = df_trf.iloc[i, 4]

        book.save(f'outputdata_{today}.xlsx')