Livebook に XLSX ファイルをアップロードするとシート内のテーブルを読み込める

## はじめに

先日、 2024/06/25 に Livebook 0.13.0 がリリースされました

https://github.com/livebook-dev/livebook/releases/tag/v0.13.0

バージョン 0.13 で追加された機能として、 XLSX ファイル（Microsof Excel ファイル）アップロード時の挙動を紹介します

## XLSX ファイルの準備

Windows で Excel を使っている場合はそのまま Excel でファイルを作成しましょう

"A1" セルから始まる表を作れば OK です

macOS で Numbers を使っている場合、 XLSX 形式でファイルを出力しても "表1" などの余計なものが出力されてしまい、うまく読み込めません

Google Sheets を使いましょう

https://workspace.google.com/intl/ja_jp/products/sheets/

以下のような表を作って XLSX 形式でダウンロードしてください

複数シートにも対応しているため、今回は２つシートを作ってみました

![スクリーンショット 2024-06-29 16.50.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/0b15af37-cdde-001d-9bc3-56947a10bcfa.png)

![スクリーンショット 2024-06-29 16.50.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/6e2f5faa-c970-cb1a-a42b-30e8bc25ba92.png)

![スクリーンショット 2024-06-29 16.51.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/4daaccaa-f3e4-8a30-34f3-bfc24b007113.png)

## ファイルのアップロード

Livebook のセル前後に XLSX ファイルをドラッグ＆ドロップします

![drop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/2de9d2f5-4c25-0daf-e39c-4bbff98c1149.png)

ファイルアップロードのモーダルが開きます

そのまま Add をクリックしましょう

![スクリーンショット 2024-06-29 16.52.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/282bc4ed-0601-e9f7-7e33-e246d68fc6b2.png)

:::note warn
Name は英数字と `-` `_` `.` しか使えないので、日本語ファイル名を使う場合は Name を変更しましょう

![スクリーンショット 2024-06-29 16.51.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/3134ceee-755c-043e-1984-9846841d9ff3.png)
:::

XLSX ファイルに対して操作を提案されます

"Read sheets" をクリックしてください

![スクリーンショット 2024-06-29 16.53.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/d68481cb-1bce-64d9-5076-a2fcdd39bd7c.png)

:::note info
"Read file content" を選択した場合は単純にバイナリとして読み込むコードを生成します
:::

XLSX ファイルの読込、テーブル表示に必要なパッケージの追加について確認してきます

"+ Add and restart" をクリックしてください

![スクリーンショット 2024-06-29 16.53.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/c0d05014-4a41-65ae-f1ec-27fb5cc485b5.png)

自動的に必要なコードが追加され、ノートブックが再起動されます

![スクリーンショット 2024-06-29 17.13.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/336618e4-74a2-9d2b-1eef-aa168eb0fb56.png)

## 追加されたコードの実行

セットアップセルには以下のコードが追加れています

Kino と XlsxReader をインストールしています

```elixir
Mix.install([
  {:kino, "~> 0.13.0"},
  {:xlsx_reader, "~> 0.8.5"}
])
```

https://github.com/livebook-dev/kino

https://github.com/xavier/xlsx_reader

また、以下のコードが追加されています

```elixir
xlsx_file = Kino.FS.file_path("tables.xlsx")
{:ok, package} = XlsxReader.open(xlsx_file)

tabs =
  for sheet <- XlsxReader.sheet_names(package) do
    maps =
      case XlsxReader.sheet(package, sheet) do
        {:ok, []} ->
          []

        {:ok, [header | rows]} ->
          Enum.map(rows, fn row -> header |> Enum.zip(row) |> Map.new() end)
      end

    {sheet, Kino.DataTable.new(maps)}
  end

Kino.Layout.tabs(tabs)
```

各セルを実行してみましょう

以下のように読込結果が表示されます

![スクリーンショット 2024-06-29 17.19.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/615a2145-3636-9f75-36ff-fc0a564322cd.png)

![スクリーンショット 2024-06-29 17.19.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/c26c658d-4512-98f5-bc99-c40ef8a71bc2.png)

シート毎にタブが分かれて、各シートのテーブルが読み込まれています

読み込んだデータは Livebook 上で簡単に検索、並び替え可能です

## CSV の場合

以前の記事でも紹介していますが、 CSV の場合はデータフレームとして読み込んでくれます

https://qiita.com/RyoWakabayashi/items/0a2760c88001076c0c7b

## まとめ

Livebook で簡単に Excel ファイルを読み込めました

直観的な操作感は Livebook の特長ですね