Home About Contact
UXP , InDesign , Spreadsheet , Deno

やり直し UXP InDesign, SheetJS を利用して MSエクセルデータを扱う(Deno編)

UXP InDesign, SheetJS を利用して MSエクセルデータを扱う(rollup.js編)では、rollup.js を使ってスクリプトをひとつのファイルにまとめていました(バンドル)が、Deno を使ってバンドルできることがわかりました。

もっとも、あくまでここで検証した簡単なスクリプトについてうまくバンドルできたという話です。 いろいろなケース、とかすべてのケースで、Deno によるバンドル(rollup.js によるバンドルもそうですが)がうまくいくかはわかりません。

簡単に手順を書き残します。

使用した InDesign のバージョンは 2023 (version 18.1)と UDT version 1.7.0.13 です。 環境は MacOS Ventura 13.1 です。 Deno バージョンは以下のとおり。

$ deno --version
deno 1.30.3 (release, x86_64-apple-darwin)
v8 10.9.194.5
typescript 4.9.4

Deno がインストールされていない場合は、このページにしたがってインストールしましょう。 雑にインストール方法を説明すれば (1) curlほにゃららして (2) ~/.deno/bin/ にパスを通すだけです。

UXP InDesign のコードはほぼ前回同様です。

// main.js

import * as xlsx from 'https://cdn.sheetjs.com/xlsx-0.19.2/package/xlsx.mjs';

const rows = [];
rows.push({ name: 'Pikachu', type: 'Electric' });
rows.push({ name: 'Squirtle', type: 'Water' });
rows.push({ name: 'Charmander', type: 'Fire' });

const worksheet = xlsx.utils.json_to_sheet(rows);
const workbook  = xlsx.utils.book_new();
xlsx.utils.book_append_sheet(workbook, worksheet, "pokemons");
const buffer = xlsx.write(workbook, { type: 'buffer', bookType: 'xlsx' });

const fs = require("uxp").storage.localFileSystem;
const file = await fs.getFileForSaving("pokemons.xlsx");
await file.write(buffer);

前回と異なるのは import 部分です。 前回は Node.js を使用していたので、以下のようにしていました。

import xlsx from '../node_modules/xlsx/xlsx.mjs';

Deno では、以下のように記述します。

import * as xlsx from 'https://cdn.sheetjs.com/xlsx-0.19.2/package/xlsx.mjs';

Deno から SheetJS を使う方法について詳細は SheetJS のページをご覧ください。

Node.js のように事前にプロジェクトディレクトリを用意とか npm init , npm install してなどということが一切不要です。すばらしい。

とはいえ、main.js には Deno では使わない require("uxp") 記述があり、一抹の不安はあるのですが、 ここで試した範囲では、問題にならないようです。

それでは、これを UXP InDesign として実行できるように、バンドル(bundle) します。

$ deno bundle main.js > main.idjs

deno bundle するだけです。

これを UDT で実行するか、InDesign のスクリプトフォルダに配置した上で、直接InDesign から実行してください。

以上です。