[Power BI Tips] Power BI レポートに画像を表示する方法 - 3パターン

# レポートに画像を表示したい
**BI** は基本的に**「集計値を表示して、傾向を見るモノだ」**というのはあるのですが、そうは言っても、**明細単位（行単位）**でデータを見たいという要望はあります。特定のデータに紐づく画像を表示したいというのもこの要望に含まれます。

ということで、**Power BI** で画像を表示する3つの方法を紹介します。
3つの方法といっても、実際は方法としては2つなのですが、**BI** はデータが大事ですから、データとしてどこに画像を保存するか？ということまで含めると、3パターンになるということです。
それでは行ってみましょう。

**ゴールのイメージ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/c87cbbc8-f30f-8608-094e-518d80633fc2.png)


# Power BI が画像として認識するファイル
**Power BI** は **Power BI Service** にレポートを発行して動作します。故にブラウザで画像として認識するファイルはだいたい表示できるはずです。「だいたい」と言ったのは、すべてを試しているわけではないからです。今回は **png** ファイルと **svg** ファイルを扱います。

# 紹介する3つのパターン
今回紹介するパターンは以下の3つです

1. データに画像ファイルへの**直リンク**が含まれる場合
1. **SharePoint** ドキュメントライブラリの画像データを使う場合
1. データに画像データ（今回は **base64** でエンコードされた型式) そのものが含まれる場合

## 1. データに画像ファイルへの直リンクが含まれる場合
こんな **Excel** ファイルを用意します。（**Excel**　ファイルであることに特に意味はありません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/a88a22b6-e2f0-356a-14e9-8ab9b543ba9a.png)
**URL** を見て分かる人はわかると思いますが、これらの画像ファイルは **Azure Blob Storage** に **パブリック** で保存してあります。

この **Excel** ファイルを **Power BI Desktop** で読み込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/ee1d5cfc-9dbd-4eea-29cc-a8a340184dff.png)

データを読み込んで **Power BI Desktop** に戻ったら、データペインで該当の列（今回は **[Icon]** 列）を選択して、**[データカテゴリ]** を **[画像の URL]** にしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/00afca97-6b4d-c4ad-d88f-be2844abebfe.png)

データカテゴリを **[画像のURL]** にすることで、ビジュアルでこの列の値を画像として扱ってくれます。

レポートペインに戻って、テーブルを配置して、データを表示するとこんな感じで表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/5edbf141-70d4-6efc-8584-fd017333c579.png)

ちなみにテーブル内で表示される画像の大きさですが、高さだけはテーブルの **[書式]** の **[グリッド] - [画像の高さ]** で調整可能です。
デフォルトの高さは 75 になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/90e5aeca-1a90-5b17-63b2-4e9e13eaa797.png)
↓↓↓ これを 100 にすると ↓↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/94ba239e-1250-8d8f-4a2c-571477c2bf74.png)
こんな感じで縦横比を保ったまま表示してくれるので、結果として、画像そのものが大きく表示されることになります。

ここまでは特に難しいことはないと思います。
基本を押さえれば、あとはここでわかったことを応用していくだけです。

### ✅画像を表示できるビジュアル
Power BI で画像を表示できるビジュアルは以下の通りです。

📝デフォルトのビジュアル
- テーブル
- マトリックス

