複数のExcelファイルをAzure Data FactoryでSQLサーバにインポートしてPower BIで可視化する

船井総研デジタルのよもぎたです。
この記事は[株式会社船井総研デジタル Advent Calendar 2022](https://qiita.com/advent-calendar/2022/fsdg)の12日目の記事です。

# サマリ
記事のタイトルの通り、複数のExcelファイルをAzure Data FactoryでSQLサーバにインポートしてPower BIで可視化してみようという記事です。
目論見としては、次のような流れを想定しています。

1. データの形式を考える
1. テスト用のExcelファイルを複数用意する。
1. ExcelファイルをBLOBストレージにアップロードする
1. Azure SQL Serverをデプロイして、DatabaseとTableを作成する
1. Azure Data Factory(以下ADFと略します)をデプロイする
1. ADFでBLOBストレージからExcelファイルを読み込んでAzure SQL ServerにインポートするPipelineを作成する
1. 作成したPipelineを実行する
1. Azure SQL Serverにデータがインポートされたことを確認する
1. Power BI DesktopアプリでAzure SQL Serverのデータをもとにレポートを作成する
1. 作成したレポートをPower BIサービスに発行する

# 実際にやってみる

## データの形式を考える
今回は、正直なところ、ここは本題ではありません。最終的にグラフ化できればよいです。そこで、シンプルに1行につき日付と整数の値が2つある3列の形式にすることにしました。日付は2022/1/1～1/31とします。整数は乱数を使います。具体的には、Excelの数式で``INT(RAND()*10)``とします。

## テスト用Excelファイルを用意する
Excelファイルは複数用意したいので、2022/1/1～1/10、1/11～1/20、1/21～1/31の3つの期間に分けて作成します。

例として1つ目のファイルのスクリーンショットは次の通りです。
![Excel1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/7fdd0271-333e-a5d0-d4c4-b63083a1134e.png)

## ExcelファイルをBLOBストレージにアップロードする
ここも本題ではないので簡単に。Azure Portalでも、Azure Storage Explorerでも、その他の方法でも、任意のコンテナを作成してそこにExcelファイルをアップロードします。

## Azure SQL Serverをデプロイして、DatabaseとTableを作成する
ここも本題ではないので簡単に。Azure SQLサーバーをSQL認証も有効にしてデプロイして、クライアントIPアドレス（自分のグローバルIPアドレス）からの接続を許可します。Azure Data Studioでデプロイしたサーバーに接続し、下記のSQL文でテーブルを作成します。

```sql
CREATE TABLE qiitaac2022
  (date DATE PRIMARY KEY,
   VALUE1 INTEGER,
   VALUE2 INTEGER);
```

## ADFをデプロイする

ようやく本題に近づいてきました。

Azure Portalでリソースの作成を選択し、「分析」カテゴリで「Data Factory」を「作成」します。
![adfss1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/8dc05733-9d02-4ca7-ffa4-bba241be88cb.png)

「基本情報」で任意のサブスクリプションとリソースグループを選択し、Data Factoryの名前を設定します。名前はMicrosoft Azure 全体で一意でなければならず、名前の大文字と小文字を区別されません。
![adfsss2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/cce513d9-59a8-e4b6-5dcc-1d370e3f0d0b.png)

Git構成、ネットワーク、詳細はデフォルトのままでOKです。タグは必要に応じて付けてください。デプロイが完了したら、リソースに移動して「スタジオの起動」をクリックします。
![adfsss3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/e9c9b253-8667-0e2d-47f8-de3405b3c3c6.png)

「Azure Data Factory Studio」が新しいタブで起動します。
![adfsss4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/d6c68d6e-5a0f-6579-566f-331ae3e2162c.png)

このAzure Data Factory StduioでデータをインポートするPipelineを作成していきます。

## ADFでExcelファイルを読み込んでAzure SQL ServerにインポートするPipelineを作成する

Azure Data Factory Stduioの左の鉛筆のアイコンをクリックします。鉛筆のアイコンは「Author」でPipelineなどを作成するツールです。

Datasetsの右の数字（下記のスクリーンショットでは0）にカーソルを合わせると「Datasetsアクション」メニューになるので、そこから「新しいデータセット」を選びます。そうすると右側にソースとなるデータストアの選択画面が表示されます。そこで、「Azure」を選び、次に「Azure BLOBストレージ」を選択して続行をクリックします。
![studioss02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/8bff4ae4-f404-98f2-dd53-5e0516a69887.png)

続いてデータ形式の選択画面に遷移するので、Excelを選んで「続行」をクリックします。
![studioss03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/23fe581d-870e-5826-53d3-10726c888029.png)

続いて読み込むファイルが置いてあるストレージアカウントの選択画面に遷移します。ファイルが置いてあるストレージアカウントを選択して、「作成」をクリックします。
![studioss04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/05b4b6db-988e-6718-fe85-65f08546f299.png)

続いて読み込むExcelファイルの選択画面に遷移します。ファイルパスでExcelファイルを置いたコンテナを選択します。ディレクトリ配下に置いた場合はディレクトリも選択してください。ファイル名は空欄のままでOKです。
「ワークシートモード」で読み込むデータがあるExcelのワークシートを選択します。少し時間がかかりますが、元ファイルから読み込んでプルダウンメニューになります。「先頭行をヘッダーとして」にチェックを入れます。
最後に、「OK」をクリックします。
![studioss05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/8d03876b-e1f8-358f-a33e-769ceb5a43b8.png)

もう一つ新しいデータセットを作ります。コピー先となるSQLサーバーです。新しいデータセットの選択で今度は「Azure SQL Database」を選択して「続行」をクリックします。
![studioss06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/ae8e8f40-52ba-349c-1ce8-4ba449b0c598.png)

続いてコピー先のSQLサーバーの選択画面に遷移します。Azureサブスクリプション、サーバー名、データベース名を選択します。認証はSQL認証にして、サーバーをデプロイした際のユーザー名とパスワードを入力します。最後に「作成」をクリックします。
![studioss07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/97a22752-0258-b976-9cb4-d6998e35b41c.png)

続いてデータをインサートするテーブルの選択画面に遷移します。目的のテーブルを選択して、「OK」をクリックします。
![studioss08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/ee5a8316-afca-099a-00e5-81452b753327.png)

これで、コピー元とコピー先の準備ができました。

AuthorのメニューのPipelinesから、新しいパイプラインを作成します。アクティビティのうち「移動と変換」を展開し、「データのコピー」を右のエリアにドラッグアンドドロップします。
![studioss09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/2c97f28a-cfb3-0db6-2c59-5355b96ce442.png)

続いて、コピー元（ソース）とコピー先（シンク）のデータセットを設定します。
「データのコピー」をドラッグアンドドロップした下のエリアのメニューで、まずは「ソース」を選択し、「ソースデータセット」のプルダウンメニューからExcelのデータセットを選択します。「ファイルパスの種類」は「ワイルドカードファイルパス」を選択し、ファイル名に``*``を入力します。
![studioss10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/4ebfbb75-b5d8-2317-19c2-6672aed8af58.png)

次に「シンク」を選択し「ソースデータセット」のプルダウンメニューからSQLサーバーのデータセットを選択します。
![studioss11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/de811662-76c7-017a-f0a7-8bdf7f188236.png)

次に「マップ」を選択し「スキーマのインポート」をクリックします。
![studioss15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/c9911dd9-a737-da3f-49f4-9058501a5b1c.png)


最後に左上の「すべて発行」をクリックし、右に開くメニューで「発行」をクリックします。
![studioss12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/2efdbcb3-8cb1-6853-2ae5-f19b62768321.png)

これでパイプラインを実行する準備が整いました。

## Pipelineを実行する
パイプラインの上のメニューの「トリガーの追加」をクリックします。そこで開いたメニューから「今すぐトリガー」をクリックします。右に開くメニューで下の「OK」をクリックします。
![studioss13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/884500ee-ce00-1a89-d835-382745c69dcf.png)

ポップアップの「パイプラインの実行の表示」をクリックして、実行のモニター画面に遷移します。右下の「状態」が「成功」になれば完了です。
![studioss16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/333d3720-cdd6-49a5-2f60-fff74a7dd69c.png)

## Azure SQL Serverにデータがインポートされたことを確認する
Azure Data Studioでデータがテーブルにインサートされたことを確認します。

``SELECT * FROM qiitaac2022;``と``SELECT COUNT(*) FROM qiitaac2022;``を実行し、それぞれ結果を見ます。

Excelのデータがインポートされていることが確認できます。
![dbss1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/db40d63c-93c3-8a94-0976-6e5ce0111c92.png)

テーブルに31行データがインサートされている、つまり、３つのExcelファイルすべてからデータを読み込んでいることが確認できます。
![dbss2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/7f72d134-e144-c65f-4f40-d381f51fcb54.png)

## Power BI Desktopアプリでレポートを作成する
Power BI Desktopアプリをインストールしていない場合、Windows10/11ならばMicrosoft Storeから入手できます。

Power BI Desktopを起動したら、ダイアログが表示されるので「データを取得」をクリックします。
![pbiss01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/edec1c3c-0208-a874-1e70-0003f4612ffb.png)

データの取得元を選択する画面に遷移しますので、「Azure」、「Azure SQL Database」の順に選択して、「接続」をクリックします。
![pbiss02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/ab1bf350-c510-7310-948d-d0fb670281e1.png)

接続先のデータベースサーバーの情報の入力画面に遷移しますので、サーバー名（FQDN）とデータベース名を入力して、「接続」をクリックします。サーバー名はAzure PortalのSQLサーバーの概要画面に記載されています。
![pbiss03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/bfedc82f-6db7-9aad-61de-ff43d2214d21.png)

SQLサーバーの認証情報を入力する画面に遷移しますので、まず左側の選択肢から「データベース」を選択し、右側でユーザー名とパスワードを入力して、「接続」をクリックします。完了するまで少し時間がかかりました。
![pbiss04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/f3fcb8b8-5585-e2fa-20f8-a7305440bf72.png)

データのインポート元となるテーブルの選択画面に遷移しますので、データがインサートされているテーブルを選択し、「読み込み」をクリックします。
![pbiss05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/678c9d3a-9fa5-8554-4e97-7f5266aa3663.png)

これで、データを可視化する準備が整いました。今回は折れ線グラフを作成したいと思います。右の「視覚化」のメニューのなかから、「折れ線グラフ」のボタンをクリックします。中央のエリアに折れ線グラフの枠（領域）が追加されます。大きさは適宜調整してください。
![pbiss06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/68860a83-c398-927f-e65e-6331b20f9554.png)

折れ線グラフの枠ができたら、X軸とY軸を何にするかを決定します。今回は、X軸を``date``に、Y軸を``VALUE1``に、第2Y軸を``VALUE2``とすることにします。「視覚化」の右の「フィールド」の下のテーブル名を展開し、それぞれのカラム名を各軸にドラッグアンドドロップします。
![pbiss07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/6b406f91-e269-2ff1-bbfb-3336041ae538.png)

これで、テーブルのデータがグラフ化されました。
![pbiss08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/454b2fc3-6fb4-ce8f-b9e5-ea7da5b23932.png)

ここでファイルを保存します。

## レポートをPower BIサービスに発行する
レポートをPower BIサービスに発行するために、まずPower BIサービスにサインアップする必要があります。Power BIサービスには[こちら(https://app.powerbi.com/)](https://app.powerbi.com/)からアクセスできます。
サインアップするためには、会社や学校などの組織の、独自ドメインのメールアドレスが必要になります。
![pbiss13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/957a6e45-f916-d3f1-811a-7d8d951b7413.png)

サインアップが完了したら、Power BI Desktopに戻ります。
「ホーム」を選択し、「発行」をクリックします。
![pbiss09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/0ee5c483-9075-b921-dcf1-de2e6e473763.png)

発行先を選択する画面に遷移しますので、「マイワークスペース」を選択して「選択」をクリックします。
![pbiss10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/f5307822-d899-6921-e4c9-699b56785e86.png)

Power BIサービスへの発行が成功したら、「Power BIで'～～'を開く」を選択します。
![pbiss11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/a2b70e1d-8eb5-ddb8-e8e9-342df79d42df.png)

ブラウザが開き、Power BIサービスでレポートが確認できます。
![pbiss12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/da9eb213-965f-6444-0947-1426f06e268d.png)

# まとめ
Excelファイルを用意するところから、Power BIサービスのWebでレポートを確認するところまで一連の流れをご紹介しました。いかがでしたでしょうか。

私としては、ほぼコードを書かずにWebUI/GUIでこれだけのことができることに正直感心しました。

それなりのボリュームの記事になりましたが、まだ課題はあります。例えば、ADFで読み込んだ後のExcelファイルの扱いであるとか、ADFの定期実行／イベントトリガーでの実行であるとか、Power BIサービスのレポートの定期更新などです。そういったことも、おいおいご紹介できればと考えております。

最後までお読みいただきありがとうございました。