16
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PythonでPower BI Desktopを自動更新する

Last updated at Posted at 2020-07-31

PowerBI便利ですよね。

一回作っておけば毎月の分析が自動でされる気持ちよさ。
自由にグラフ配置できて、求めるデータが一目で理解できる明確さ。
マウス操作だけで自分なりに分析を深めていけるフィルタやヒント機能。
直感的につなげられるテーブル間のリレーション。
様々なデータソースとの連携。
何しろこれで無料というんだからびっくりです。

自分も、数億件規模のデータを分析するのに使っています。
ヒント機能使って、その時間に何が起きていたか表示するの楽しいですよね。
ただ、一つ問題が。

更新がめんどくさい!!
データの前処理しているとはいえ、データ読み込んでくるの数十分はかかります。
ぱっと出したいときなんかはストレスです。PC重くなるし。
それに、スペック低いPCで更新しようものなら、メモリ不足で落ちます。
Power BI Desktopじゃなくて、無印のPower BIなら自動更新もできるそうですけど、有料になっちゃうし、アカウント管理とか大変。

ということで、今回PowerBI DeskTopを自動化するプログラムをPythonでつくりました。

環境・構成

Windows 10 Proのタスクスケジューラを使って、Pythonのプログラムを定期実行しています。
Pywinautoを使ってGUIでpbixファイルを開いて、「更新」ボタンをクリックしてから保存しています。
ちなみに、データソースはサーバー上のMySQLとつないで取得してきています。

コード

auto_pbi.py
import os
import sys
import time

from pywinauto import Desktop, Application, keyboard

def main(workbook):
    exe = 'PBIDesktop.exe'

    # ファイルを開く
    os.system('start "" "{0}"'.format(workbook))
    app = Application(backend='uia').connect(path=exe)
    time.sleep(60)
    try:
        # Windowを指定
        win = app.window(title_re = '.*Power BI Desktop')
        win.set_focus()
        # ホーム>更新をクリック
        win.ホーム.wait("visible")
        win.ホーム.click_input()
        win.更新.wait("visible")
        win.更新.click_input()
        win.キャンセル.wait_not("visible",timeout=6000)
        # 保存
        keyboard.send_keys("^s")
        time.sleep(120)
    except Exception as e:
        print(e)
    finally:
        app.kill()


if __name__ == '__main__':
    try:
        file_path = sys.argv[1]
    except (IndexError):
        print('ファイルを指定してください。')
        sys.exit()

    main(file_path)

上記のコードをauto_pbi.batで指定してタスクスケジューラで走らせています。

auto_pbi.bat
cd 指定フォルダ
python.exe auto_pbi.py レポート.pbix
exit

Pythonや.pyファイル、pbixファイルについては、絶対パスで書いておくことをお勧めします。
自分はフォルダ内にレポートとpyファイル入れてしまっているので、最初の行でフォルダ移動しています。

注意点

タスクスケジューラの実行

自分はリモートPCでこのプログラムを実行しようとしましたが、うまくいきませんでした。
タスクスケジューラを自分で「実行」するとうまくいきますが、リモート接続を切ってトリガーで実行させようとするとうまくいかなくなります。
これは、リモートPCの場合、リモートデスクトップの接続が切れたときに、デスクトップ画面がロックされてしまうからです。
以下のようなエラーが出ます。

there is no active desktop required for moving mouse cursor!

この対策をするためには、リモートデスクトップを切った時にデスクトップ画面がロックアウトしないように設定する必要があります。
https://pywinauto.readthedocs.io/en/latest/remote_execution.html

自分は、リモートデスクトップを切るときに以下のコマンドを使うという方法をとりました。
#80となっているところは環境に合わせて変えてください。
リモート先のPCでタスクマネージャー>ユーザーと開き、各カラムの見出し部分を右クリックして「セッション」にチェックをつけると、リモートセッションIDが表示されます。
リモートデスクトップのセッションを切るときに以下のコマンドをコマンドプロンプトから入力してください。

TSCON RDP-Tcp#80 /dest:console

スリープ処理

pbiを立ち上げてから少し待たないと、Windowが立ち上がってこないためエラーが出ました。
あと、意外と注意しないとなと思ったのは、Ctrl+Sで保存したあとのスリープ処理。
30秒くらいで保存処理完了できるかと思いましたが、できませんでした。
思っているより長めにとっておいたほうがよいかと思います。

その他

更新したらファイルコピーして送るとか、エラー出たらメールはいるようにしておくとか、これをベースにしていただければ、毎日のビッグデータ更新みたいな面倒な処理が省けて、快適なPowerBIライフを送っていただけるんじゃないかと思います!

16
12
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?