📝カスタムビジュアル
- [Image Grid](https://appsource.microsoft.com/ja/product/power-bi-visuals/WA104381355?tab=Overview)
- [Simple Image](https://appsource.microsoft.com/ja/product/power-bi-visuals/WA104381835?tab=Overview)
- [Image by CloudScope](https://appsource.microsoft.com/ja/product/power-bi-visuals/WA200001985?tab=Overview)

代表的なものだけ挙げています。
カスタムビジュアルは日々増えるので、上記以外のモノを探す場合は [AppSource](https://appsource.microsoft.com/ja/marketplace/apps?product=power-platform%3Bpower-bi-visuals&page=1&search=image) で探してみてください。

## 2. **SharePoint** ドキュメントライブラリの画像データを使う場合
1の例では、**Azure Blob Storage** を任意の場所として使用し、ファイルを保存して、そのフルパスをデータが保持しているという前提でした。
**Azure Blob Storage** に限らず、**Amazon S3** や **BOX**、**Dropbox** など、パブリックにファイルを公開することができるクラウド上のストレージであれば、同じ方法で画像を表示させることができるはずです。

1の方法でどのストレージを使用しても課題になってくるのが、ファイルをパブリックに公開しなければならないいうことです。それぞれのサービスで任意の認証がかけられるかもしれませんが、Power BI レポートは URL で指定された画像ファイルを表示しているだけですから、画像をビジュアルに表示する際に、認証・認可というプロセスを通すことはできません。

ただ、組織内で使用する **Power BI** で画像をファイルをパブリックに公開するというのは、なかなかに辛い選択です。ほぼ間違いなく許可されないでしょう。

**Power BI** を使用しているということは、**Microsoft 365 (Office 365)** を使用している可能性が高いと思いますので、**SharePoint Online** のドキュメントライブラリが使える場合に、使える方法がこの2つ目の方法です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/3ecbf470-b412-7de4-b696-bc21596fdbb2.png)
こんな感じで **SharePoint Online** のドキュメントライブラリに任意のフォルダを作成して、画像ファイルを保存しておきます。
**Power BI Desktop** で **[データを取得] - [SharePoint フォルダー]** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/fd395f28-3cd1-2484-c042-43a93c8593ee.png)
**[サイトURL]** の入力を求められるので、以下の様に sites/{サイト名} までを入力してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/b4b5ebae-c99e-2d6c-8a60-2083233831f5.png)

```
https://{自身のテナントのサブドメイン}.sharepoint.com/sites/{サイト名}/
```

すると、こんな感じでそのサイトに含まれるファイルが行となり、テーブル形式でデータが取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/b4cb9261-b3b7-ba02-61db-45d5e2499a68.png)


ファイル単位のデータとなっていることがわかるかと思います。面白いのはデータ数です。4つ上 ↑ の画像で見た時、サイトには4ファイルしかありませんでした。が、ここで見ると8レコードになっています。この謎は一番右の **[Folder Path]** を見るとわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/606d5b60-4551-a938-4fa4-16c7a5865b44.png)
先ほどのサイトは、ルートフォルダに **[icon]** というフォルダを作成して、その中に4つの画像ファイルを保存してあります。ルートフォルダにも別の4つのファイルを保存してあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/6320eff2-bd13-a65e-2c67-2fbb9be5b66f.png)

つまり、**Power BI Desktop** で **SharePoint フォルダー** コネクタで接続すると、仮にフォルダーがあっても、すべてフラットにファイル単位のデータが取得されるということです。言い方を変えると、おそらく **SharePoint** のドキュメントライブラリは、ファイルをフラットに保持していて、フォルダーは論理的な扱いなのではないかと？と推測できますが、これは推測の域を出ないので、気にしないでください。

さて、今必要なのは、icon フォルダー配下の画像ファイルのみなので、ここで、**[Folder Path]** 列でフィルターをかけてしまいましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/db1e694d-b47e-e185-f9ae-ca6074866637.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/33c94371-e7fc-4e0b-acae-84dda02b9029.png)
これで必要な icon フォルダ配下のデータのみになりました。

**Excel** や **CSV** をデータソースとして使用する場合は、一番左の **[Content]** 列を使用して、バイナリを取得して、ファイルの中身を取得するのですが、ちょっと待ってください。今回は画像ファイルです。画像ファイルのバイナリを保持しても意味がありません。

**欲しいのは何だったでしょうか？**

そう、ファイルへの **直リンク(URL)** です。**1つ目の方法**を思い出してくださいね。
というわけで、ファイルへの直リンクを生成します。生成すると言ってもそんなに難しい事ではありません。**単なる文字列連結**をすればいいのです。

ここで知っておかなければならないのは **SharePoint ドキュメントライブラリ** のファイルへの直リンクはどうなっているか？です。ブラウザで該当のファイルを表示しても、残念ながら、アドレスバーにある **URL** は直リンクではありません。**SharePoint ドキュメントライブラリ** のファイルへの直リンクは、↑ の画像で言えば、**[Folder Paht] + [Name]** です。

ということで、余計な列を削除して、文字列連結をしましょう。
**[Folder Path]** ⇒ **[Name]** の順で列を選択し、リボンの **[列の削除] - [他の列の削除]** をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/d1e33381-67fe-f325-6e9f-dba776b4f7a5.png)
そうすると、**[Folder Path]** と **[Name]** のみになったはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/df386ca1-8653-eb53-0179-cdbba17d7c1f.png)
リボンの **[列の追加] - [カスタム列]** で以下の様に入力してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/d35a7466-e017-068b-7b76-800b71718745.png)

