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

##概要
　入力処理の自動化をする場合、前処理としてPythonのプロセスを組み込みたいことがあるかもしれません。
WinAutomationにはPythonアクションがありますがIronPythonというもので、Pandas等ライブラリの使用は難しいようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/35fe30fe-9492-1257-86b9-19f2e16e2d95.png)
そこで自身が使いたいライブラリをインストールした環境のPythonをWinautomationから実行する方法を説明したいと思います。
##お題
次ようなnull(空欄)が含まれる1万行のExcelデータを0（ゼロ)で埋めて他システムに入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/32604ddd-063d-a4b1-2dc9-50a1762a3561.png)
0埋めする部分をpython、入力部分はWinautomationで行います（仮想としてExcel to Excel)
##前提条件
* Windows10 64bit
* WinAutomation 9.2.1
* Python 3.8.5

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

##環境構築
###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](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)をしている

##Winautomationのプロセス


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/402fcee1-4415-3d53-3b4e-a0d44cee7723.png)

###監視フォルダの設定
WinAutomation ConsoleからTriggersでFile Monitor Triggerを設定する
![スクリーンショット 2020-09-13 135734.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/b40e6ca8-2b97-d2ef-68db-1a4caa193ce9.jpeg)
OKしたあと起動するプロセス名を紐づけ

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

|変数名|内容|
|:---|:---:|
|％FileTriggerFileName％|拡張子まで含めたファイル名|
|％FileTriggerFilePath％|ファイルの完全なパス及びファイルのすべてのプロパティを保持|
|%FileTriggerFilePath.NameWithoutExtension%|拡張子を含まないファイル名|
###プロセスの作成
プロセス全体像
![スクリーンショット 2020-09-13 203140.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/51b7bebb-65c9-2ae5-6008-8908ed6ca352.jpeg)


###各アクションの解説
####1.Set Variable
File Monitor Triggeから渡されるファイル名の変数が長すぎるのでわかりやすくしただけ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/68b2b433-bb85-93ab-4154-700b21c170d4.png)
####2.Copy File(s)
Dataフォルダに検知したファイルを作業(Work)フォルダにコピー
![スクリーンショット 2020-09-13 180433.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/6812eddd-f01d-bc8c-776e-04ab34feb736.jpeg)
####3.Write Text to File
Python Script(.py)の作成
投入するデータファイルが固定されたファイル名であればpython scriptも毎回生成する必要はない
この場合はファイル名に日付が入っているなど変動する場合を想定しているため、毎回ファイル名をTriggerの変数より取得して書き込むようにしている
ZZ.pyという名前を付けてUTF-8で保存
![スクリーンショット 2020-09-13 181647.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/7fba0e5a-6166-67fc-56b8-7eb516c8d4f9.jpeg)
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/38948ed3-01b3-1540-668c-a4c1075dc489.jpeg)

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

![スクリーンショット 2020-09-13 183945.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/69b5ae58-f98e-d80c-f68c-afff536e216c.jpeg)
####6~17のプロセスについて
これら他システムへの入力の代わりにブランクのExcelに1セルずつデータ部分転記しているだけなので省略する
一括コピーをしないのは他システムで入力するにあたり、トランザクションが発生することを想定しているため
![ezgif.com-crop.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/4d34981f-673d-59c5-49f7-571367905847.gif)


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

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

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