奇人凡人の雑記帳

趣味とか投資とか、twitterに書きにくいことをこちらに書きます。毎週金曜更新目標(現在多忙のため月1の投資成績がメインです)

pythonanywhereでExcelとどこまで連携できるか?

h05torです。

 

社内でのAI(人工知能)に関するプロジェクトで将来的に会社HPに載せるためのプロトタイプサイトとしてpythonanywhereでwebページを作成しています。

ちなみに私は社内SEでなければシステム担当者でもありません。

そのページでのサーバー側での計算にpythonでプログラムを書いているのですが、自分があまり分かっていないような計算もあるのですが、その計算については先輩社員がエクセルのマクロ(VBA)で既に作って頂いているので、私は内容をあまり理解せずに(おい)pythonに転写するという作業もやっています。

もっとも最近私もメインの業務で忙しく、今月給与期間分の残業時間50時間超えという大台を叩き出してしまったので、先の先輩社員から「h05tor君最近大変だからpythonに書き換えなくてもエクセルと連携できないかな?openpyxlとかあるけどどうかな?」とメールが来ていたので、確かに全部pythonに書き直すの大変だしエクセル紐づけてpythonanywhereのサーバーからマクロ動かして値だけ受け取ってブラウザに表示できたら楽じゃね?と思いました。

 

そう、その時はいけるんじゃね?と思いました。

先に結論からいいますと・・・・

出来ませんでした。

はい、全部pythonで書けってことですね。

 

では、なぜできなかったのか?

①openpyxlにマクロを動かす機能はない

pythonからエクセルにアクセスするライブラリのひとつにopenpyxlというものがあります。これはエクセルのセルの値を読み込んでpython側で受け取る、あるいは逆にエクセルに書き込みを行うといった機能があります。

実は先ほどのお話の前に既にデータベース代わりにエクセルファイル(.xlsx)をサーバーに置き、そこからデータを引っ張ってくるというやり方でopenpyxlは使っておりました。

しかし、openpyxlにはエクセルのマクロを動かす機能は搭載されていないです。

 

↓のサイトにもありますが、

PythonでExcelマクロ実行!VBAを起動する方法 (fastclassinfo.com)

pythonのライブラリでエクセルのマクロを動かすことが可能なものに「win32com」、「xlwings」があるようです。

が、結論からいうとこれらも没になりました。

②win32comはエクセルがインストール済の環境でないと動作しない

そもそもpythonanywhereにエクセルをインストールすることができないためこの方法は速攻で没になりました。

そして、xlwingsが残るのですが・・・

③xlwingsはLinux環境では動作しない

実はxlwingsは測定機器から出力された実験データをエクセルに自動で書き込むための自作RPAツールで使ったことがあるため、ちょっとこれに賭けていたところがありました。テストプログラムとしてデスクのPC(windows)でやってみた時は動きましたのであとはpythonanywhereで動かせるかという段階まで試しました。

しかも、そこから何故かplotlyというライブラリにFigureWidgetが入っていません(一応pythonanywhereでデフォルトでplotly入っていましたがそのバージョンだとFigureWidget入ってない?)とエラーが出たのでplotlyの5.8.2を入れてディスクの容量を食ったり(異様に重い)しました。 ↓こんなの出た

ここまでようやくクリアしてついに動かせるか?というところでしたが、xlwingsで出だしの「app = xw.App(visible=False)」とお決まりのフレーズの部分でエラーになってしまいました。

こればかりはどうしたもんかと調べてみましたが、xlwingsはLinux環境では動作しないとのことでした。

pythonanywhereはLinuxベースであるため普通は何事もない部分でエラーが出てしまったようです。

ちなみに上記のopenpyxlはLinuxでも動作するようです。(マクロは動かせないけど)

 

結局のところVBAのプログラムを全部pythonに書き換えるしかないようですね。