依存パッケージなしのTypeScript製スプレッドシートエンジン「hucre」v1.0.0が公開

オープンソース開発者のWind氏は8月4日、スプレッドシートエンジン「hucre」v1.0.0を公開した。XLSX、CSV、ODS、JSON、NDJSON、XMLの読み書きに対応するTypeScript製のライブラリで、実行時の依存パッケージを必要としない。ライセンスはMIT。

ブラウザーやエッジ環境でも動作

hucreはXLSXの読み書きに対応し、セルのスタイル、結合セル、データの入力規則、画像、コメント、テーブル、条件付き書式などを扱える。大きなファイルを行単位で処理するストリーミングAPIや、スキーマによるデータ検証、HTML・Markdown・JSON・TSVへの出力機能も備える。

コア部分ではNode.js固有のAPIを使用しておらず、Node.js 18以降のほか、Deno、Bun、モダンブラウザー、Cloudflare Workers、Vercel Edge Functions、Web Workersをサポートする。機能別のサブパスから必要なモジュールだけをインポートでき、ツリーシェイキングにも対応している。

XLSXやCSVなどの変換、ファイル内容の確認、スキーマ検証に使えるCLIも用意されている。inspectではシート数や行数、列数、セルの型を確認でき、convertではXLSX、ODS、CSV、TSVの間でセル値とシート名を変換できる。

公式サイトのSpreadsheet Playgroundでは、XLSX、CSV、JSON、XML、ODSの処理をブラウザー上で試せる。

v1で公開APIを安定版として提供

v1では、低レベルのOOXMLパーサーをまとめたhucre/ooxmlが追加された。このエントリーポイントを除く公開APIを安定版として維持する方針が示されている。正式版への移行に伴い、エラークラスの整理、headerRowオプションの意味の統一、オブジェクトを返すAPIの結果形式とストリームライターのインターフェースの統一など、破壊的変更も加えられた。既存コードへの影響は移行ガイドで確認できる。

このほか、v1.0.0ではXLSXとCSVの定数メモリーストリーミング書き込みが追加された。ZIP64形式の読み込みにも対応し、書き込みは明示的に有効化できるようになった。


hucreのCLIを試す

hucreをCLIとして使う場合は、グローバルインストールしておくと、どの作業フォルダーからでも呼び出せる。

# hucre CLIをグローバルにインストールする
npm install -g hucre

インストール後はhucreに続けてサブコマンドを指定する。CLI全体のヘルプはhucre --help[1]、各コマンドの使い方はhucre <コマンド> --helpで確認できる。hucreをプロジェクトにインストールした場合は、コマンド先頭のhucrenpx hucreに置き換えれば同じように実行できる。

たとえば、CSVの概要確認とXLSXへの変換は次のように実行する。

# CSVのシート数と行数、列数、セルの型を確認する
hucre inspect prompt-design-summary.csv

# CSVのセル値をXLSXへ変換する
hucre convert prompt-design-summary.csv prompt-design-summary.xlsx
hucreのCLIでCSVを確認し、XLSXへ変換
PowerShellでhucreのヘルプ、inspect、convertを順に実行し、CSVが13行5列と表示されたあと、XLSXへの書き込みが完了している

convertが引き継ぐのはセル値とシート名のみで、スタイルや数式、結合セル、グラフ、画像は引き継がれない。また、JSONへの出力や行の並べ替えはCLIのサブコマンドには含まれない。

ライブラリとしてCSVを並べ替えてJSONにも変換

ここからは、プロンプト設計のチェック項目をまとめたCSVをhucreのライブラリAPIで処理する例を紹介する。priority列を「高」⁠中」⁠低」の順に並べ替え、結果をCSVとして保存し、同じデータをJSONにも変換する。

入力に使うprompt-design-summary.csvは、ID、分類、ルール、確認事項、優先度の5列で構成される。以下では先頭と末尾のデータだけを示す。

id,category,rule,check_question,priority
1,対象モデル,対象が未指定ならOpenAI・Codex向けはGPT-5.6を前提にする,想定するモデルや実行環境は明確か,高
(中略)
12,評価,本番利用では基準となるプロンプトと評価例を用意する,改善を比較できるテストがあるか,中

サンプルを動かすプロジェクトにnpm install hucreでパッケージを追加し、次のコードをsort-and-convert.mjsとしてCSVと同じフォルダーに保存する。

import { readFile, writeFile } from "node:fs/promises";
import { parseCsvObjects, writeCsvObjects } from "hucre/csv";
import { writeJson } from "hucre/json";

const csv = await readFile("prompt-design-summary.csv", "utf8");
const { data } = parseCsvObjects(csv, { header: true });
const priorityOrder = new Map();

// 定義にない優先度は末尾に並べる
const getPriority = (value) =>
  priorityOrder.get(String(value)) ?? priorityOrder.size;

const sorted = [...data].sort(
  (a, b) => getPriority(a.priority) - getPriority(b.priority),
);

await writeFile(
  "prompt-design-summary.sorted.csv",
  writeCsvObjects(sorted),
  "utf8",
);
await writeFile(
  "prompt-design-summary.json",
  writeJson(sorted, { pretty: true }),
  "utf8",
);

保存したスクリプトはNode.jsで実行する。

# 優先度順のCSVとJSONを同時に作成する
node sort-and-convert.mjs
スクリプトを実行し、並べ替えたCSVを確認
PowerShellで元のCSVを表示してからスクリプトを実行し、priority列が「高」「中」の順に並んだ出力CSVを表示している

実行後は、優先度順に並んだprompt-design-summary.sorted.csvと、各行をオブジェクトとして格納したprompt-design-summary.jsonが作成される。priority列が「高」⁠中」⁠低」のいずれでもない行は末尾に並ぶ。

おすすめ記事

記事・ニュース一覧