Pythonでエクセル勤怠管理表の日付と曜日を自動入力

今回は20日締めの勤怠管理表日付と曜日の部分を自動入力します。20日締めだと月をまたぐので、手動だと意外と面倒です。それを毎月行うのはとても無駄です。このようなルーチンワークはPythonで自動化しましょう。

python automation 4th practice

勤怠管理表のひな形はエクセルファイル(*.xlsx)であるとします。そのひな形の日付と曜日の部分をPythonで自動入力して別名で保存します。図のように年月を指定すれば、20日締めに対応した日付と曜日を1箇月分自動入力します。

勤怠管理表.xlsx(ひな形)▶ 201703を指定 ▶ 201703_勤怠管理表.xlsx(別名で保存)

今回は日付と曜日を入力するだけですが、応用すれば社員名簿ファイルを用いて社員名や社員番号を自動入力し、当月の1000人分の勤怠管理表を瞬間作成することもできます。

この記事の目次

準備

1. Pythonのインストール

以下の記事を参考にWindowsにPythonをインストールしてください。

Pythonはいま大ブレイクのプログラミング言語です。その背景には人工知能ブーム、それを支えるディープラーニングのほとんどがPythonで動かしていることにあります。ですが・・・ Pythonは…

2.エクセル読み書き用ライブラリ(モジュール)のインストール

エクセルファイルを読み書きするには、専用のライブラリをインストールする必要があります。今回はオープンソースのOpenPyXLを利用します。

まず、以下の手順でコマンドプロンプト(黒い背景の画面)を開いてください。

  1. 「Windowsキー()+ r 」を入力すると、以下のような画面が開きます。
  2. open cmd

  3. 「cmd」 と入力して OK をクリックするとコマンドプロンプトが開きます。

py -m pip install openpyxl と入力して、enterを押すと、以下のようにopenpyxl のインストールが開始します。”Successfully installed”(出力の下から3行目)と表示されていたら、インストール成功です。

py -mとは?

Pythonの実行を管理するPythonランチャー(py.exe)を介してpipコマンドを実行するために付けています。これにより実行バージョンとの整合性がとれます。Macでは不要です。

Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.

C:\Users\taro>py -m pip install openpyxl
Collecting openpyxl
  Downloading openpyxl-2.4.1.tar.gz (154kB)
    100% |################################| 163kB 1.3MB/s
Collecting jdcal (from openpyxl)
  Downloading jdcal-1.3.tar.gz
Collecting et-xmlfile (from openpyxl)
  Downloading et_xmlfile-1.0.1.tar.gz
Installing collected packages: jdcal, et-xmlfile, openpyxl
  Running setup.py install for jdcal ... done
  Running setup.py install for et-xmlfile ... done
  Running setup.py install for openpyxl ... done
Successfully installed et-xmlfile-1.0.1 jdcal-1.3 openpyxl-2.4.1
You are using pip version 8.1.1, however version 9.0.1 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.

C:\Users\taro>

pipとは、Pythonのパッケージ管理システムと呼ばれるもので、pipを使うことで、上記のように簡単にライブラリをインストールできます。

上記の出力の最後には、「新しいpipがあるので、アップデートを検討するように」と表示されることがありますが、ここではアップデートせずそのまま進みます。pipに関して詳しいことは以下の記事を参考にしてください。

Pythonには豊富な標準ライブラリが備わっています。システム、ファイルIO、関数、データベース、ウェブ等、非常に多彩です。Pythonが「バッテリー同梱(batteries included)」と呼…

まず実行してみましょう

1. メニューからPythonのIDLEを開きます。

python idle select from menu

2. エディタを開いて、コードを貼り付ける

ツールバーのメニューから File ▶ New File を選択すると新しいウィンドウが開きます。そこに、以下のプログラムコードをコピーして貼り付けてください。

import sys, os, datetime, openpyxl

YOUBI = ['月','火','水','木','金','土','日']

input_date = input('作成する年月度を入力してください(例:201608):')
try:
    # 当月の初日
    month_first = datetime.datetime.strptime(input_date, '%Y%m')
except ValueError:
    input('年月を201608のように入力してください。')
    sys.exit()

# 前月の末日
month_last = month_first - datetime.timedelta(days = 1)

# 勤怠管理の開始日と終了日(20日締め)
date_start = month_last.replace(day = 21)
date_end = month_first.replace(day = 20)

# エクセルブックファイル(ひな形)
file_template = '勤怠管理表.xlsx'
book = openpyxl.load_workbook(file_template)

# エクセルシート
sheet = book.get_sheet_by_name('Sheet1')

# 年月度の入力
sheet.cell(row = 1, column = 1).value = month_first.year
sheet.cell(row = 1, column = 3).value = month_first.month

# 月日曜日の入力
for rowNum in range(13, 44):
    if date_start <= date_end:
        # 月
        sheet.cell(row = rowNum, column = 1).value = date_start.month
        # 日
        sheet.cell(row = rowNum, column = 2).value = date_start.day
        # 曜日
        sheet.cell(row = rowNum, column = 3).value = YOUBI[date_start.weekday()]
    date_start += datetime.timedelta(days = 1)
    
# 新規ブックファイル保存
file_new = month_first.strftime('%Y%m') + '_' + file_template
book.save(file_new)

3. コードの保存

ドキュメントフォルダ(Documents)に「programpy」フォルダを作成し、さらにその下に「automation_04」を作成しておきます(好きな名前でも大丈夫です)。ツールバーのメニューから File ▶ Save を選択して、「make_work_time_sheet.py」という名前で、作成したフォルダに保存します。

4. ひな形の勤怠管理表ファイルの準備

簡単なサンプルを用意しましたので、ダウンロードして先ほど作成した「automation_04」フォルダにコピーします

勤怠管理表のひな形(勤怠管理表.xlsx)のダウンロード

ファイルの中身は、以下のようなエクセルファイルなっています。

kintai sheet template

このファイルを開くとわかりますが、外部プログラムから操作するエクセルファイルには、セルの結合を使用しないでください。セルの位置を誤る原因になります。

5. プログラムの実行

以下のようにツールバーのメニューから Run ▶ Run Module を選択するとプログラムが実行します。

python idle select from menu

すると以下のようにコマンドプロンプトが開くので、勤怠管理表を作成したい年月度を入力し、エンターキーを押します。

kintai cmd input

6. 結果の確認

以下のような別名のエクセルファイル(この例では、201703_勤怠管理表.xlsx)が出来上がります。日付と曜日が正しく入力されているのが確認できます。

kintai cmd input

ダブルクリックして実行してみる

Pythonはexeファイルを作らなくても、*.pyファイルをダブルクリックすれば、そのまま実行できます。これが、非常に便利なところです。

「make_work_time_sheet.py」と「勤怠管理表.xlsx」を適当なフォルダにコピーしてください。

「make_work_time_sheet.py」を、ダブルクリックし、起動したコマンドプロンプトに作成したい年月度(201703など)を入力すれば日付と曜日の入った勤怠管理表が作成されます。

カスタマイズ例

今回のコードをベースに以下のようなカスタマイズが考えられます。

ケース1:月末締めにする。
ケース2:要出勤日数をコマンドプロンプトで指定できるようにする。
ケース3:社員名簿ファイルを読み取り、社員分の勤怠管理表ファイルを作成する。

ここで、社員No.、所属、氏名の欄に自動入力されるようにする。

ケース4:会社の休業日ファイル(祝日を含む)を作成し、土日以外の休日にも対応させる。

ここで、要出勤日数は計算し自動入力されるようにする。

ケース5:曜日の色を、土曜日は青、日曜日と祝日は赤にする。