Power BI でSharePoint Onlineに格納した画像を表示する

[Power BI 勉強会 @ 東京 #16](https://powerbi.connpass.com/event/165258/)で**SharePointに格納した画像を使ってレポートを作りたい**という質問があったので書きます。

ここでの検証は全て私の個人的な環境で行ったものなので、会社の環境や設定によっては異なる結果が出る場合があります。

(2020/3/2追記)Power BI王子こと[清水 優吾さん](https://qiita.com/yugoes1021)の指摘を基に不明点や誤ってた部分を訂正、または追記しました。
ありがとうございます。
それに伴い想定した用途から外れるので、Power BI ServiceからWebに公開した埋め込みコードへの言及を削除しました。

#結論
先に結論を言ってしまうと**出来ます。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/e9ba7d6f-6495-9381-d74e-9ebe87ef92c1.png)

Power BIは**テーブル、マトリックス、スライサー、または複数行カードに画像を表示する事ができます。**
レポートに画像を表示する際の考慮事項は以下の通り。
>- 画像のファイル形式は、.bmp、.jpg、.jpeg、.gif、.png、.svg のいずれかである必要があります。
>- URL は、SharePoint などのサインインが必要なサイトのものではなく、匿名でアクセスできる必要があります。 ただし、画像が SharePoint または OneDrive でホストされている場合は、その画像を直接ポイントする埋め込みコードを取得できる場合があります。

詳しい内容は[レポートのテーブル、マトリックス、スライサーに画像を表示する](https://docs.microsoft.com/ja-jp/power-bi/power-bi-images-tables)をご覧ください。

なお、**Power BI Desktopの場合のみSharePointに置いた画像を表示することが出来ませんでした。**
(2020/3/2追記)これはPower BI Desktopで作成中のレポートからではAzure ADの認証が出来ないからです。

検証結果は以下の通り。

| Power BI | 表示可否 |
|:-:|:-:|
| Power BI Desktopで作成中のレポート | × |
| Power BI Serviceに発行したレポート | 〇 |

では手順を見ていきましょう。

#手順
##SharePointの準備
###ドキュメントライブラリーに画像を格納する
ますSharePoint Onlineのドキュメントライブラリに画像をアップロードします。
今回は`Image`という名前のドキュメントライブラリを使っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/bb7e5209-a03e-4ff8-1007-d0c26f64def9.png)

そして**画像を使用したレポートを共有したいユーザーにSharePointサイトのアクセス権を与えます。**
これでSharePoint側の準備は終わりです。

##Power BI側の準備
###SharePoint ドキュメントライブラリに接続する
次にPower Queryで画像を格納したドキュメントライブラリ`Image`に接続します。
使うコネクターは`SharePoint フォルダー`です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/dbb0289a-6c22-d375-0a02-a3b8d408dae4.png)
ドキュメントライブラリへの接続の詳しい手順は[Power BIでSharePointのデータを利用する](https://qiita.com/Yellow11/items/39336e331c397bd94d2a)をご覧ください。

接続に成功すると、以下のようにSharePointサイト内にある全てのドキュメントライブラリに格納されたファイルが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/0809c47a-d157-d57b-5dd9-f6a106a3f340.png)

###画像データを読み出す
欲しいのはドキュメントライブラリ`Image`に格納した画像ファイルだけです。
なので`Folder Path`列を使ってフィルターをかけます。

####Folder Path列でフィルターをかける
`Folder Path`列にはファイルが存在するライブラリー、もしくはフォルダーのパスが格納されます。
ここを使う事でドキュメントライブラリ`Image`のデータだけに絞り込めます。

パスの命名規則は`https://xxx.sharepoint.com/sites/サイト名/ドキュメントライブラリー名`なので、`https://xxx.sharepoint.com/sites/サイト名/Image`だけを残します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/3c6488ff-51df-fd0f-813a-65d1d4534d40.png)

####絶対URLを作成する
Power BIは`https://.../Image.jpg`のような画像のURLを、レポートに画像として表示する事が出来ます。
その為には**絶対URLが必要です。**

