オープンソース開発者のWind氏は8月4日、スプレッドシートエンジン
Today I'm excited to ship hucre v1.
— Wind (@productdevbook) August 4, 20260.0 🎉
It started as an idea to build a modern spreadsheet engine without dependencies. Today it's a stable 1.0 release.
Thanks to everyone who tested, reported issues, and shared feedback. ❤️ pic.twitter. com/ 2urzWIiixO
ブラウザーやエッジ環境でも動作
hucreはXLSXの読み書きに対応し、セルのスタイル、結合セル、データの入力規則、画像、コメント、テーブル、条件付き書式などを扱える。大きなファイルを行単位で処理するストリーミングAPIや、スキーマによるデータ検証、HTML・
コア部分ではNode.
XLSXやCSVなどの変換、ファイル内容の確認、スキーマ検証に使えるCLIも用意されている。inspectではシート数や行数、列数、セルの型を確認でき、convertではXLSX、ODS、CSV、TSVの間でセル値とシート名を変換できる。
公式サイトのSpreadsheet Playgroundでは、XLSX、CSV、JSON、XML、ODSの処理をブラウザー上で試せる。
v1で公開APIを安定版として提供
v1では、低レベルのOOXMLパーサーをまとめたhucre/が追加された。このエントリーポイントを除く公開APIを安定版として維持する方針が示されている。正式版への移行に伴い、エラークラスの整理、headerRowオプションの意味の統一、オブジェクトを返すAPIの結果形式とストリームライターのインターフェースの統一など、破壊的変更も加えられた。既存コードへの影響は移行ガイドで確認できる。
このほか、v1.
hucreのCLIを試す
hucreをCLIとして使う場合は、グローバルインストールしておくと、どの作業フォルダーからでも呼び出せる。
# hucre CLIをグローバルにインストールする npm install -g hucre
インストール後はhucreに続けてサブコマンドを指定する。CLI全体のヘルプはhucre --help[1]、各コマンドの使い方はhucre <コマンド> --helpで確認できる。hucreをプロジェクトにインストールした場合は、コマンド先頭のhucreをnpx hucreに置き換えれば同じように実行できる。
たとえば、CSVの概要確認とXLSXへの変換は次のように実行する。
# CSVのシート数と行数、列数、セルの型を確認する hucre inspect prompt-design-summary.csv # CSVのセル値をXLSXへ変換する hucre convert prompt-design-summary.csv prompt-design-summary.xlsx
convertが引き継ぐのはセル値とシート名のみで、スタイルや数式、結合セル、グラフ、画像は引き継がれない。また、JSONへの出力や行の並べ替えはCLIのサブコマンドには含まれない。
ライブラリとしてCSVを並べ替えてJSONにも変換
ここからは、プロンプト設計のチェック項目をまとめたCSVをhucreのライブラリAPIで処理する例を紹介する。priority列を
入力に使うprompt-design-summary.は、ID、分類、ルール、確認事項、優先度の5列で構成される。以下では先頭と末尾のデータだけを示す。
id,category,rule,check_question,priority
1,対象モデル,対象が未指定ならOpenAI・Codex向けはGPT-5.6を前提にする,想定するモデルや実行環境は明確か,高
(中略)
12,評価,本番利用では基準となるプロンプトと評価例を用意する,改善を比較できるテストがあるか,中
サンプルを動かすプロジェクトにnpm install hucreでパッケージを追加し、次のコードをsort-and-convert.として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.
# 優先度順のCSVとJSONを同時に作成する node sort-and-convert.mjs
実行後は、優先度順に並んだprompt-design-summary.と、各行をオブジェクトとして格納したprompt-design-summary.が作成される。priority列が