2021年9月1日水曜日

PythonでXLS形式ファイルの中の数値を拾って集計して表示する方法

職場で毎日している作業をスクリプト化して少しでも楽する作戦第2弾。

会社のシステムから出力した売上データのシートから、いくつかの項目だけをピックアップして集計し、報告書のファイルに書き込んでメール送信する作業がある。これまでは、ファイルを開いて、必要な行以外を削除して、その項目の数値が有る列を集計する…という方法を取っていた。大した手間ではないが、なんだかんだで5分なり、他の作業が入れば10分ぐらいはかかる。もっと楽がしたい。
そこで、Pythonでファイルから数値を引っ張り出し集計させてみることにした。

例によって、会社のシステムから出力されるのはXLS形式なので、openpyxlは使えない。
XLS形式のファイルを読むライブラリのxlrdを使う。


import xlrd
import os
import sys
import tkinter, tkinter.filedialog, tkinter.messagebox
import math

file = sys.argv[1]
if os.path.exists(file):
     wb = xlrd.open_workbook(file)
     sheet = wb.sheet_by_name('00')
     col1_values = sheet.col_values(1)
     i = 0
     shukuhaku1 = 0
     kyukei1 = 0
     shukuhaku2 = 0
     kyukei2 = 0
     r = 0

     for val in col1_values:
          if '宿泊' in val:
               i=1
          if '休憩' in val:
               i=2
          if val=='<小計>' and i==1:
               shukuhaku1 = shukuhaku1 + sheet.cell_value(r,9)
               shukuhaku2 = shukuhaku2 + sheet.cell_value(r,15)
               i=0
          if val=='<小計>' and i==2:
               kyukei1 = kyukei1 + sheet.cell_value(r,9)
               kyukei2 = kyukei2 + sheet.cell_value(r,15)
               i=0
          r=r+1

tshukuhaku1 = math.floor(shukuhaku1/1000)
tshukuhaku2 = math.floor(shukuhaku2/1000)
tkyukei1 = math.floor(kyukei1/1000)
tkyukei2 = math.floor(kyukei2/1000)

text = "1:宿泊 {0} 休憩 {1}\n2:宿泊 {2} 休憩 {3}"
message = text.format(tshukuhaku1,tkyukei1,tshukuhaku2,tkyukei2)
tkinter.messagebox.showinfo('結果', message)

エレガントさの欠片もないようなスクリプトだけど、初心者には却ってわかりやすいと思うのでこのまま晒す。(会社用に作ったスクリプトから一部を省略してます)

元々のシステムから出てくる書式は、2つの期間を指定して出力すると、それぞれの期間の各項目の売上金額、個数、平均単価などが出てくるもの。
上のスクリプトを件のXLS形式ファイルを引数に実行すると、メッセージボックスで、2つの期間の項目名に「宿泊」・「休憩」がついた数値を集計した数字を表示してくれる。あとはそれを報告書に書き込めばいい。

スクリプトでやっているのは、

  1. 引数で指定されたファイルを開き「00」というシートの2列目のセルの内容を集めたリスト(col1_values)を作る。
  2. リストを順に見ていき、「宿泊」もしくは「休憩」というワードを含む項目を見つけたら「i」をフラグとして宿泊は1、休憩は2に設定し、その次に来る「<小計>」を探す。
  3. 「<小計>」を見つけたらその行にそれぞれの期間の売上金額の小計があるので、それが書かれてる列(10列目と16列目)の数字を読み込んで「宿泊」の項目(iが1)の1つめの期間の金額はshukuhaku1、2つ目の期間の金額はshukuhaku2、「休憩」の項目(iが2)は同じくkyukei1とkyukei2に足す。
  4. 報告は1,000円単位の数字で出すので、それぞれの数字を1,000で割って端数切捨てし、頭にtをつけた変数に入れ直す。
  5. メッセージボックスでそれぞれの数値を表示する。

という処理。
手間取ったのは、

  • 実際にファイルを開いた時自分が無意識に行っている「項目名を見て、そこの集計の数字を集める」という行為をプログラムでどう処理するかがポイントだったが、頭で考えるより、実際書いて試して直して行く方がわかりやすかった。
  • 今回は「宿泊」と「休憩」がついた項目だけをそれぞれ集計する形だったけど、項目名がもっとバラバラで、時間がない時は、集計したい項目=処理を列挙する泥臭い方法の方が手っ取り早いような気がする。
  • tkinterをちょっと表示させる方法を紹介しているページは多いが、特定のフォーマットに変数の中身を入れ込んで表示させる方法を紹介しているページが少なかった。

このスクリプトで、これまで5分程度かかった作業が、ファイルを出力させスクリプトにドラッグアンドドロップさせるだけで欲しい数値がわかるようになった。たかが5分、されど5分。
他にも似たような集計モノの作業が2つほどあり、このスクリプトを流用してそれぞれの作業も省力化できた。これで10~15分くらいは省略できる…はず

できれば、報告書のフォーマットに落とし込んでメールで送信するところまで自動化できたらなあと思っている。もっとできるなら、システムから出力するところまで自動化できたら…。そのへんはまた今度。

0 件のコメント:

コメントを投稿