misc.log

日常茶飯事とお仕事と

PythonでExcelファイルの特定セル内容をコピーする

事の背景

2018年だったかのデブサミに出店していた店で、この本を買いました。

2022年7月に第二版が出るらしいですが、私が買ったのは最初の版の方です。

2年近く放置して積ん読状態だったのですが、ついに必要に迫られて読むことに。2020年秋から客先作業の支援で「エクセルファイルで提供されるデータをミドルウェアの取込機能で読み込ませて所定の作業をする」というものがあり、その最終工程で客先向け報告に「取り込んだ品目名称情報を列挙する」という作業があったのです。この作業は、提供されたエクセルを開いて、2セルほどの情報をテキストファイルか何かにコピペ。それを作業依頼チケットに貼り付けて報告という単純なものだったのですが、単純だけに分量があると結構面倒なんですね。

というわけで、この作業を半自動化できないか、ということでこの本を読み始めました。

本を読んで作ったもの

本を7割ぐらい読んだところで実際にやってみよう、と思い立ち、最終的に作ったのがこれです。初めてのPythonプログラムなので記法等に稚拙なところがあればご容赦ください。

import sys
import openpyxl
import pyperclip
import os
import glob

names = ''

# 第1引数が対象フォルダーとなる
targetFolder = sys.argv[1].replace('\\','/')

# 指定されたフォルダー以下のExcelファイルに対して処理を実行する
files = glob.glob(targetFolder + '/*')
for fileName in  files:
    # 拡張子がxlsmのファイルのみ処理対象とする
    root, ext = os.path.splitext(fileName)
    if ext == '.xlsm':
        # Excelファイルを開く
        book = openpyxl.load_workbook(fileName)
        sheet = book.active

        # 規格、品目名を取得する
        name_hinmokucode = sheet['C13'].value
        name_hinmoku = sheet['C15'].value

        # 書き出し用文字列を生成
        names = names + '品目コード:' + name_hinmokucode + '\n'
        names = names + '品目名:' + name_hinmoku + '\n\n'

        book.close

# 情報をクリップボードに書き出す
pyperclip.copy(names)

これをPythonインタープリターがインストールされたPCで動かすには、py.exe に上記スクリプトと引数を渡すバッチファイルを作り、バッチファイル経由で実行します。

py ../helper/GetNames.py ./受領ファイル

バッチのあるファイルから、Pythonスクリプトのファイル(GetNames.py)を指定、空白を開けて、バッチファイルの位置から見た処理対象Excelファイルがあるフォルダーを相対パスで指定しています。

実行結果は下記のようなシンプルなものがクリップボードに入るだけですが、これを報告用のチケットコメント欄にペーストすれば、ほぼほぼ作業は終わりです。

品目コード:123456
品目名:しなものA
品目コード:678901
品目名:しなものB
品目コード:E12356
品目名:しなものC

参考にしたページ

上記のものを作るのに参考にしたのは、退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング の下記の部分です。

  • 12.3 Excel文書を読み込む / 12.3.1 OpenPyXLを用いてExcelドキュメントを開く …… ExcelファイルをNPOIのように直接操作できるライブラリーがあることを知る
  • 8.2 os.pathモジュール …… ファイル操作系のライブラリーが有ることを知る
  • 8.7 プロジェクト: マルチクリップボード …… 自分に根本から抜けていた「クリップボードを出力先にする」という発想に着地、pyperclipライブラリーでクリップボード操作を出来ることを知る
  • 付録D.2 誤記検出ツール …… globオブジェクトによるファイル一括操作の方法を知る
  • 付録B.2 WindowsPythonスクリプトを実行する …… py.exeでスクリプトファイルを指定して実行する具体的な方法を知る

対象ファイルの名称から拡張子を抜き出す「os.path.splittext」の用法と、Pythonならではの「関数の戻り値が複数の場合に左辺はカンマ区切りで列挙可能」、いわゆるTupleでの情報授受についてはWebで検索して調べました。

効果

2020年10月から150ファイルぐらいを処理したあたりで「やってられるか!」となり、2021年5月に本を読んでスクリプトを作成。ファイルを開いて、コピペ2回を1業務処理あたり数回繰り返すという、前後のフォルダー移動やExcel起動といった処理も含めると1分弱ぐらいの作業を2秒ぐらいの待ちで実現可能に。これが200件ありましたので、手作業によるミスの手戻りややる気減退による遅延なども含めて5時間とすると、まぁ税抜3,700円の本を買った価値はあったかな、と。

使ったことがない言語でファイル操作、というのは少々面倒で、ある程度試行錯誤やデバッグを行う必要があるのですんなりとは行きませんが、面倒な作業を機械にやらせて人間様はもっと高度な仕事をする、というのがコンピューターの存在意義だとおもうので、みなさんもガンガンやりましょう。

参考:NPOIを使ってC#で作る手も……

同じようなことをC#などでやる方法もあります。NPOIと呼ばれるライブラリーを使うのが自分は楽だと思いますが、手は何通りか有るかと思います。興味のある方はやってみてください。

www.backyrd.net