雑多な日記

雑多である

神Excelからの逃亡

モチベーション

 弊社では業務報告書を用意されたテンプレートに沿って書くことになっている。このテンプレートは例の如くえらい結合が横行しているくそExcelだ。Excelは文書編集ソフトではない。表計算ソフトだ。MicrosoftExcelでラベル以外の文字列を入力することを一切禁止して欲しい。この前耐えきれなくなり、pythonくんたぶんこういうの得意でしょってことでExcelを開かなくて済むようにした。

できること

  • テンプレートに日付や名前、部署名あたりを入力するのを作成する日付から自動でやる
  • input.txtから本文を拾ってきて該当するセルにぶち込む
  • 日付からファイル名とディレクトリがなければ作って保存する

コード

 変数名とか酷いのは許してくれ

from datetime import date, timedelta
import os
import openpyxl

INPUT_FILE_NAME = "input.txt"
TEMPLATE_FILE_NAME = "Template.xlsx"
NEW_FILE_DIR_NAME = "\\\\かいしゃのきょうゆうふぉるだ\\五十嵐"
NEW_FILE_NAME_FORMAT = "{0}_{1}_{2}-{3}.xlsx"
SHEET_NAME = "業務報告書"
DATE_FORMAT = "{0}年 {1}月 {2}日( {3} )"
NAME = "五十嵐響子"
FIRSTNAME = "五十嵐"
DEPARTMENT = "けんきゅうかいはつ"
TYPE = "週報"

# 今日の日付を取得
dt = date.today()
year = dt.year
month = dt.month
day = dt.day
week = "金"

# 入力元テキストファイルの読み込み
f = open(INPUT_FILE_NAME, 'r', encoding='UTF-8')
s = f.read()
f.close()
contents = s.split("\n\n")

# Excelファイルを開く
wb = openpyxl.load_workbook(TEMPLATE_FILE_NAME)
ws = wb[SHEET_NAME]

# セルの編集
cell = ws["C3"]
cell.value = DATE_FORMAT.format(year, month, day, week)
cell = ws["C4"]
cell.value = NAME
cell = ws["C5"]
cell.value = DEPARTMENT
cell = ws["B8"]
cell.value = contents[0]    # 業務内容
cell = ws["B20"]
cell.value = contents[1]    # 反省
cell = ws["B32"]
cell.value = contents[2]    # 改善・提案

# 週の初めの日付を取得
first_day = dt - timedelta(days=4)
f_year = first_day.year
f_month = first_day.month
f_day = first_day.day

# 保存するファイル名を'週報_五十嵐_20210222-26.xlsx'みたいな感じで作って保存
tmp1 = str(f_year) + '{0:02}'.format(f_month) + '{0:02}'.format(f_day)
if year == f_year: 
    if month == f_month:
        tmp2 = str('{0:02}'.format(day))
    else:
        tmp2 = str('{0:02}'.format(month)) +  str('{0:02}'.format(day))
else:
    tmp2 = str(year) + str('{0:02}'.format(month)) + str('{0:02}'.format(day))

tmp_dir = "{0}_{1}_{2}".format(TYPE, FIRSTNAME, str(f_year) + '{0:02}'.format(f_month))
target_dir = NEW_FILE_DIR_NAME + tmp_dir
if not os.path.exists(target_dir):
    os.makedirs(target_dir)
wb.save(target_dir + "\\" + NEW_FILE_NAME_FORMAT.format(TYPE, FIRSTNAME, tmp1, tmp2))

曜日ってどこかから取って来れるのかな。金曜日休むことがあったらそのへん調べていじっておきたい。

感想

 pythonくんのつよつよライブラリほんまにつよい。調べながらテキトーにちょちょいとやったら使えるものができる。仕事をサボりたいけど、自動化への労力もあまり支払いたくないという人間にぴったりだ。今後も気づいたら作っていくようにしたい。できれば今後後輩ができた時に渡しても馬鹿にされないクオリティで。

そのうちやりたいこと

 週の終わりは作成した週報のパスをメールに貼りけて各位に送信するという儀式も存在する。上司に送るメールを自動化するのもちょっと怖いけど、vbsか〜って言いながら作ろうと調べてたらpythonくんはoutlookでメール送れるライブラリも存在することを知った。というかwin32com使ったらOffice触らなくて済むようになるのでは?わいのOutlookくんなぜかメール受信するたびにフリーズするんよな、、、

qiita.com

月曜日にでも暇だったら作っておきたいね。

おわり