3
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

WinAutomationから自分環境のPythonを使う

概要

 入力処理の自動化をする場合、前処理としてPythonのプロセスを組み込みたいことがあるかもしれません。
WinAutomationにはPythonアクションがありますがIronPythonというもので、Pandas等ライブラリの使用は難しいようです。
image.png
そこで自身が使いたいライブラリをインストールした環境のPythonをWinautomationから実行する方法を説明したいと思います。

お題

次ようなnull(空欄)が含まれる1万行のExcelデータを0(ゼロ)で埋めて他システムに入力
image.png
0埋めする部分をpython、入力部分はWinautomationで行います(仮想としてExcel to Excel)

前提条件

  • Windows10 64bit
  • WinAutomation 9.2.1
  • Python 3.8.5

Python環境構築についてはディストリビューション使用等、様々なお作法があるかもしれませんが、今回は公式版で説明していきます。インストール済みの環境がある場合、複数環境になると正常動作出来なくなる場合がありますので自己責任でお願いいたします。

環境構築

Pythonのインストール

https://www.python.org/
から3.8.5をダウンロード、デフォルトのままインストール。
同時にインストールされるランチャーアプリのPy.exeからスクリプトやコマンドの実行を行う。

インストール状況とランチャーの動作をバージョン情報を調べて確認

C:\Users\username>py -V
Python 3.8.5

初期インストールされているライブラリの確認
最新版でないライブラリの確認

C:\Users\username>py -m pip list
Package         Version
--------------- -------
pip             20.2.1
setuptools      49.6.0

C:\Users\username>py -m pip list --outdate

最新版でなければ両方ともアップデート

C:\Users\user>py -m pip install -U ライブラリ名

py -m pip listで再確認

データ処理に必要なライブラリをインストール

今回はデータ処理にpandas、エクセルファイルの読み書きにopenpyxlとxlrdを使用
numpyや他必要ライブラリはpandsインストール時に自動でインストールされる

C:\Users\user>py -m pip install pandas
C:\Users\user>py -m pip install openpyxl
C:\Users\user>py -m pip install xlrd

C:\Users\user>py -m pip list
Package         Version
--------------- -------
et-xmlfile      1.0.1
jdcal           1.4.1
numpy           1.19.2
openpyxl        3.0.5
pandas          1.1.2
pip             20.2.3
python-dateutil 2.8.1
pytz            2020.1
setuptools      50.3.0
six             1.15.0
xlrd            1.2.0

同様に使いたいライブラリがあれば追加
なおコードエディターにはVisual Studio Codeをしている

Winautomationのプロセス

image.png

監視フォルダの設定

WinAutomation ConsoleからTriggersでFile Monitor Triggerを設定する
スクリーンショット 2020-09-13 135734.jpg
OKしたあと起動するプロセス名を紐づけ

File Monitor TriggerのCreatedが起動することで
以下の変数が自動的に値を持つ
Process Designerには表示されない変数なので覚えておくと便利

変数名 内容
%FileTriggerFileName% 拡張子まで含めたファイル名
%FileTriggerFilePath% ファイルの完全なパス及びファイルのすべてのプロパティを保持
%FileTriggerFilePath.NameWithoutExtension% 拡張子を含まないファイル名

プロセスの作成

プロセス全体像
スクリーンショット 2020-09-13 203140.jpg

各アクションの解説

1.Set Variable

File Monitor Triggeから渡されるファイル名の変数が長すぎるのでわかりやすくしただけ
image.png

2.Copy File(s)

Dataフォルダに検知したファイルを作業(Work)フォルダにコピー
スクリーンショット 2020-09-13 180433.jpg

3.Write Text to File

Python Script(.py)の作成
投入するデータファイルが固定されたファイル名であればpython scriptも毎回生成する必要はない
この場合はファイル名に日付が入っているなど変動する場合を想定しているため、毎回ファイル名をTriggerの変数より取得して書き込むようにしている
ZZ.pyという名前を付けてUTF-8で保存
スクリーンショット 2020-09-13 181647.jpg
Python ScriptはPandasに読み込んでゼロフィル、ファイル名2.xlsxで保存するだけのショボい内容
トリガーから作成されると変数部分にファイル名が入る

import pandas as pd
df = pd.read_excel('%FileTriggerFileName%')
df.fillna(0).to_excel('%FileName%2.xlsx',index = None)

4.Run DOS Command

3で作ったZZ.pyファイルを実行

スクリーンショット 2020-09-13 182956.jpg

5.Launch Excel

Pythonで生成されたエクセルファイルを開くのだが、変数化したファイル名のパス表記が、変数の手前だけ¥ではなく/とする
はまりポイントなので注意したい
またMake Instance Visibleのチェックを外した場合、画面に表示せず実行できるが、その場合は必ずプロセスの終わりにClose Excelを入れてインスタンスを閉じてあげないと裏で開いたままになるので注意

スクリーンショット 2020-09-13 183945.jpg

6~17のプロセスについて

これら他システムへの入力の代わりにブランクのExcelに1セルずつデータ部分転記しているだけなので省略する
一括コピーをしないのは他システムで入力するにあたり、トランザクションが発生することを想定しているため
ezgif.com-crop.gif

まとめ

ランチャーのpy.exeのおかげで.py Scriptが簡単に実行できます。
WinAutomationのプロセスにPandasなどの便利なライブラリが使えた上で組み込み可能。

実をいうとゼロ埋めをするだけならWinAutomationからExcelの置換を使って行うことができます。(一番簡単)
しかし複雑な前処理が必要な場合はExcelの制御は難しいように思います。
WinAutomation単体でも転記する際に空欄ならゼロにするプロセスにすれば同様のことが行えます。
ただしデータを前処理した場合より遅くなります。
筆者のボロマシンCorei7 3770 8Gでは1万行*7列を別Excelに1セルづつ転記した場合前処理ありだと5分50秒
前処理なしでWinAutomationで空欄ならゼロ処理させながら転記した場合は6分30秒でした。

WinAutomationの情報はまだ少ないので寂しいなぁ。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
3
Help us understand the problem. What are the problem?