今回の場合、`Folder Path`列と`Name`列を組み合わせることで以下のURLを作成できます。
`https://xxx.sharepoint.com/sites/サイト名/ドキュメントライブラリー名/Image.jpg`
組み合わせには列のマージを使います。

まずCtrlキーを押しながら`Folder Path`列、`Name`列の順でクリックしてください。
列のマージ機能で列を結合する際、並び順はユーザーが選択した順になります。
そして列の追加タブから列のマージを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/d25bf0db-f8a8-acee-2e46-afe9301ffe0b.png)

今回は単純にテキストを結合するだけなので区切り記号は`--なし--`、新しい列名は`URL`とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/49127f1d-fccd-58a9-21ea-095e3654179c.png)

最後にレポートに使わない列を削除して完成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/76b92ffa-c724-95b3-1985-be3ce43da05b.png)

##レポートに画像を表示する
レポートに画像を表示する手順、および画像を利用できるビジュアルについては[レポートのテーブル、マトリックス、スライサーに画像を表示する](https://docs.microsoft.com/ja-jp/power-bi/power-bi-images-tables)をご覧ください。

冒頭でも言及しましたが、**Power BI DesktopではSharePoint Onlineの画像を表示することは出来ません。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/f2e646ba-68cf-792c-1593-0783c91c6e0c.png)

なので**Power BI Serviceへレポートを発行します。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/fd30bded-19cd-0210-f5b9-76c5465dfe33.png)

Power BI Serviceへ発行されたレポートでは正しく画像が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/04b75b8b-b4f5-5599-2784-219fcf548b51.png)

Webに公開した埋め込みコードでも画像が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/d93c6a60-9b3a-572e-b161-10056e6e71fb.png)

#番外編 画像のBinaryをBase64に変換してレポートに取り込む
Power Queryで画像のBinaryをBase64に変換する事で、Power BI DesktopでもレポートにSharePoint Onlineの画像を表示する事が出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/ba2066a3-bd64-9e72-06b6-a9ea74bda42a.png)

これはPower Query上では`Content`列でBinaryが取得できるので可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/b6662228-f48b-76d7-7f0c-aa5f1cb6c101.png)

本筋から逸れるのでここでは詳しい解説はしませんが、興味のある方は[Storing Large Images In Power BI Datasets](https://blog.crossjoin.co.uk/2019/05/19/storing-large-images-in-power-bi-datasets/)を参考に試してみて下さい。

この手法のデメリットとしては以下が挙げられます。

1. 画像そのものを直接レポートに取り込むため、.pbixファイルのサイズが肥大化する。
2. この手法を利用して取り込んだ画像を利用したビジュアルの読み込みが非常に遅くなる
3. メジャーを使って画像を表示するため、スライサーには使えない

#まとめ
- **匿名でアクセスできるURL、またはアクセス権のあるSharePoint Onlineの画像はレポートに利用できる**
    - アクセス権の設定を抜かりなく。
- **Power BI DesktopでSharePoint Onlineの画像が表示されないのは正常な動作(2020年3月現在)**
    - ~~何故かは分かりません。~~ Power BI Desktoppで作成中のレポートからではAzure ADの認証が出来ないのが理由でした。
- **SharePoint Onlineの絶対URLの作り方を学ぼう**
    - 画像の表示に限らず、知っていればいろいろと便利です。

[Power BI 勉強会 @ 東京 #16](https://powerbi.connpass.com/event/165258/)のサブタイトルは**始めないといつまでたってもできるようにならない**でした。
[Microsoft Docs](https://docs.microsoft.com/ja-jp/power-bi/power-bi-creator-landing)を読みながら弄るのも良し、[Microsoft Learn](https://docs.microsoft.com/ja-jp/learn/browse/?products=power-bi&resource_type=module)で勉強するのも良し、ブログを書くのも良し。
好きなやり方でPower BIの学びと活用を深めて下さい。

No Data, No Life.