JSONから一括読み込み
fetch・JSONファイル・データベースクエリなどから取得したオブジェクト配列があるとき、グリッドを一度のパスで投入し、数式グラフの再構築も一度だけにする方法です。
完成例
import { createReogrid } from '@reogrid/lite';
const data = [
{ product: 'Widget', price: 9.99, qty: 40 },
{ product: 'Gadget', price: 24.50, qty: 12 },
{ product: 'Gizmo', price: 39.00, qty: 7 },
// ...hundreds more
];
const { worksheet } = createReogrid('#grid');
const columns: { key: keyof typeof data[0]; label: string; format?: string }[] = [
{ key: 'product', label: 'Product' },
{ key: 'price', label: 'Price', format: '$#,##0.00' },
{ key: 'qty', label: 'Quantity' },
];
// 1. Write the header
columns.forEach((col, c) => {
worksheet.cell(0, c).setValue(col.label).setStyle({ bold: true, backgroundColor: '#f1f5f9' });
});
// 2. Write all data rows — skipFormula defers formula propagation
data.forEach((row, r) => {
columns.forEach((col, c) => {
worksheet.setCellInput(r + 1, c, String(row[col.key]), { skipFormula: true });
});
});
// 3. Apply column formats once
columns.forEach((col, c) => {
if (col.format) {
worksheet.range(1, c, data.length, c).setFormat(col.format);
}
});
// 4. Rebuild the formula graph once at the end — required after skipFormula writes
worksheet.rebuildFormulas();
なぜ最後に rebuildFormulas() なのか
通常の setCellInput は、その都度すぐに依存セルを再評価します。10,000セルを読み込む場合、これは10,000回のグラフ探索になります。{ skipFormula: true } でこの処理を後回しにし、すべての書き込みが終わった後で rebuildFormulas() を一度だけ呼んで数式グラフを再構築する方が、大量一括読み込みでは桁違いに高速です(worksheet.bulkSetCells() は同じパターンを1回の呼び出しにまとめたものです)。
シートに数式がまったく無い場合は、skipFormula も手順4もまるごと省略できます。
パフォーマンスのコツ
- ホットループ内でのセル単位
setStyleを避ける。 スタイルは範囲に適用しましょう:worksheet.range('A1:C1').setStyle({ bold: true })。 - 列幅は前もって設定し、セル単位では設定しない:
worksheet.column(0).width = 200。 - 行数が分かっているなら
rows.setCount()で行数を事前確保:worksheet.rows.setCount(data.length + 1);
Lite ティアの制限
Lite は 100 行 × 26 列が上限です。この上限を超える書き込みは暗黙に無視されます。より大きなデータセットには @reogrid/pro を使ってください。