Alteryx DesignerからExcelに再計算をさせる方法
AlteryxACEのAkimasaKajitaniです。
Alteryxは書式や計算式などが設定された既存のExcelファイルに対して書き込みを行うことが可能です。ただ、このExcelファイルに数式が埋め込まれていた場合に若干注意が必要となります。何が起きるのか解説したいと思います。
Alteryxで数値を更新したときに何が起きるのか?
例えば、Alteryxから事前に準備されたExcelファイルのフォーマットがあり、グラフや計算式による集計を行っているとします。もちろん、グラフも計算式もAlteryxで再現することができないわけではありませんが、一旦は今のExcelをそのまま使いたい、ということもよくあることです。この時、Alteryxで書き込んだ結果をすぐにAlteryxで読み込み、値が正常に集計できているか、などチェックをかけたいとします。
実はここに落とし穴があります。
Excelの再計算は特定のタイミングで行われるようになっており、ファイルをExcel自体で開いているときは、たいてい自動実行が有効になっており、特に気にせず計算が行われています。しかし、Alteryxなどで書き込みを行った際は自動計算が行われないようになっています。たいていの場合、Excelを普通にダブルクリックで開いた時点で再計算が走るため、あまりこのような現象に会う方は少ないかと思います。
AlteryxでExcelの再計算を行わせる
ということで、Alteryxで書き込んだあとに再計算させてすぐに読み込んで値のチェックを行うための方法を考えてみたいと思います。
方法としては2つあります。
- VBA(マクロ)をAlteryxから呼び出し、再計算を行わせた後に保存する
- Pythonツールで再計算を行わせる
VBAもかなりレガシーの技術になってきているため、今回はPythonツールで行う方法をご紹介します。
基本的には、Pywin32モジュールを使います。他のモジュールでは再計算機能が動かないため要注意です。コードとしては以下のとおりです。
注意:pywin32が導入されていない場合は、Designerを管理者モードで起動し、一度こちらのコードを実行してください。それによりpywin32が導入されます。詳細はこちらの記事を御覧ください。
Package.installPackages(['pywin32'])
from ayx import Alteryx
import win32com.client
df = Alteryx.read("#1")
for row in df.itertuples():
#rewrite the File Path for Windows
fp = row.FILE_PATH.replace("\\","/")
print(fp)
#Open Excel
xlApp = win32com.client.Dispatch("Excel.Application")
#Open Workbook
wb = xlApp.Workbooks.Open(fp)
#RE Calculate
xlApp.Calculate()
wb.RefreshAll()
xlApp.DisplayAlerts = False
wb.Save()
wb.Close(SaveChanges=True)
xlApp.Quit()
Alteryx.write(df,1)
「xlApp.Calculate()」の部分がまさに再計算を行わせるところです。また、こちらのコードでは、ファイルパスをPythonツールに読み込ませることで複数のファイルを一気に再計算を行わせることが可能なコードとなっています。
注意点
- ExcelがインストールされているPCのみで動作します
この注意点を読んだ方のうち「Excelがインストールされていない環境でなんとかならないの?」と思われる方も多くいらっしゃるかと思います。例えば、他のPythonライブラリでopenpyxlsというものがあり、こちらはExcel本体がインストールされていなくてもライブラリ自体は動くのですが、再計算を行わせることはできません。openpyxls自体で操作したときも再計算ができない、というのはAlteryxと同じ悩みですので、ご注意ください。結論としては、再計算はExcel本体が必要、ということになります。
これを回避するには、Excelの集計機能などは使わず、すべてAlteryxで計算させて書き込むことでしょうか・・・。
サンプルワークフローダウンロード
Alteryx Designer 2024.1.1.136 パッチ: 4時点の情報です