今回のガジェットはある動画を見ていて僕も作ってみようと思って作ったものです。
例えばこんな状況で
状況説明、いつも自分は下手なのですが、今回の状況はこちらの動画をご覧いただくとわかるかなと思います。
エンジニアチャンネルさんはいつもかっこいいプログラマーの動画を制作投稿されているので大好きなチャンネルです。
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
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[['登録銀行', '種別', '口座番号', '世帯主', '入金']]
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 == '依頼書作成':
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')