- 新しい列名：FullPath
- カスタム列の式：[Folder Path] & [Name]

カスタム列をこのように作成することで **[Folder Path] & [Name]** を文字列連結することができ、ファイルへの直リンクを作成することができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/e8a66028-d4eb-92c5-99c9-149b2926ca5d.png)
それでは閉じて適用して、ビジュアルにて確認しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/c2af8c60-2108-fc19-7236-61b4643d2a43.png)
あれ...？ **[FullPath]** 列のデータカテゴリを **[画像の URL]** にしているのに、テーブルの中に画像が表示されていません。

ご安心を。これでいいのです。**[FullPath]** 列が持っているのは、**SharePoint ドキュメントライブラリ**にある画像ファイルへの直リンクです。当然、**Azure AD** による認証認可が必要となります。つまり、**SharePoint Online** へのサインインがされていないと見えないということです。そして、**Power BI Desktop** のキャンバス上でレポートを作成している際は、**Azure AD** への認証認可が行われていません。故に、これが正常な動作なのです。試しにこの状態で **Power BI Service** にレポートを発行してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/170d4cba-d48b-b33d-0096-daeb13c80a64.png)

ね、ちゃんと表示されたでしょ？
**Power BI Service** でレポートを表示している時は、当然 **Power BI Service** へサインインをしています。そして、ご存知の通り、**Power BI Service** は **Azure AD** で管理されているユーザーで認証認可が行われます。従って、**Azure AD** のユーザーでサインインをしている状態ですので、そのユーザーが画像ファイルが保存されている **SharePoint** ドキュメントライブラリへアクセス権を持っていれば、直リンクにて、画像ファイルが取得されるというわけです。

## 3. データに画像データ（今回は **base64** でエンコードされた型式) そのものが含まれる場合
さて、それでは3つ目の方法です。
最後は画像データそのものをデータに保持している場合です。1の方法と同様に **Excelファイル** にデータを保持しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/ef97756f-05ab-ac85-5f47-68f4ee4e5e8f.png)
**[IconData]** 列を見ると、

```
data:image/png;base64,iVBORw0KG...
```

こんな感じでデータが入力されています。画像データを Base64 でエンコードした文字列です。（Web上で「画像 base64 変換」などで検索すると、ブラウザ上で変換できるページが見つかります）

-----------------------------------
📣注意：
このように画像をエンコードして、文字列として保持することで、クラウドストレージを使用しないで画像をデータに含ませることが可能です。しかし、この方法には注意があります。Power BI の仕様上、モデル内の文字列として保持できる最大長は **32766** 文字です。従って、解像度が高い画像をエンコードすると、この制限を超えてしまうことがあります。一方、DAX ではより長い文字列を扱うことが可能で、その制限は約 **210** 万文字です。DAX によって動的に文字列連結することで、対処することも可能ですが、これには十分な検討が必要です。そこまで大きな画像をデータとして保持するべきか？ということです。

参考：
String Large Images In Power BI Datasets
https://blog.crossjoin.co.uk/2019/05/19/storing-large-images-in-power-bi-datasets/

-----------------------------------

それでは **Excelファイル** を読み込みましょう。特に編集することはないので、そのまま読み込んで適用してください。エンコードされた文字列でも気にせず、データカテゴリを **[画像の URL]** にしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/3aca9cf5-ae91-5ee3-ed89-4dce69076a60.png)

そうすると、このように画像として認識され、きちんと表示してくれます。

# 3つの方法で作ったビジュアルを並べると
こんな感じになります😄
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/409706ca-7227-92c3-73ce-2acfeb8a9c6a.png)


# おわり
はい、ということで今回は以上です。
Power BI レポート画像を表示する方法をお伝えしました。お伝えした3つの方法を状況に合わせて、選択してみてください。

最後まで読んでいただきありがとうございました。また気が向いたら、Power BI Tips シリーズを書きます。
皆様からのリクエスト、お待ちしております。

何かリクエストがあれば、以下までー🤗
Twitter: https://twitter.com/yugoes1021
Facebook: https://www.facebook.com/yugoes1021
LinkedIn: https://www.linkedin.com/in/yugoes1021/