今回のガジェットはstreamlitを使用したフォームのようなものです。エクセル形式の履歴書に対応し、フォームに入力することでエクセル形式の履歴書のフォーマットに反映させます。
例えばこんな状況で
今回ガジェットは、作っていて思ったのですが、実際のところ有用性があるとは思えないところです。エクセル形式の履歴書であればそのまま直接入力して仕舞えば良いかなと思いますよね。ということで今回の焦点はエクセルに反映させるためのフォームもstreamlitで作成できますという点だけご注目です。履歴書もそんなに書くことはないですしね。
このガジェットでできることはこちら
- フォームに入力することでエクセル形式の履歴書に必要な情報を入力できそのまま履歴書上に書き出すことができます。
- 入力情報はjson形式で保存します。(呼び出し機能はありますが、呼び出した情報を編集する機能は未対応)
- アピール情報はデータベース上に保存しているのでその中から選んで自動で書き込みしてくれます。
- 読み仮名は自動で出力します。
評価(自己)
役立ち度 ★★★(平均)
効率化 ★★(悪し)
ミス防止 ★★★(平均)
楽しさ ★★★(平均)
操作 ★★(悪し)
※1フォーム1履歴書なので効率化にはなっていません。保存情報の編集機能も未実装であるため操作性も良いとは言えない感じです。
実行環境
使用環境 streamlit
使用言語 python
使用ライブラリ openpyxl、pandas、datetime、pykakasi、streamlit、json、os
※関連ファイル アピール文はいくつかファイルにあらかじめ保存しておりそこから使用
コード
import openpyxl
import pandas as pd
import datetime as dt
from pykakasi import kakasi
import streamlit as st
import json
import os
filepath = '履歴書.xlsx'
kakasi = kakasi()
kakasi.setMode('J', 'H')
conv = kakasi.getConverter()
st.title('履歴書作成ツール')
info = None
if os.path.exists('record.json'):
if st.button('保存情報を読み込む'):
with open('record.json', 'r') as f:
info = json.load(f)
if info is None:
st.write('#### 基本情報入力')
recoad = {}
kanji_name = st.text_input('名前を入力してください(例:〇〇 〇〇')
kana_name = conv.do(kanji_name)
kana_name = st.text_input('読み仮名', kana_name)
st.write(kana_name)
age = st.number_input('年齢を入力してください',18, 50, 18, step=1)
year = st.number_input('生まれ年を入力してください',1971, 2004, 1971, step=1)
month = st.number_input('生れ月を入力してください',1, 12, 1, step=1)
day = st.number_input('生まれた日を入力してください',1, 31, 1, step=1)
birthday = dt.date(year, month, day).strftime(f'%Y年%m月%d日生 (満{age}歳)')
st.write(f'誕生日は{birthday}')
post_code = st.text_input('郵便番号を入力してください(ハイフォンあり)')
kanji_address = st.text_input('住所を入力してください')
kana_address = conv.do(kanji_address)
kana_address = st.text_input('住所読み仮名', kana_address)
st.write(kana_address)
tel = st.text_input('電話番号を入力してください(ハイフォンあり)')
grad_school_year = st.number_input('最終学歴の卒業年を入力してください',1985, 2022, 1985, step=1)
grad_school_month = 3
grad_school_name = st.text_input('卒業した学校名を入力してください')
st.write('#### 職歴情報入力')
nums = st.number_input('何社分入力しますか', 1, 8, 1, step=1)
d = {}
for num in range(nums):
com_enter_year = st.number_input(f'{num+1}社目の入社年を入力してください',1990, 2022, 1997, step=1)
com_enter_month = st.number_input(f'{num+1}社目の入社月を入力してください',1, 12, 4, step=1)
com_quit_year = st.number_input(f'{num+1}社目の退社年を入力してください',1990, 2022, 1997, step=1)
com_quit_month = st.number_input(f'{num+1}社目の退社月を入力してください',1, 12, 3, step=1)
com_name = st.text_input(f'{num+1}社目の会社名を入力してください')
role = st.text_input(f'{num+1}社目の職務を入力してください(例:営業)')
d[num] = [com_enter_year, com_enter_month, com_quit_year, com_quit_month, com_name, role]
st.write('#### 資格・免許情報入力')
cap_nums = st.number_input('いくつの資格・免許を入力しますか', 1, 6, 1, step=1)
d_cap = {}
for cap_num in range(1, cap_nums+1):
acq_year = st.number_input(f'{cap_num}つ目の資格・免許取得年を入力してください',1990, 2022, 1997, step=1)
acq_month = st.number_input(f'{cap_num}つ目の資格・免許取得月を入力してください',1, 12, 4, step=1)
capabilities = st.text_input(f'{cap_num}つ目の資格・免許を入力してください')
d_cap[cap_num] = [acq_year, acq_month, capabilities]
st.write('#### 応募用入力')
st.write('今回の職務内容を選択')
job_kind = ['営業', '事務職']
role = st.selectbox('職種を選んでください', job_kind, index=0)
eg_sentences = pd.read_excel('アピール文.xlsx')
appeals = eg_sentences[role].to_list()
a_num = st.number_input('アピール文を選ぶ', 1, 3, 1, step=1)
appeal = st.text_area('例文を確認し手直しする', appeals[a_num-1], height=200)
st.write('通勤時間を入力してください')
hour = st.number_input('時間', 0, 3, 0, step=1)
minute = st.number_input('分', 0, 60, 0, step=1)
commuting_time = f'約{hour}時間{minute}分'
st.write(commuting_time)
st.write('扶養家族の人数を入力してください')
family = st.number_input('扶養家族', 0, 3, 0, step=1)
dependents = f'{family}人'
st.write(dependents)
record ={
'kana_name': kana_name,
'kanji_name': kanji_name,
'birthday': birthday,
'post_code': post_code,
'kanji_address': kanji_address,
'kana_address': kana_address,
'tel': tel,
'grad_school_year': grad_school_year,
'grad_school_month': grad_school_month,
'grad_school_name': grad_school_name,
'job': d,
'cap': d_cap,
'appeal': appeal,
'commuting_time': commuting_time,
'dependents': dependents
}
else:
st.write('#### 入力済基本情報')
recoad = {}
kanji_name = info['kanji_name']
kana_name = conv.do(kanji_name)
st.write(kanji_name)
st.write(kana_name)
birthday = info['birthday']
st.write(f'誕生日は{birthday}')
post_code = info['post_code']
kanji_address = info['kanji_address']
kana_address = conv.do(kanji_address)
st.write(post_code)
st.write(kanji_address)
st.write(kana_address)
tel = info['tel']
st.write(tel)
grad_school_year = info['grad_school_year']
grad_school_month = 3
grad_school_name = info['grad_school_name']
st.write(f'{grad_school_year}年{grad_school_month}月{grad_school_name}卒業')
st.write('#### 入力済職歴情報')
d = info['job']
for num in range(len(d)):
st.write(f'{num+1}社目')
com_enter_year = d[f'{num}'][0]
com_enter_month = d[f'{num}'][1]
com_quit_year = d[f'{num}'][2]
com_quit_month = d[f'{num}'][3]
com_name = d[f'{num}'][4]
role = d[f'{num}'][5]
st.write(f'入社は{com_enter_year}年、{com_enter_month}月')
st.write(f'退社は{com_quit_year}年、{com_quit_month}月')
st.write(f'{com_name}入社、{role}に従事')
st.write('#### 資格・免許情報入力')
d_cap = info['cap']
for cap_num in range(len(d_cap)):
st.write(f'{cap_num+1}個目')
acq_year = d_cap[f'{cap_num+1}'][0]
acq_month = d_cap[f'{cap_num+1}'][1]
capabilities = d_cap[f'{cap_num+1}'][2]
st.write(f'{acq_year}年{acq_month}月に{capabilities}を取得')
st.write('#### 応募用入力済')
appeal = info['appeal']
st.write(appeal)
commuting_time = info['commuting_time']
st.write(f'通勤時間は{commuting_time}')
st.write('扶養家族の人数を入力してください')
dependents = info['dependents']
st.write(f'扶養家族は{dependents}')
record ={
'kana_name': kana_name,
'kanji_name': kanji_name,
'birthday': birthday,
'post_code': post_code,
'kanji_address': kanji_address,
'kana_address': kana_address,
'tel': tel,
'grad_school_year': grad_school_year,
'grad_school_month': grad_school_month,
'grad_school_name': grad_school_name,
'job': d,
'cap': d_cap,
'appeal': appeal,
'commuting_time': commuting_time,
'dependents': dependents
}
if st.button('入力情報を保存'):
with open('record.json', 'w') as f:
json.dump(record, f, indent=4)
if st.button('履歴書に書き出し'):
filepath = '履歴書.xlsx'
wb = openpyxl.load_workbook(filepath)
sh = wb.active
today = dt.datetime.today()
date = today.strftime('%Y年%m月%d日\t現在')
sh['F5'] = date
sh['B8'] = kana_name
sh['B10'] = kanji_name
sh['A16'] = birthday
sh['B21'] = post_code
sh['B23'] = kanji_address
sh['B19'] = kana_address
sh['K21'] = tel
sh['A39'] = grad_school_year
sh['B39'] = grad_school_month
sh['C39'] = f'{grad_school_name}卒業'
for i in d.keys():
sh[f'A{42+i*6}'] = d[i][0]
sh[f'B{42+i*6}'] = d[i][1]
sh[f'C{42+i*6}'] = f'{d[i][4]}入社 {d[i][5]}職に従事'
sh[f'A{45+i*6}'] = d[i][2]
sh[f'B{45+i*6}'] = d[i][3]
sh[f'C{45+i*6}'] = f'{d[i][4]}退社'
for i in d_cap.keys():
sh[f'O{25+i*3}'] = d_cap[i][0]
sh[f'P{25+i*3}'] = d_cap[i][1]
sh[f'Q{25+i*3}'] = d_cap[i][2]
sh['O50'] = appeal
sh['Z50'] = commuting_time
sh['Z57'] = dependents
wb.save('履歴書_修正.xlsx')
st.write('履歴書に書き出しました')