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

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

pythonで履歴書作成フォーム【with streamlit】

今回のガジェットは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'

# wb = openpyxl.load_workbook(filepath)
# sh = wb.active
kakasi = kakasi()
kakasi.setMode('J', 'H') 
conv = kakasi.getConverter()

st.title('履歴書作成ツール')

info = None
# もしjsonファイルが会ったらそれを読み込み
# 各種変数にjsonファイルの値をvalue値として表示
# なければ下記入力
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]


    ## 最初から入力するがTrueなら上記の内容を入力入力済データを使用するなら入力済データを読み出して変数に格納するように条件分岐を作る

    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}を取得')


    # 最初から入力するがTrueなら上記の内容を入力入力済データを使用するなら入力済データを読み出して変数に格納するように条件分岐を作る

    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
    # sh['O72'] = desire

    wb.save('履歴書_修正.xlsx')
    st.write('履歴書に書き出しました')