【Python】年齢付き年表作成ツールを作ってみた
こんにちは。
家族が増えて、そろそろライフプランを考えなきゃなーと思い、
エクセルでライフプラン表を作ってみたりしてます。
そんなときに使えるかもしれない、年齢付き年表自動作成ツールをpythonで作りました。
こんなウィンドウがでてきて、名前と生年月日を入力します。
OK押すとエクセルで年表が作成され、下記のメッセージが出ます。
同じフォルダに「(入力した名前)'s_life_planning」というファイル名の下記のようなエクセルファイルが作成されました。
これが100歳まで横にダーッと続いてます。
以下使い方。
OpenpyxlとかPysimpleGUIとか使ってますので、
あらかじめコマンドプロンプトで下記のpip installしてから使います。
pip install openpyxl
pip install python-dateutil
pip install pysimplegui
以下Pythonコードです。
ファイルはツール起動用とGUI用で別々に2つ作りましたので、
下記二つのPythonファイルを同じフォルダにおいてください。
①life_planning.py (起動用pythonファイル)
from datetime import date import openpyxl from dateutil.relativedelta import relativedelta from openpyxl.utils import get_column_letter from openpyxl.styles.alignment import Alignment from openpyxl.styles.borders import Border, Side import PySimpleGUI as sg import GUI_InputUserInfo def main(): #ユーザーからの入力 GUI_InputUserInfo.inputwindow() #実行 name = GUI_InputUserInfo.name b_year = GUI_InputUserInfo.b_year b_month = GUI_InputUserInfo.b_month b_day = GUI_InputUserInfo.b_day birthday = [] for i in range(0,len(name)): birthday.append(date(b_year[i],b_month[i],b_day[i])) #年表作成処理 wb = openpyxl.Workbook() sheet = wb.active sheet.title = 'life_planning' #年月を書き込む now = date.today() month = now.month year = now.year end_year = b_year[0] + 101 #ユーザーが100歳になるまで sheet['A1'] = '西暦' sheet['A2'] = '月' #西暦と月を書き込む cell = sheet['B2'] column = cell.column for y in range(year,end_year): cell.offset(-1,0).value = y while True: cell.value = month cell = cell.offset(0,1) if month == 12: month = 1 break elif y == end_year - 1 and month == b_month[0]: #100歳のお誕生月で終わる break month += 1 #名前と現在の年齢を書き込む old_datetime = [] #現在の年齢のdatetimeオブジェクトリストを生成する famnum = len(name) #ループ終値を取得 for i in range(famnum): old_datetime.append(relativedelta(now,birthday[i])) if birthday[i].month == now.month and old_datetime[i].months == 11 : #今月が誕生月で、まだ誕生日を迎えていなかったら old = old_datetime[i].years + 1 else: old = old_datetime[i].years sheet.cell(column=1,row=i+3).value = name[i] sheet.cell(column=2,row=i+3).value = old #誕生月が来たらold+1してセルに書き込む for c in sheet['2:2']: #月の行を右端までループ if c.value == b_month[i]: old += 1 c.offset(i+1,0).value = old #年齢を書き込む #ここからエクセルの体裁整え処理 #列の幅を整える for col in sheet.columns: column = col[0].column sheet.column_dimensions[get_column_letter(column)].width = 4 #とりあえず全部変える sheet.column_dimensions['A'].width = 10 #左端の列幅を設定 #西暦のセルを結合する m = 12 - sheet['B2'].value year_row = 1 #西暦の行 stacol = 2 endcol = stacol + m #最初の年は誕生月始まりのため、endcolを個別設定 #99歳の年までループ for i in range(year,end_year-1): sheet.merge_cells(start_row=year_row,start_column=stacol,end_row=year_row,end_column=endcol) stacol = endcol+1 endcol = endcol+12 #100歳の年は誕生月で終わるため、個別設定 sheet.merge_cells(start_row=year_row,start_column=stacol,end_row=year_row,end_column=stacol+b_month[0]-1) #罫線を付けて左よせする side = Side(style='thin', color='000000') border = Border(top=side, bottom=side, left=side, right=side) alignment = Alignment(horizontal='left') # write in sheet for row in sheet: for cell in row: sheet[cell.coordinate].border = border #枠線 sheet[cell.coordinate].alignment = alignment #左寄せ #ウィンドウ枠を固定する sheet.freeze_panes = sheet.cell(row=len(name)+3,column=2) #ファイルを保存 filename = name[0] + '\'s_life_planning.xlsx' wb.save(filename) sg.popup(filename+'が作成されました。\n' 'ファイルを開いてライフプランを立てましょう!\n' 'ファイルは実行したPythonファイルと同じフォルダにあります') main()
②GUI_InputUserInfo.py (importするので、ファイル名はこの通りにしてください。)
import PySimpleGUI as sg name = [] b_year = [] b_month = [] b_day = [] def inputwindow(): # セクション1 - オプションの設定と標準レイアウト sg.theme('Dark Blue 3') layout = [ [sg.Text('あなたが100歳になるまでの年表を作ります\n' \ 'ほかの人の年齢も年表に記載できます(最大10人)\n'\ '名前と生年月日を教えてください。', key='-TEXT-',size=(70,4))], [sg.Text('あなたの名前', size=(12,1)), sg.InputText(size=(10,1)), sg.Text('生年月日(西暦)', size=(12,1)), sg.InputText(size=(7,1)),sg.Text('年', size=(2,1)), sg.InputText(size=(7,1)),sg.Text('月', size=(2,1)), sg.InputText(size=(7,1)),sg.Text('日', size=(2,1))]] for i in range(1,11): layout.append([sg.Text('人物'+str(i), size=(12, 1)), sg.InputText(size=(10, 1)), sg.Text('生年月日(西暦)', size=(12, 1)), sg.InputText(size=(7, 1)), sg.Text('年', size=(2, 1)), sg.InputText(size=(7, 1)), sg.Text('月', size=(2, 1)), sg.InputText(size=(7, 1)), sg.Text('日', size=(2, 1))]) layout.append([sg.Submit(button_text='OK')]) # セクション 2 - ウィンドウの生成 window = sg.Window('Life_planning', layout) # セクション 3 - イベントループ while True: event, values = window.read() window.close() if event is None: break if event == 'OK': for i in range(0,44,4): if values[i] == '': continue name.append(values[i]) b_year.append(int(values[i+1])) b_month.append(int(values[i+2])) b_day.append(int(values[i+3])) show_message = name,b_year,b_month,b_day sg.popup('年表を作成します') # セクション 4 - ウィンドウの破棄と終了 window.close()
以上です。
ちょっとわかりにくくなったので、使い方をまとめると、
1.上記2つのpythonコードをコピーして、pythonファイルを二つ作成し、同じフォルダ内に保存する。(注意:②のpythonファイルは①から読み込むため、ファイル名を「GUI_InputUserInfo.py」とすること)
2.コマンドプロンプトなどで上記の必要なモジュールをpip installする。
3.①life_planning.py を実行する。
4.名前と生年月日を入力する。
5.OK
6.同じフォルダに「(入力した名前)'s_life_planning」という名前のエクセルファイルが作成される。
以上です。
でもこれ需要なさそうですね(笑)