ReoGrid ReoGrid Web

リリースノート

@reogrid/lite および @reogrid/pro の主な変更履歴。

フォーマットは Keep a Changelog に準拠し、 バージョニングは セマンティックバージョニング に従います。

v1.7.0

機能リリースです。目玉は、シートごとに 10%〜400% で拡大縮小でき、Ctrl/Cmd+ホイールでポインタの位置を中心にズームする表示倍率(変わるのは画面の見え方だけで、寸法・印刷・エクスポートは 100% のまま)と、xlsx から読み書きできクリックで開くハイパーリンク。さらに、ブック全体を 1 つの PDF にまとめられるようになり、帳票の空の罫線枠が印刷範囲に入り、エクスポートした xlsx が Excel でも画面どおりに開き、iPad / iPhone でセルへの入力とファイルのダウンロードが正しく動くようになりました。シート単位の読み込みメソッドは、何をするかが分かる名前(loadSheetFrom*)に改めました。旧名もそのまま動き警告を出すだけなので、公開 API に破壊的変更はありません。ただし、グリッド上の Ctrl/Cmd+ホイールはブラウザのページズームではなくシートの拡大縮小になり、読み込んだ xlsx の書式なしセルは Arial 10 ではなくブックの既定フォントで表示され、全角数字で入力した数値は数値として格納されます。

✨ ハイライト

  • ▸ 表示倍率(両エディション)。 worksheet.setZoom(1.5)、Ctrl/Cmd+ホイール、トラックパッドのピンチで、シートごとに 10%〜400% の範囲で表示を拡大縮小します。Excel のズームと同じく、ポインタの位置を中心に拡大縮小します。行の高さ・列幅・フォント・印刷・エクスポートは 100% のままで、グリッド線は 1px の太さを保ち、リサイズ・ドラッグ移動・画像グリップのつかみ幅も画面上で同じ大きさのままです。xlsx の zoomScale を往復するので、85% で保存したブックは 85% で開きます。
  • ▸ ハイパーリンク(両エディション。リンクの作成は Pro)。 xlsx ファイル内のリンクがクリックで新しいタブに開くようになりました(長押しするとセルを選択するだけで開きません)。ホバーで宛先が表示され、保存しても残ります。=HYPERLINK() にも対応しました(Pro)。開くのは http / https / mailto / tel の宛先だけです。
  • ▸ **シート単位の読み込みメソッドを loadSheet* に改名(両エディション)。** grid.worksheet.loadFromFile(file) は「このファイルを開く」と読めるのに、実際は先頭のシートだけを読み込んでいたため、先頭が表紙のブックは真っ白に見えていました。シート単位のメソッドは名前でそれが分かるようにし(loadSheetFromFile / loadSheetFromUrl / loadSheetFromBuffer)、ブック全体を開くのはインスタンスの grid.loadFromFile() です。旧名は非推奨の別名として 2.0 まで動きます。
  • ▸ ブック全体を 1 つの PDF に(Pro)。 grid.saveAsPdf({ sheets: 'all' }) で、表示中のすべてのシートを 1 つの PDF にまとめます(Excel の「ブック全体を印刷」)。各シートは自分の用紙サイズとページ設定で出力され、ページ番号はシートをまたいで通し番号になります。
  • ▸ 帳票がまるごと印刷されるように(Pro)。 空の罫線枠、塗りつぶしの帯、結合した備考欄、押印欄の画像が印刷範囲に入るようになりました。「1 ページに収める」が、たまたま値の入っているセルだけに合わせて帳票を縮小し、残りを切り落とすことはもうありません。
  • ▸ エクスポートした xlsx が Excel でも同じ見た目に(Pro)。 行の高さ・表示形式・数値・改行・書式だけの空セルを Excel が期待する形で書き出すようになり、保存した帳票を Excel で開くと行が高くなる、金額に書式が付かない、ラベルが切れる、といったことがなくなりました。

+ 追加

  • ▸ 表示倍率。 worksheet.setZoom(zoom, anchor?) / getZoom() で、Excel のズームと同じくシートごとに 10%〜400% の範囲で表示を拡大縮小します。Ctrl/Cmd+ホイール(またはトラックパッドのピンチ)はポインタの位置を中心にズームします。変わるのは画面の見え方だけで、行の高さ・列幅・フォント・印刷・エクスポートは 100% のまま、グリッド線は 1px の太さを保ち、リサイズ・ドラッグ移動・画像グリップのつかみ幅も画面上で同じ大きさのままです。xlsx の sheetView@zoomScale を読み書きするようになり、85% で保存したブックは 85% で開きます。変更は instance.onZoomChange(listener) で受け取れます。両エディションで利用できます。
  • ▸ ハイパーリンク。 xlsx ファイル内のリンク(<hyperlinks>)を読み書きするようになり、リンクのあるセルをクリックすると新しいタブで開きます。Excel と同じく、長押しするとセルを選択するだけで開きません。ホバーするとカーソルが指の形になり、リンクの宛先が表示されます。=HYPERLINK(address, [label]) はラベルを表示し、クリックで宛先を開きます(組み込み関数はすべて Pro)。リンクは行・列の挿入と削除、並べ替え、ドラッグ移動に追従し、JSON(sheet.hyperlinks)を往復します。開くのは http / https / mailto / tel の宛先だけで、noopener,noreferrer を付けて開きます。それ以外(javascript:、file: のパス、相対パス)は開かず、セルに短いメッセージを出します。先に instance.onHyperlinkClick が発火するので、event.cancel = true で宛先を自前でルーティングしたり確認を挟んだりできます。リンクの作成は worksheet.setHyperlink(row, col, url, { tooltip }) / cell.setHyperlink(Pro)、読み込み・表示・クリックで開くのは両エディションで動きます。ブック内の場所へのリンクは保持しますが、まだ移動はしません。sandbox 付きの iframe にグリッドを埋め込む場合、リンクを開くには sandbox に allow-popups allow-popups-to-escape-sandbox が必要です。
  • ▸ 複数のシートを 1 つの PDF に(Pro)。 grid.exportPdf() / grid.saveAsPdf() が sheets を受け取ります。'active'(既定。従来どおり)、表示中のすべてのシートをタブ順に並べる 'all'、またはシートの番号・名前の配列です。各シートは自分の設定でページ分割されるので(usePageBreaks なら、そのシート自身の用紙サイズ・向き・余白・N ページに収める・改ページ)、A4 縦と A3 横のページが 1 つの文書に混在できます。ヘッダー/フッターの &P は文書の先頭ページから数え、&N は文書全体のページ数です(Excel でブック全体を印刷したときと同じ番号の振り方)。&A は各ページのシート名のままです。印刷するものが無いシートは飛ばします。ヘッドレス版は exportWorksheetsPdf(worksheets, options) です。

~ 変更

  • ▸ グリッド上の Ctrl/Cmd+マウスホイールがシートの拡大縮小になりました。 これまではブラウザのページズームにそのまま渡っていました。従来の動作にするには createReogrid({ wheelZoom: false }) を指定してください。getCellRect() / getRangeRect() / getImageRect() を使って独自の要素を重ねている場合、これらは 100% のシート座標(px)のままなので、worksheet.getZoom() を掛けてください。
  • ▸ worksheet.loadXlsx / loadFromBuffer / loadFromFile / loadFromUrl を loadSheetFromBuffer / loadSheetFromFile / loadSheetFromUrl に改名し、旧名を非推奨にしました。 これらはシートを 1 枚だけ取り込むメソッドなのに、インスタンスのブック単位のメソッドとまったく同じ名前でした。そのため grid.worksheet.loadFromFile(file) は「このファイルを開く」と読めるのに、実際には先頭のシートだけを黙って読み込み、シートタブも出ず、他のシートを開く手段もありませんでした。ブック全体を開くには grid.loadFromFile() / loadFromUrl() / loadXlsx() を使い、意図して 1 シートだけ取り込みたいときだけ worksheet.loadSheet* を使ってください(options.sheetName でどのシートかを指定)。旧名は従来どおりそのまま動きますが、@deprecated が付き、初回の呼び出しで両方の移行先を示す警告をコンソールに出します。2.0 で削除します。

🐛 修正

  • ▸ 空の罫線枠・塗りつぶし・結合セル・画像が印刷範囲に入るようになりました(Pro)。 印刷範囲を設定していないとき、印刷される範囲は A1 から値の入っている最後のセルまででした。よくある帳票 —— 行がまだ空の罫線付きの表、先頭セルにだけ文字がある結合した備考欄、押印欄、ロゴ —— はそれよりずっと先まで広がっているため、改ページプレビュー・PDF エクスポート・ブラウザ印刷のどれもが帳票を最後の値のところで切り、「N ページに収める」もその部分だけに合わせてシートを縮小していました。印刷範囲は、紙に何かが出るセルすべて —— 値・罫線・塗りつぶし(白以外)・結合セルの全体・画像 —— まで広がるようになりました(worksheet.getPrintContentExtent() で取得できます)。フォント・表示形式・白の塗りつぶしのように紙に何も出ない書式は範囲を広げないので、白紙のページが増えることはありません。
  • ▸ xlsx エクスポート: Excel で開いた見た目がグリッドと一致するようになりました(Pro)。 行の高さを、ファイル形式が求めるポイントではなくピクセルで書き出していたため、Excel ではどの行も 1/3 ずつ高くなり、読み込み直すたびにさらに 1/3 高くなっていました。正しく換算するようになり、往復しても同じ高さに戻ります。表示形式(#,##0、[$¥]#,##0、日付、パーセントなど)はまったく書き出されていませんでしたが、書式だけを持つ空の入力セルも含めて書き出すようになりました。セルに入力した数値(「135000」)は文字列として書き出されていたため、Excel では計算にも表示形式にも使われませんでした。素直な数値は数値として書き出し、JavaScript にとってだけ数値に見える文字列(「007」「1e3」)は文字列のままにします。改行を含む値には「折り返して全体を表示」を付けます(Excel はこれが無いと改行を表示しません)。書式だけの空セルは値なしで書き出すので、右揃えのラベルがそこへはみ出して表示され、Excel で切れることがなくなりました。
  • ▸ xlsx インポート: 書式なしのセルがブックの既定フォントで表示されるようになりました。 Excel が書式なしで書いたセルはブックの「標準」スタイルに従いますが、インポーターは ReoGrid 独自の Arial 10 のままにしていました。そのため「標準」のフォントが Candara 12 のブックでは、表の中で書式を触っていないセルだけフォントと大きさが周りと違って見えていました。一般的な Excel ファイルでは、書式なしのセルが Arial 10 ではなく Calibri 11 / 游ゴシック 11 / MS Pゴシック 11 で表示されるようになります。ファイルにまったく存在しない空セルに新しく入力した場合は、これまでどおり ReoGrid の既定フォントになります。
  • ▸ xlsx インポート: Excel で「スタイルなし」にしたテーブルが素の表で表示されるようになりました。 Excel でスタイルを「なし」にしたテーブルが、既定の青い見出し・白い太字・縞模様で描かれていました。何も塗らずに表示し、書き出すときもスタイルなしのまま書き戻します。addTable(range, { style: '' }) で同じテーブルを作れます。
  • ▸ xlsx インポート: ReoGrid が読めない数式は、数式の文字列ではなく Excel の計算結果を表示するようになりました。 他のブックを参照する数式(=[1]Sheet1!A1*2)、テーブルの構造化参照(=SUM(Table1[Qty]))など、エンジンが解析できない数式はセルに数式の文字列がそのまま出ていました。ファイルに保存されている Excel の計算結果を表示し、他の数式からも参照でき、挿入・削除・並べ替え・移動でセルと一緒に動きます。数式そのものは保持され、エクスポートで書き戻されます。再計算はされず、セルを編集すると数式は失われます。また、引用符で囲んだ他のブックへの参照(='[1]My Sheet'!A1)が、存在しないシートへの参照(#REF!)と誤認されなくなりました。
  • ▸ 数式を値で上書きしたとき、その数式を参照している数式が再計算されるようになりました。 数式のセルに値を入力しても、そのセルを参照している数式は次に全体を再計算するまで古い結果のままでした。
  • ▸ 全角数字で入力した数値が数値として格納されるようになりました。 日本語 IME をオンにしたまま「120」と入力すると文字列として入り、掛け算の数式は空欄になり、小数の入力規則には弾かれていました。Excel と同じく、全角の数字(と + - .)を半角にすると数値になる入力は、半角(「120」)で格納します。「3階」のように数字を含むだけの文字列は入力どおりに残します。
  • ▸ フォームの移動: IME をオンのまま入力した数値は Enter 1 回で次の欄へ進むようになりました。 IME の変換を確定する Enter は IME のものなので、フォームの数量や単価の欄では Enter を 2 回 —— 「120」の確定に 1 回、次へ進むのに 1 回 —— 押す必要がありました。formNavigation がオンのとき、確定の Enter のあとエディタに数値だけが残っていれば、そのまま確定して次の欄へ進みます。文字列(「3階」)は確定するだけなので、確定してから続けて入力できます。
  • ▸ セルの ▼ リストからの選択が元に戻せるようになり、フォームでは次の欄へ進むようになりました。 ドロップダウンのボタンをクリック・タップして選ぶと、セルに直接書き込んでいたため、キーボードで同じ選択をした場合と違って Ctrl/Cmd+Z で戻せませんでした。マウス・タッチでの選択も undo スタックに載るようになり、formNavigation がオンのときは、選択肢を入力して Enter を押したときと同じく次の欄へ進みます。フォーム以外では Excel と同じく選択はそのセルにとどまります。
  • ▸ ドロップダウンの後に描かれるセルのフォントと色が崩れなくなりました。 値の入ったリスト入力規則(または dropdown セルタイプ)のセルが、canvas のフォントと塗りの色を設定したまま戻していなかったため、後に描かれるセルが太字を失ったり(フォントが変わるまで、同じスタイルの後続のセルすべて)、プレースホルダーの淡い色が失われたりしていました。ドロップダウンは変更したものを元に戻すようになり、セルタイプのハンドラー呼び出しはすべて囲い込まれるので、registerCellTypeHandler で登録したハンドラーが後始末を忘れても、シートの他の部分に影響しません。
  • ▸ hyperlink セルタイプ: スクリプトの宛先を開かなくなりました。 このセルタイプは宛先(既定ではセルの文字列)をそのまま window.open で開き、HTML エクスポートでは <a href> にそのまま書き出していたため、javascript: の宛先がページ内で実行されてしまいました。http / https / mailto / tel の宛先だけを開くようにし(相対パスはこれまでどおりページの URL を基準に動きます)、それ以外はただの文字列として書き出します。
  • ▸ iPad: セルへの入力が自動で大文字化・自動修正されなくなりました。 ハードウェアキーボードを使うと、iPadOS が文頭の大文字化と自動修正をセルエディタに適用し、m2 が M2 として格納されていました。エディタはこれらを無効にするようになりました。また、セルを続けて素早くタップしてもブラウザのダブルタップズームが起きなくなり、タップしたときの灰色のハイライトも出なくなりました。
  • ▸ iPad / iPhone の Safari でダウンロードできるようになりました(Pro)。 saveAsPdf と saveAsXlsx は、ダウンロードを始めた直後にファイルを解放していました。Safari はまず「表示するかダウンロードするか」を尋ね、そのあとでファイルを読みにいくため、何も保存されていませんでした。ファイルを十分な時間保持するようにしました。
  • ▸ iPad で印刷するページが消えなくなりました(Pro)。 printWorksheet は print() を呼んだ 1 秒後に、印刷用の非表示フレームを削除していました。iPadOS は print() からすぐに戻り、印刷シートを開いている間にページをレイアウトするため、印刷される前にフレームが消えることがありました。フレームは次の印刷で置き換えられるまで残るようになりました。
  • ▸ Lite: 「Pro の機能です」というコンソール警告のリンク先が存在するページになりました。 @reogrid/lite で Pro 専用のメソッドを呼ぶと出る案内リンクが 404 になっていました。料金ページを指すように直しました。
  • ▸ npm のパッケージページ。 @reogrid/pro に、仮の短い説明ではなく本来の README(機能、ライセンスキー、xlsx / PDF / 印刷、Lite からの移行)を同梱しました。@reogrid/lite の README も、フレームワークに依存しない createReogrid() の API を中心に、React と Vue は同梱のコンポーネントとして書き直しました。両パッケージのホームページはこのサイトになり、license フィールドは README のライセンス節を指します(Lite: 無料ライセンスで商用利用可、Pro: 有償ライセンス)。

v1.6.0

機能リリースです。目玉は、挿入・ドラッグ・リサイズができて保存しても消えないフローティング画像、Ctrl/Cmd+クリックによる複数範囲の選択、画面・xlsx・ブラウザ印刷・PDF のすべてで同じ配置になる縦書き・文字回転、そして保護シートをキーボードだけで埋められるフォームモード。印刷は Excel の「N ページに収める」に対応し、印刷範囲とセルコメントが保存時に黙って捨てられず xlsx に書き出されるようになり、ブラウザ印刷が画面の描画と一致し、PDF 出力が極細になる問題も解消しました。公開 API に破壊的変更はありません。

✨ ハイライト

  • ▸ 画像の挿入・移動・リサイズ(Pro)。 これまで画像は読み取り専用で、xlsx から読み込んだ画像は表示はされるものの、保存すると黙って捨てられていました。worksheet.addImage(bytes, { row, column, width, height }) で配置でき、マウスで編集できます — クリックで選択、ドラッグで移動、8 つのグリップのドラッグでリサイズ(Shift で縦横比を維持)、Delete で削除。ドラッグ 1 回につき Ctrl+Z 1 回です。Excel と同じ 3 種類のセルアンカーに対応し、xl/media + xl/drawings の実体を伴って往復します。
  • ▸ 複数範囲の選択(両エディション)。 Ctrl(macOS は Cmd)を押しながらクリック・ドラッグすると、選択を置き換えずに範囲を追加します。セルでも行・列ヘッダーでも同じです。Delete はすべての範囲を 1 手の undo でまとめて消し、書式はすべての範囲に適用され、自動調整は Ctrl+クリックした列をそれぞれ調整します。コピーは「範囲が整列していれば 1 ブロックとして運ぶ」という Excel の規則に従います。ws.selection.ranges / count / add() が同じことを API から行います。
  • ▸ 縦書き・文字回転(両エディション)。 setTextRotation(-90〜90) で、狭い数値列を読みやすくする斜めのヘッダーが作れます。setVerticalText() は日本語の縦書き — 1 文字ずつ縦に積み、段は右から左へ流れます。幅・高さの自動調整は回転後の外形を測るので、90 度倒したラベルには行の高さぶんだけ狭い列が割り当たります。画面・xlsx・ブラウザ印刷・PDF のすべてが同じ配置になります。
  • ▸ フォームモード(両エディション)。 4 つのスイッチで、保護シートが入力フォームになります。layoutLocked は行高・列幅の変更を止め、clickToEdit は 1 回のクリックで編集を開始し、setCellPlaceholder() は空セルにヒント文字を描き、formNavigation は Enter / Tab を読み順で次の入力欄へ進めます。入力規則のリストもキーボードで選べるようになり(編集中の ↓、選択中の Alt+↓)、フォームがマウスなしで最後まで埋まります。
  • ▸ N ページに収める(Pro)。 setPrintSettings({ fitToPages: { width: 1 } }) は Excel の「N ページに収める」です。縮小率を手で決める代わりに、横(および縦)を何ページに収めるかを指定すれば倍率が自動で求まります。Excel と同じく縮小のみで、改ページプレビュー・PDF エクスポート・ブラウザ印刷のすべてが同じ結果になります。
  • ▸ PDF 出力が極細にならなくなりました(Pro)。 組み込みのフォントタグが Google の可変フォントを直接指しており、その既定座標は wght=100 — つまり Thin でした。そのため出力全体が極細になり、太字も土台が Thin では効きませんでした。タグはウェイトごとに実体の face を持つ形になり、preloadPdfFont() は既定で normal と bold を取得します。日本語のペイロードは可変フォント 1 本 9.15MB から 2.5MB/face になりました。

+ 追加

  • ▸ フォームモード。 ws.layoutLocked(ヘッダーのドラッグによる列幅・行高の変更、ダブルクリックの自動調整、行・列まるごとの並べ替えを止めます。API からのサイズ変更は従来どおり有効)、ws.clickToEdit(1 回のクリックでキャレットを末尾に置いて編集に入り、編集可能セルの上ではカーソルが I ビームになります)、ws.setCellPlaceholder(row, column, text) と getCellPlaceholder / clearCellPlaceholders / getCellPlaceholderEntries(画面にだけ描かれるヒント文字。セルの値・PDF・印刷・xlsx・JSON には出ません)、そして ws.formNavigation と ws.setFormNavigator(fn) / ws.nextInputCell(row, column, direction)。既定の順序は、保護セル・非表示の行と列・結合セルの内側を飛ばし、行の末尾で次の行の先頭へ折り返す読み順スキャンです。いずれも保存されないため、loadJson / reset のあとに付け直してください。両エディションで利用できます。
  • ▸ 入力規則のリストをキーボードで選択。 編集中の ↓、または選択中の Alt+↓ で、マウスで開くのと同じドロップダウンが開きます。↑↓ で候補を移動、Enter で確定、Escape で閉じます。リストは現在値(無ければ先頭)の位置で開くので ↓ → Enter の 2 打で選べ、選択はエディタを経由して確定されるため入力規則の検証もフォーム移動もそのまま効きます。
  • ▸ ヘッダーフォント。 ブック全体は createReogrid({ headerFont: { fontFamily: 'Meiryo', fontSize: 14 } })、実行時(あとで追加したシートにも引き継がれます)は instance.setHeaderFont(...)、シート単位は ws.setHeaderFont(...)。getHeaderFont() / getHeaderFontCss() で読み出せます。指定は部分でよく、{ fontSize: 14 } はファミリーを保ったままサイズだけ変え、null で既定に戻ります。ヘッダー帯はフォントに合わせて広がるので、大きくしても番号が欠けません。セルの書式(CellStyle)とは独立した画面の設定で、xlsx/JSON には保存されません。
  • ▸ 文字回転・縦書き。 ws.range(...).setTextRotation(degrees) は Excel と同じ -90〜90 度(正が反時計回り、範囲外はクランプ)。setVerticalText(value?) は日本語の縦書きで、長音記号や括弧は縦組みの向きに回り、、。 は文字枠の右上に寄ります。Excel と同じく 2 つは 1 つのコントロールで、角度を設定すると縦書きが解除され、その逆も同様です。折り返しは文字が実際に走る向きに効き、Excel の <alignment textRotation>(縦書きは 255)としてそのまま往復します。両エディションで利用できます。
  • ▸ 画像(Pro)。 worksheet.addImage(source, anchor, options?) は Uint8Array・ArrayBuffer・data: URL を受け取ります。addImageFromFile(file, anchor, options?) は File/Blob を取り、既定で画像本来のサイズを使います。編集は moveImage / resizeImage / setImageAnchor / removeImage、読み出しは getImage / getImages / getImageRect。OOXML の 3 種類のアンカーすべてに対応し(oneCell はセルと一緒に動きサイズは固定、twoCell はセルと一緒に動きサイズも変わり、absolute はシートに固定)、行・列の挿入と削除に追従するため、ロゴの下の行を削除してもロゴは消えません。xlsx(同一画像は 1 つにまとめて格納)、JSON(sheet.images。toJson({ includeImages: false }) でバイト列を省略)、PDF エクスポートを往復します。setImageEditEnabled(false) とシート保護は、画像を表示したまま操作だけを止めます。setImagesEnabled(false) はモデルに触れずに機能ごと無効化するので、画像は xlsx/JSON を往復し続けます。
  • ▸ 複数範囲の選択。 ws.selection.ranges(それぞれ RangeHandle、最後がアクティブ)、ws.selection.count、そして Ctrl+クリックの API 版である ws.selection.add('D4:E6')。bounds / range / activeCell / moveTo は従来どおり単一範囲(アクティブな範囲)を指し、onSelectionChange にすべての範囲を列挙する第 2 引数が増えたため、既存のリスナーは影響を受けません。通常のクリックや矢印キーで単一範囲に戻り、Shift+クリック・Shift+矢印は最新の範囲を広げつつ他を保ちます。複数範囲の選択中はフィルハンドルとドラッグ移動が無効になります。
  • ▸ N ページに収める(Pro)。 setPrintSettings({ fitToPages: { width, height } })。軸を省略(または 0 を指定)すると、その方向は制限しません。フィットが有効な間 scale は無視されますが保持され、解除すると戻ります。求まった倍率は worksheet.getEffectivePrintScale() で読めます。xlsx(<pageSetUpPr fitToPage> + <pageSetup fitToWidth/fitToHeight>)と JSON を往復します。
  • ▸ 印刷範囲が xlsx に書き出されます(Pro)。 setPrintableRange(...) は ReoGrid JSON でしか往復しなかったため、xlsx に保存すると次に開いたときシート全体が印刷対象に戻っていました。Excel と同じ _xlnm.Print_Area として書き出し、同じ形で読み戻すようになりました。
  • ▸ セルコメントが保存後も残ります。 コメント(メモ)は xlsx から読めるものの書き戻せなかったため、コメント付きのブックを保存するとすべてのメモが黙って消えていました。エクスポートがコメントパートと、Excel が併せて要求する従来形式の VML ボックスを書き出すようになり、本文・作成者・常時表示かどうかを保ったまま Excel を往復します。呼ぶものはなく、saveAsXlsx で自動的に行われます。
  • ▸ 改ページ・印刷範囲のドラッグが undo できます(Pro)。 改ページプレビューで改ページ線や印刷範囲の端をドラッグする操作が、他のポインタ編集と同じく undo スタックに載るようになりました — ドラッグ 1 回につき Ctrl+Z 1 回です。改ページ移動の undo は、そのドラッグが下げた印刷倍率と、巻き込んだ手動改ページも元に戻します。元の位置にそのまま落とし直した場合は undo ステップを消費しませんが、自動の線をその場に落とした場合は手動として固定されるため 1 ステップになります。
  • ▸ 和暦の元年表記。 [$-ja-JP-x-gannen] ロケールタグが、元号の最初の年を 1 ではなく 元 と表示します。[$-ja-JP-x-gannen]ggge"年"m"月"d"日" は 令和元年7月1日 になり、官公庁・金融の帳票で必要になるものです。それ以外の年は影響を受けず、色や条件のブラケットがロケールタグと誤認されることもありません。
  • ▸ ヘッドレスの xlsx 取り込み。 XlsxImporter と convertImageInfo を公開エントリからエクスポートしました。CanvasWorksheet.loadXlsx は DOM を必要とするブラウザ用なので、顧客の .xlsx をブラウザ外でテンプレートに変換するビルドツール向けのものです。画像は結果の images に返るので、worksheet.loadImageFromImport(convertImageInfo(image)) に渡してください。

🐛 修正

  • ▸ PDF 出力が極細(Thin)になる問題を修正(Pro)。 組み込みのフォントタグ({ locale: 'ja' } ほか)が Google の可変フォントを直接指していました。可変フォントは既定座標の字形を glyf に、そこからの差分を gvar に持ちますが、PDF 書き出しは glyf の輪郭を埋め込むだけで gvar を適用しません。そのため出力は fvar の既定 wght=100 —— つまり Thin —— で焼き付き、紙面がまるごと極細になっていました(/BaseFont /…+NotoSansJP-Thin)。太字は輪郭を 4% ストロークする擬似ボールドなので、土台が Thin では効きません。PDF はグリフの輪郭を埋め込む以上「ウェイト=別のフォントファイル」なので、タグがウェイトごとに face を持つ形にしました。組み込みの URL は @reogrid/font-{jp,sc,tc,kr} の静的な face を指します(JP は可変フォント 1 本 9.15MB → 2.5MB/face)。preloadPdfFont(tag) は既定で normal と bold を取得し、thin は省きます。返り値は従来どおり normal のバイト列なので、既存の呼び出しはそのままで構いません。registerPdfFont(tag, source) も従来どおり 1 本を normal として受け付け、加えて { normal, bold, thin } の形(@reogrid/font-* の export 形)も取ります。擬似ボールドは bold face が無いときだけ働く代替に降格し、自前で読み込んだフォントには options.fonts で他のウェイトを足せます。
  • ▸ PDF 出力で表示形式のブラケット色([赤] / [Red])が無視される問題を修正。 画面では書式の色がセルスタイルの文字色より優先されますが、PDF 出力はセルスタイルの色しか見ていなかったため、#,##0;[赤]"▲"#,##0 を当てた負数が画面では赤、PDF では黒で出ていました。会計帳票をそのまま紙に出すと赤字が消えるということで、画面と同じ優先順位(書式色 → セルスタイル色 → 既定色)に揃えました。リッチテキストのセルは実行ごとに色を持ち、かつ文字列セルなので表示形式の色は付きません(画面の分岐と同じ)。ブラウザ印刷(HTML 経由)は対象外で、引き続きセルスタイルの色を使います。
  • ▸ ブラウザ印刷で文字が「発…」のように欠ける問題を修正。 印刷(HTML → ブラウザの「PDF として保存」)で、画面には出ている文字が紙では失われていました。canvas と HTML で文字の扱いが 3 点ずれていたためです。(1) 隣の空セルへのはみ出しが無かった — canvas は Excel と同じく、列幅より広い文字を空の隣接セルへこぼしますが、<td> は必ずクリップするので、画面では「有効期限」なのに紙では「有…」になっていました。画面と同じ純粋関数で溢れ幅を求め、その分だけ外へ描ける箱で包みます(隣が埋まっていれば従来どおり箱の中で止まります)。(2) 省略記号を付けていた — 2px はみ出しただけで最後の 1 文字が「…」に化けていました。canvas も Excel も紙には省略記号を出さずクリップするだけなので、text-overflow: ellipsis を外しました。(3) 行が指定より高くなっていた — <tr height> は HTML では最小値なので、折り返しのある明細行が伸びて後続の行がずれ、ページ下端の行(振込先・備考)が紙から落ちていました。折り返しうるセルを行高ちょうどの箱に固定してクリップし、line-height も canvas と揃えました。変わるのは印刷の見た目だけで、クリップボードへのコピーは据え置きです。
  • ▸ 行より高い内容が上下の行にはみ出して描かれる問題を修正。 折り返しで行の高さを超えた内容が、中央揃えなら上下へ、下揃えなら上へこぼれ、隣の行の文字と重なって見えていました(2 行分の高さの行に 3 行入れた場合など)。Excel と同じく行でクリップします。
  • ▸ ブラウザ印刷でセルにアンカーした画像が出ない問題を修正。 ロゴや印影が画面・PDF・xlsx には出るのに、printWorksheet() / toPagedHtmlDocument() の印刷だけ抜け落ちていました(このリリースで画像を挿入できるようにしたとき、印刷の HTML 経路だけ対応が漏れていたものです)。各印刷ページの帯を原点として絶対配置し、帯と一緒に transform: scale() されるので、縮小率・改ページ・印刷範囲は PDF と同じ結果になります。toPagedHtmlDocument に showImages を追加しました(既定はシートの設定に従います)。
  • ▸ 列幅・行高を 1 本ずつ変えても改ページが追随しない問題を修正。 worksheet.column(c).width = w / row(r).height = h が境界(プレフィックス和)を作り直しておらず、getPrintPageRanges() が変更前のサイズで計算した改ページを返していました。ブラウザでは次の描画が境界を作り直すため多くの場合は隠れますが、描画より先に読むと古い結果が返り(reset() の直後に列幅を設定するテンプレートが、ときどき「2 ページ幅」と報告される)、ヘッドレスでは描画が無いので常に誤ります。まとめて設定する API(applyColumnWidths など)は以前から作り直していたので、1 本ずつの経路だけが漏れていました。
  • ▸ Enter で確定したあと同じセルに前の値が二重に入る問題を修正。 セルエディタの Enter は確定するだけで移動せず、同じ keydown がそのまま KeyboardController まで上がって —— そのときには編集が終わっているので —— Enter の分岐が同じセルのエディタを確定済みの文字ごと開き直していました。「120」⏎「180」⏎ と打つと 120180 になる、というものです。Tab はブラウザ既定の動作に落ちて、フォーカスが grid の外へ出ていました。仕様どおり Enter=確定して下、Shift+Enter=上、Tab=右、Shift+Tab=左へ移動し(stop の入力規則で弾かれた確定は、編集を続けて移動しません)、イベントはそこで止めます。あわせて編集の終了時に IME 用のプロキシ textarea を空にするようにしました —— 次の打鍵が古い文字に足されるのを防ぎます。
  • ▸ 小数を含む書式コードで千単位スケーリング(末尾カンマ)が効かない問題を修正。 #,##0, や #,##0,,.00 のように整数部の末尾にカンマを置く形は動いていましたが、0.0, や #,##0.0,, のように小数部の後ろにカンマを置く形 —— Excel が標準的に書き出すほうの並び —— はスケーリングされませんでした。それだけでなく、カンマが書式から取り除かれないため数値パターンの解析ごと失敗し、0.0,,"M" は 2,400,000 を 2.4M ではなく 2400000.0,,M と表示していました。末尾カンマの検出が整数部(小数点より前)しか見ていなかったのが原因です。カンマの並びを整数部の末尾と書式全体の末尾の両方で探すようにし、桁区切りのカンマ(#,##0)はこれまでどおり対象外です。集計列でよく使う [>=1000000]#,##0.0,,"百万円";[>=1000]#,##0.0,"千円";0"円" が Excel と同じ結果を返すようになりました。
  • ▸ autoFitMaxScanRows を createReogrid() から設定できるようにしました。 v1.5.0 で追加した列幅自動調整のスキャン上限(既定 1000 行)は WorksheetOptions にしか無く、公開エントリポイントの ReogridOptions に宣言も転送も無かったため、パッケージ利用者からは到達できませんでした。createReogrid({ autoFitMaxScanRows: 5000 }) で設定できるようになり、値はブック内のすべてのシート(初期・実行時追加・インポート)に引き継がれます。あわせて実行時に変更するための worksheet.setAutoFitMaxScanRows(n) / getAutoFitMaxScanRows() を追加しました(1 未満は 1 に丸め、非有限値は既定に戻ります)。
  • ▸ 非表示列の文字が隣の列に重なって描画される問題を修正。 非表示にした列に値が入っていると、その文字が右隣の表示列の上に描かれ、隣の列の値が二重に見えていました(Excel から読み込んだ帳票テンプレートで、作業用の列を隠して使っているものが該当します)。行では既に除外されていた非表示行の扱いに、列を合わせました。
  • ▸ 並べ替えでコメント・セル型・ロック状態が元の行に取り残される問題を修正。 sortRows(内部の Worksheet.permuteRows)は値・スタイル・罫線は並べ替えていましたが、セルコメント(メモ)、セル型の設定(チェックボックスなど)、明示的なロック状態は元の行に残っていたため、並べ替えたあとコメントが別の行の内容に付いているように見えていました。コメントは id を保ったまま移動し、並べ替え対象の列範囲の外にあるものや、非表示(並べ替えに参加しない)行のものはその場に留まります。行・列の移動は CellPayload 経由で以前から対応済みで、抜けていたのは並べ替え(とその undo)だけでした。

v1.5.0

機能リリースです。目玉は Excel スタイルの検索と置換(Ctrl+F / Ctrl+H)、選択範囲・行・列のドラッグ移動、Excel 書式コードに対応したページヘッダー/フッター。さらに PDF エクスポートがロケール指定に対応し、CJK フォントを自動で埋め込みます。公開 API に破壊的変更はありません。

✨ ハイライト

  • ▸ 検索と置換(両エディション)。 Ctrl/Cmd+F・Ctrl/Cmd+H で開く組み込みバーが、シート・選択範囲・ブック全体(一致したシートを自動でアクティブ化)を検索します。大文字小文字の区別、セル内容の完全一致、正規表現に対応。一致はすべてキャンバス上でハイライトされ、Enter で順に移動、全置換は 1 手で元に戻せます。createReogrid({ showFindBar: false }) と grid.find / replaceAll などで独自 UI も構築できます。
  • ▸ 範囲・行・列の移動。 選択範囲の枠をドラッグしてブロックを移動(Excel と同じく移動先を上書き)、選択済みの行・列ヘッダーをドラッグすると切り取り+挿入で並べ替えます。値・数式・スタイル・数値書式・セルタイプ・罫線・コメント・ロック状態が一緒に移動します。onBeforeRangeMove はキャンセル可能で、結合セルが分断されることはなく、移動は 1 件の undo エントリになります。
  • ▸ ページヘッダー・フッター(Pro)。 PrintSettings.headerFooter で、Excel と同じ書式コード(&P / &N / &D)を使い用紙の余白にページ番号・日付・シート名・ファイル名を印刷できます。奇数/偶数ページ別、先頭ページ別の帯にも対応。PDF エクスポートとページ分割印刷 HTML の両方で描画し、xlsx を往復します。
  • ▸ PDF エクスポートのロケール指定(Pro)。 saveAsPdf({ locale: 'zh-CN' }) でフォントのバイト列を持ち回ることなく適切な CJK フォントを埋め込みます。ja / zh-CN / zh-TW / ko は標準登録済みで、registerPdfFont で独自に追加できます。日本語フォントは簡体字中国語のビジネス頻出語の約 3 分の 1 しかカバーしないため、これが中国語出力の豆腐(□□□)を防ぎます。

+ 追加

  • ▸ 検索と置換。 instance.find / findNext / findPrevious / findAll / replace / replaceAll / clearFind / showFindBar / hideFindBar、およびワークシート側の worksheet.findAll ほか。オプションは matchCase、wholeCell、useRegex、lookIn('formula' / 'value')、order、range、includeHidden、インスタンスレベルの scope('sheet' / 'selection' / 'workbook')。非表示行・列、結合セルの従属セル、遅延ロードの未ロード行はスキップされ、保護セルが書き換わることはありません。
  • ▸ 範囲・行・列の移動。 RangeHandle.moveTo(row, column)、worksheet.moveRange / moveRows / moveColumns、事前判定の canMoveRange / canMoveRows / canMoveColumns、操作を無効化する worksheet.setRangeMoveEnabled(false)、そしてキャンセル可能な instance.onBeforeRangeMove と onAfterRangeMove イベント。
  • ▸ ページヘッダー・フッター(Pro)。 PrintSettings.headerFooter に帯ごとの左・中央・右セクション、differentOddEven / differentFirst で有効になる evenHeader / evenFooter・firstHeader / firstFooter、実際に反映される margins.header / margins.footer(Excel 既定 0.3 インチ)。背の高い帯は本文マージンを押し出すため、セルの上に重ならず 1 ページあたりの行数が減ります。
  • ▸ PDF の locale とフォントレジストリ(Pro)。 埋め込むフォントを指す ExportPdfOptions.locale。registerPdfFont、preloadPdfFont、getPdfFont、isPdfFontLoaded、isPdfFontRegistered、getRegisteredPdfFontTags、clearPdfFontCache を @reogrid/pro からエクスポート。エクスポートは同期のままなので、ロケールは自分で制御できる非同期地点で一度 preload してください。
  • ▸ instance.focus() — ホスト側のツールバーやメニュー操作のあとにグリッドへキーボードフォーカスを戻します。次のショートカット(undo/redo、コピー/貼り付け、矢印キー)がブラウザではなくグリッドに届きます。
  • ▸ worksheet.clearRowOutlines() / clearColumnOutlines()(Pro)と syncOutlines() — すべてのアウトライングループを 1 回で解除、または OutlineManager を直接操作したあとにアウトライン状態を再適用します。
  • ▸ WorksheetOptions.autoFitMaxScanRows(既定 1000)— 自動列幅調整が走査する行数の上限。巨大なシートでの文字幅計測コストを抑えます。

~ 変更

  • ▸ 列・行の境界のダブルクリックで選択範囲全体を自動調整。 A:D(や 3:6 行)を選択していずれかの境界をダブルクリックすると、Excel と同様に選択中のすべての列・行が調整されます。以前はポインタ直下の 1 本のみでした。
  • ▸ モニター変更時の HiDPI 再スケール。 devicePixelRatio の変化を監視するようになり、Retina と通常モニター間でウィンドウを移動しても、次に手動リサイズするまでキャンバスがぼやけたままになることがなくなりました。

🐛 修正

  • ▸ セル自体が画面外にスクロールしてもはみ出しテキストが描画され続けます。 右隣の空セルにはみ出した長い値が、そのセルの列がビューポートから出た途端に丸ごと消えていました。
  • ▸ ウィンドウ下部のドロップダウンが画面外ではなく上方向に開きます。 セルのドロップダウン(リスト入力規則/ドロップダウンセルタイプ)とオートフィルターのポップアップは、下に収まらない場合セルの上に反転し、水平方向もビューポート内に収まります。
  • ▸ フローティング画像がネイティブスクロールバーを覆わなくなり、最終行・最終列がスクロールバーの下に隠れなくなりました(Windows や、常時表示設定の macOS など、領域を占有するスクロールバー環境)。
  • ▸ ウィンドウ枠の固定後にスクロールバー末尾の無効な遊びが残らなくなりました — 構造変更時にスクロールスペーサーを再計算するようになり、ネイティブとワークシートのスクロール最大値が即座に一致します。
  • ▸ readReoGridJson() がワークシートにマージせず置き換えるようになり、2 つ目の文書を読み込んでも前の文書の行・スタイル・結合が下に残らなくなりました。また writeReoGridJson(worksheet) がシート名を保持し、保存のたびに Sheet1 に戻ることがなくなりました。
  • ▸ 数値書式付きの数式セルが一括再計算後に古い値を表示し続ける問題を修正(ソート・JSON 読み込み・帳票バインド・移動)。
  • ▸ PDF: pageSize の B4 / B5 / Tabloid / Executive が反映されます(従来は無警告で A4 にフォールバック)。グリッド線はシート自身の設定に従い、改ページ境界の罫線が両ページに印刷されます。
  • ▸ PDF エクスポートがフォントファミリー名を、対処できるメッセージで弾くようになりました。 font はフォントファイルのバイト列を取るため、saveAsPdf({ font: 'Arial' }) はフォントパーサ内部からの RangeError として表面化していました。何が誤りかを示し、loadFont(url) — 既知のロケール名であれば locale — を案内します。ArrayBufferView(Uint8Array の subarray など)もそのまま受け付けます。
  • ▸ worksheet.selection が公開型定義に含まれるようになりました — ドキュメント記載のファサードは実行時には動作していましたが、同梱の .d.ts から欠落していました。
  • ▸ アウトライングループを解除すると、その行・列が再表示されます。 またグループ括弧の閉じ側の目印が、Excel と同じくトグルボタンから離れた端に描画されるようになりました。

v1.4.0

機能リリースです。目玉は Excel スタイルのページレイアウト&印刷(改ページプレビュー)、自社のオリジナルエンジンによる PDF エクスポート、ピボットテーブル、テーブルスタイル(テーブルとして書式設定)、データの入力規則、レポートバインディング(テンプレート明細繰り返し)、セルコメント(メモ)、名前付き範囲 — そして日本語帳票向けの xlsx インポート忠実度の改善多数。公開 API に破壊的変更はありません。

✨ ハイライト

  • ▸ ページレイアウト&印刷(Pro)。 ドラッグ可能な改ページのプレビュー、印刷設定モデル(用紙サイズ・向き・余白・倍率・ページ順)、手動改ページ、印刷範囲に対応。xlsx(pageSetup / pageMargins / rowBreaks / colBreaks)と JSON を往復します。
  • ▸ PDF エクスポート(Pro)。 自社のオリジナルエンジンによる PDF 生成 — 画面上の改ページプレビューと同一のページ割りで出力します。instance.exportPdf() / instance.saveAsPdf()。options.font に glyf TrueType フォントを渡します(ブラウザ用ヘルパー loadDefaultJapaneseFont())。
  • ▸ ピボットテーブル(Pro)。 ソース範囲から再計算する API 駆動のライブピボット — 行・列・値・集計(sum / count / average / min / max ほか)。worksheet.createPivot(def)。
  • ▸ テーブルスタイル/テーブルとして書式設定(Pro)。 Excel 組み込みのテーブルスタイルをライブオーバーレイで描画(挿入/削除で縞模様が再配置)。実際の xl/tables/*.xml を xlsx で往復します。worksheet.addTable(range, options)。
  • ▸ データの入力規則(Pro)。 リスト、整数/小数/日付/時刻、文字列長、カスタム数式のルールに停止/注意/情報アラート付き。リストルールはドロップダウンを自動描画。読み込みは Lite でも動作します。
  • ▸ レポートバインディング/テンプレート明細繰り返し(Pro)。 ヘッダー/明細(×N)/フッターのテンプレートセクションを、バインドしたデータからその場に展開。{{token}} 補間、行ごとの数式シフト、フッター集計、帳票主導の改ページに対応。
  • ▸ セルコメント/メモ(Pro)。 クラシックな Excel コメント(セルごとに 1 件)を赤い角マーカーとホバーの吹き出しで表示。xlsx 読み込み、JSON 往復に対応。
  • ▸ 名前付き範囲/defined names。 ワークブックまたはシートスコープの =SUM(MyRange)、=Tax*2。カスケード再計算と xlsx・JSON 往復に対応。書き込みは Pro、読み込みは Lite でも動作します。

+ 追加

  • ▸ ページレイアウト&印刷(Pro)。 PagingManager が PrintSettings と手動改ページを保持。改ページプレビューは青い破線(自動)と実線(手動/端)を描画し、改ページはドラッグで移動できます。ワークシートのデリゲータ:setPrintSettings、setShowPageBreaks、insertRowPageBreak / insertColumnPageBreak、getPrintPageRanges ほか。
  • ▸ PDF エクスポート(Pro)。 instance.exportPdf(options): Uint8Array と instance.saveAsPdf({ filename, ... }) が外部ライブラリなしでワークシートを描画。ページ割りレンダラーはセル背景、テキスト(配置・オーバーフロー・折り返し・交互行カラー・擬似ボールド)、グリッド線、罫線、結合セルの罫線、埋め込み画像、リッチテキストを描画します。
  • ▸ ピボットテーブル(Pro)。 ピボットエンジン+worksheet.createPivot() がソース範囲からライブピボットを計算しグリッドに書き込み、refreshPivot / PivotHandle.update() で再計算。新デモ pivot-demo.html。既知の制限: 保存されたソース/出力範囲は行・列の挿入/削除でシフトしません — 構造編集後は refreshPivot を呼んでください。
  • ▸ テーブルスタイル/テーブルとして書式設定(Pro)。 worksheet.addTable / RangeHandle.formatAsTable(options) が OOXML スタイル名(既定 TableStyleMedium2)で縞模様のライブオーバーレイを適用し、挿入/削除で再配置。getTable / getTables は Lite で読み込み可。実際の xl/tables/tableN.xml と JSON を往復します。
  • ▸ データの入力規則(Pro)。 setValidation / removeValidation / clearValidations(Pro)+ getValidations / validate(Lite)、RangeHandle.setValidation / CellHandle.setValidation。ルール:list、whole / decimal / date / time / textLength、custom、any。xlsx <dataValidations> と JSON を往復します。
  • ▸ レポートバインディング/テンプレート明細繰り返し(Pro)。 defineReportTemplate / bindReport / unbindReport(Pro)+ getReportTemplate / getReportState(Lite)、instance.report ハンドル。pageBreakEvery: N で N レコードごとに手動改ページ。JSON 往復(sheet.reportTemplate)。
  • ▸ セルコメント/メモ(Pro)。 setComment / removeComment / clearComments / setCommentVisible(Pro)+ getComment / hasComment(Lite)、CellHandle.setComment、RangeHandle.setComment。JSON を往復。xlsx は読み込み専用(VML 書き込みは保留)。
  • ▸ 名前付き範囲/defined names。 instance.defineName(name, address, scope?) / removeName / getName / getNames。xlsx <definedNames>(シートスコープは localSheetId)と JSON を往復します。
  • ▸ 永続的な範囲ハイライトオーバーレイ。 worksheet.setRangeHighlights が、選択/数式参照ハイライトとは独立に、範囲へ永続的な色付きオーバーレイを描画します。
  • ▸ xlsx インポート — 埋め込み OLE 画像オブジェクト(StaticDib)。 OLE オブジェクトとして保存された「図として貼り付け」のスクリーンショットを、DIB/BMP を抽出する最小 CFBF/OLE2 リーダーで表示します。

~ 変更

  • ▸ PDF エクスポートが改ページ/印刷設定モデルに追従。 新しい usePageBreaks オプションにより、用紙サイズ・向き・余白・倍率・ページ帯がすべて worksheet.getPrintSettings() と計算済みの改ページから取得され、画面上のプレビューと同一のページ割りで PDF を出力します。
  • ▸ エクスポートのファイル名が読み込み元のドキュメント名を既定に。 loadFromFile / loadFromUrl が元ファイルのベース名を記録し(getDocumentName() / setDocumentName())、saveAsPdf と saveAsXlsx のダウンロード名の既定値に使用します(例:purchase-order.xlsx → purchase-order.pdf)。

🐛 修正

  • ▸ xlsx インポート — ロケール「短い日付」(numFmtId 14 / 22)が米国形式で表示。 組み込み 14/22 はロケール依存のため、東アジアの短い日付(yyyy/m/d)にマッピングするよう修正 — 既存の 27–36 / 50–58 の日本語マッピングと一貫し、国際的にも曖昧さがありません。
  • ▸ コピー — クリップボードが表示テキストではなく生値を保持。 両方のクリップボードペイロードが表示テキストを使用するように(日付セルはシリアル値 44985 ではなく 2023/2/28 をコピー)。結果が空の数式は空としてコピーされます。生値+数値書式は data-rg-* 属性で引き続き往復します。
  • ▸ 画像オーバーレイがヘッダー上に描画されない。 フローティング画像をセル領域にクリップし、スクロール時に行・列ヘッダーへはみ出さないように。
  • ▸ xlsx インポート — 日本語帳票(発注書)。 ロケール予約の日付書式(numFmtId 27–36 / 50–58)が日付として描画され、ふりがなガイド(<rPh>)が共有文字列に漏れなくなり、_xlfn.IFS(…) の将来関数マーカーが #NAME? にならず解決されるように。
  • ▸ xlsx インポート — 小さなシートと複数行セル。 小さな使用範囲でグリッドが既定サイズ未満に縮まなくなり、_xHHHH_ エスケープ(_x000D_)をデコード、ハード改行を含む行が高さを自動調整するように。

! 既知の問題

  • ▸ セルコメントとピボットテーブルは JSON へは無損失で保存されますが、xlsx 対応は部分的です:コメントは読み込み専用(VML 書き込みは保留)、ピボットは描画済みセルのみ保存(<pivotTableDefinition> は保留)。

v1.3.0

機能リリースです。目玉はマルチシートワークブック — グリッドが N 枚のワークシートからなるワークブックになり、標準のシートタブバー、シートごとの Undo、ワークブック全体の xlsx/JSON 入出力、クロスシート数式参照(=Sheet1!A1)に対応しました。公開 API に破壊的変更はありません。

✨ ハイライト

  • ▸ マルチシートワークブック。 グリッドが N 枚のワークシート+1 枚のアクティブシートからなるワークブックになり、標準のシートタブバー(追加・名前変更・削除・ドラッグ並べ替え・非表示・タブ色)を備えます。各シートが独自のデータ・選択・スクロール・固定・Undo 履歴を保持。新しい instance.workbook コーディネーター(addSheet / removeSheet / renameSheet / moveSheet / setActiveSheet / getSheets / onActiveSheetChange / onSheetsChange)。インスタンスでのワークブック全体 I/O:saveAsXlsx、loadXlsx / loadFromFile / loadFromUrl(全シートを読み込み)、toJson / loadJson。Lite / Pro 両対応で、ティアガードと行・列制限はシートごとに適用されます。
  • ▸ クロスシート数式参照。 数式から他シートのセルを参照できます:=Sheet1!A1、='My Sheet'!A1:B2、引用符なしの非 ASCII シート名(=シート1!A1)。集計関数と LOOKUP 系はクロスシート範囲に対応(=SUM(明細!A1:A3))。Excel 互換のライフサイクル:シート名変更で参照式が書き換わり、シート削除で #REF!、行・列の挿入/削除は他シートの参照をシフト、クロスシート循環は #CYCLE! として検出。Lite / Pro 両対応。
  • ▸ アクティブシートに追従するインスタンスレベルイベント。 新しい instance.onSelectionChange / onCellValueChange / onBulkCellsChange / onScrollChange / onViewportSizeChange / onStructureChange / onContextMenu はアクティブシートのイベントを転送し、シート切り替え時に自動で張り替わります — シートごとの再バインドは不要です。

~ 変更

  • ▸ instance.worksheet と instance.actionManager はアクティブシートのものを返すゲッターになりました。既存のシングルシートコードはそのまま動作します。注意:シングルシート埋め込みでもデフォルトで高さ約 28px のシートタブバーが表示されます — 非表示にするには createReogrid({ showSheetTabs: false }) を渡してください。
  • ▸ マルチシート xlsx インポートはファイルを 1 回だけパースし、各シートのインポートで再利用します(従来は N シートで O(N) 回の再パース)。新しい parseXlsx() ヘルパーと ParsedXlsx 型を追加。
  • ▸ ワークブックのビュー状態が xlsx を往復します:アクティブシート、シートごとの非表示状態、シートタブ色をエクスポート時に書き出し、読み込み時に復元。ReoGrid-JSON もシートごとの view.showGridlines を保持します。

v1.2.3

パッチリリースです。非常に縦長/横長なシート(特に 1.2.2 で導入した 1,000,000 行の遅延ロードシナリオ)のネイティブスクロールを修正しました。公開 API に変更はありません。

🐛 修正

  • ▸ 巨大なシートが最終行までスクロールできるように。 ブラウザは要素のスクロール範囲を約 2^24 px で打ち切るため、1,000,000 行のシート(高さ約 22M px)は約 762,600 行目でスクロールが止まっていました。スクロールスペーサーを 14M px でキャップし、ネイティブスクロール位置をワークシート全域へ比例マッピングするように修正。ホイールのデルタも補正されるためスクロール速度は変わりません。キャップ未満のシートは正確な 1:1 マッピングのまま — 通常サイズのシートに挙動の変化はありません。

v1.2.2

目玉は 1,000,000 行のデータセットを表示する Pro 限定の遅延ロード・データソースです。ほかに Excel 風の横方向テキストオーバーフロー、General 表示での小数桁キャップ、Excel/Google Sheets に合わせた縦方向テキストメトリクスの修正、ドキュメント済みながら未エクスポートだった API を出荷するパッケージエントリ監査を含みます。公開 API に破壊的変更はありません。

✨ ハイライト

  • ▸ 遅延ロード・データソース(Pro)— 1,000,000 行のデータセットを表示。 worksheet.setDataSource(config) でオンデマンドの行ローダーを接続:可視行 ± 設定可能なバッファのみが、ユーザー提供の load(rows) コールバック(同期/非同期)経由でフェッチされます。リクエストは microtask でバッチ化・重複排除され、スクロール先読みは debounce され、洪水ガードが自動リクエストサイズを制限(全選択コピーがデータセット全体を走査しない)、エポックベースの無効化(invalidateAll() / invalidateRows())が古い飛行中の結果を破棄します。loadCells / loadCellsAsync / reset で自動 detach。v1 は表示専用:未ロード行に対する数式・ソート・フィルタは非対応。型 DelayLoadConfig、DataRecord、DataLoadCallback、DataSourceHandle をエクスポート。
  • ▸ Excel 風の横方向テキストオーバーフロー。 折り返しなしで列幅より長いセルテキストが、隣の空セルへあふれて表示されるように。コンテンツ・明示的な塗りつぶし・結合セルを持つ最初のセルでクリップされます。あふれる方向は配置に従います(左揃え→右へ、右揃え→左へ、中央→両側)。
  • ▸ General 表示で長い小数をキャップ。 明示的な数値書式を持たない数値セルは、表示上の小数桁を上限(デフォルト 4 桁)に丸めます — 0.30000000000000004 → 0.3、=1/3 → 0.3333。表示のみ:保存値は完全精度を維持。createReogrid({ generalMaxFractionDigits }) で設定可能。

+ 追加

  • ▸ 新デモページ:delay-load-demo.html — 100 万行+疑似サーバーレイテンシ、フェッチログ、行ジャンプ。
  • ▸ Lite / Pro の React・Vue ラッパーが v1.2 で告知済みのイベント props / emits を公開:onSelectionChange、onCellValueChange、onBulkCellsChange、onScrollChange、onViewportSizeChange、onStructureChange。Pro ラッパーの options は ReogridProOptions 型となり licenseKey を渡せます。
  • ▸ @reogrid/pro がセルタイプ登録 API(registerCellTypeHandler など)、NumberFormat、undo 可能なアクションクラス(ActionManager、ClipboardService、PasteAction など)、buildXlsxFromSnapshot、computeAutoFillValues / AutoFillAction、共通データ型をエクスポート。
  • ▸ @reogrid/lite が ReoGrid JSON I/O と共通データ型をエクスポート。KeyboardController.clipboardService がドキュメントどおり public readonly に。

🐛 修正

  • ▸ セルテキストの縦方向メトリクスを Excel / Google Sheets に一致させました:デフォルトフォントのセルが初回入力で行を自動拡張しない、インラインエディターが WYSIWYG に(レンダラーの行高と verticalAlign を反映)、下揃えテキストはセル下端近く(約 2 px)に配置。
  • ▸ 行高よりコンテンツが高いセルで中央/下揃えの縦配置が機能するように(従来は上端に固定)。
  • ▸ HTML/ブラウザ印刷の出力で結合セルの外周罫線を描画 — 結合されたタイトル行・注記ボックス・合計ボックスの外枠が失われなくなりました。

v1.2.1

パッチリリースです。1.2.0 で導入した数式参照編集に、グリッド上の参照ハイライトを Excel 風にドラッグで移動・リサイズする操作を追加しました。公開 API に変更はありません。

+ 追加

  • ▸ 数式参照ハイライトのドラッグ移動・ドラッグリサイズ。 数式の編集中に、参照矩形の点線枠をドラッグすると範囲全体が移動し、四隅のグリップをドラッグするとリサイズできます。式テキスト中に現れるその参照のすべての箇所が連動して書き換えられ、各トークンの絶対参照($)フラグも保持されます。リサイズはセル中心を境界とし、ポインターがセルの中点を越えて初めてそのセルが範囲に出入りします(Excel および .NET 版と同じ挙動)。リサイズのホットゾーンが分かるよう各ハイライトに小さな色付きの角の四角を描画し、枠と角には move / nwse-resize / nesw-resize のホバーカーソルを表示します。

v1.2.0

機能リリースです。数式関数を 32 個から 109 個へ大幅拡充、セルエディターに Excel 風の色分けされた数式参照編集(クリックでのセル挿入)を追加、選択範囲にドラッグオートフィル用のハンドルを実装、条件付き書式ルールでサイドごとの罫線オーバーライドが可能になりました。React / Vue ラッパーはワークシートイベントをコンポーネント props として公開します。公開 API に破壊的変更はありません。

✨ ハイライト

  • ▸ オートフィル(ドラッグでのフィルハンドル)。 選択範囲の右下に表示される小さな四角をドラッグして、値を下/上/左/右に拡張できます。単一セルのドラッグはタイル状にコピー、2 つ以上の数値セルは等差数列として外挿(1, 2 → 3, 4, 5)、日付書式の単一セルは 1 日ずつ加算、数式は $ 固定参照を保ちつつ Excel と同じように相対参照をシフトします。スタイル・数値書式・セルタイプも伝播し、undo で元に戻せます。
  • ▸ Excel 風の数式参照編集。 数式(= 始まりのセル)を編集中に他のセルをクリックすると、そのセル番地がキャレット位置に挿入され、ドラッグで範囲に拡張できます。式中のユニークな参照ごとに共通パレットから色が割り当てられ、グリッド上の参照範囲も同色の点線矩形で囲まれます。結合セルを含む参照は結合領域全体を囲うように展開されます。
  • ▸ Enter キーで編集開始。 Mac に優しいデフォルト動作 — Enter で編集モードに入る(キャレットは末尾)。Numbers や Excel for Mac と同じ挙動です。F2 も引き続き使えます。
  • ▸ 組み込み数式関数を 109 個に拡充(従来は 32 個)。追加:VLOOKUP / HLOOKUP / INDEX / MATCH / XLOOKUP / XMATCH / ADDRESS、SUMIFS / COUNTIFS / AVERAGEIFS / MAXIFS / MINIFS / SWITCH、日付系 TODAY / NOW / DATE / YEAR / MONTH / DAY / HOUR / MINUTE / SECOND / WEEKDAY / EDATE / EOMONTH / DAYS / DATEDIF、数学 SUMPRODUCT / CEILING / FLOOR / MROUND / MEDIAN / LARGE / SMALL / RANK / EXP / LN / LOG / LOG10 / SIGN / PI / RAND / RANDBETWEEN、三角関数 SIN / COS / TAN / ASIN / ACOS / ATAN / ATAN2、文字列 SEARCH / EXACT / PROPER / CHAR / CODE、情報 ROW / COLUMN / ROWS / COLUMNS。
  • ▸ 条件付き書式でのサイドごとの罫線オーバーライド。 CF ルールに border ペイロードを持たせ、一致セルに対して右・上・下・左の罫線を個別に上書きできます。xlsx の <dxf><border> ラウンドトリップにも対応。
  • ▸ React / Vue ラッパーがワークシートイベントを props として公開。 選択・セル値変更・一括セル変更・スクロール・ビューポートサイズ・構造変更などのイベントを、worksheet.on*() を手動で購読することなく props として渡せます。
  • ▸ reogrid-json I/O をパッケージのメインエントリから再エクスポート。 ReoGrid Studio などワークシートを永続化するホストが、writeReoGridJson / readReoGridJson / parseReoGridJson および ReoGridJsonDocument / JsonWorksheet / JsonCell 型に対して、深いパスを掘ることなく @reogrid/lite / @reogrid/pro から直接アクセスできます。

+ 追加

  • ▸ ReogridOptions.autoFill(デフォルト true)と Worksheet.setAutoFillEnabled() でフィルハンドルを切り替え可能に。
  • ▸ プログラムからオートフィルを利用するための AutoFillAction と computeAutoFillValues() を公開。
  • ▸ Worksheet.setFormulaRefHighlights() / CanvasWorksheet.setFormulaRefHighlights()、およびエディターとグリッドレンダラーで共有する THEME.formulaRefColors パレット。
  • ▸ 条件付き書式の border ペイロード(right / top / bottom / left ごとにスタイルと色を指定)。エンジン評価・レンダラー・xlsx ライターまで一貫対応。
  • ▸ React コンポーネントのイベント props:onSelectionChange、onCellValueChange、onBulkCellValueChange、onScroll、onViewportSizeChange、onStructureChange(onReady に加えて)。
  • ▸ Vue コンポーネントは同じイベントセットを型付きペイロードで emit します。
  • ▸ @reogrid/lite / @reogrid/pro のメインエントリから writeReoGridJson、readReoGridJson、parseReoGridJson、および ReoGridJsonDocument / JsonWorksheet / JsonCell の各ドキュメント型と ReoGridJsonReadOptions / ReoGridJsonWriteOptions のオプション型を再エクスポート。
  • ▸ 10 カテゴリ・109 個すべての組み込み関数を網羅した数式関数リファレンスドキュメント。

~ 変更

  • ▸ エディターの数式参照ハイライトは、参照セル/範囲が結合領域と重なる場合に結合領域全体を囲うように展開されます(Google Sheets ではなく Excel と同じ挙動)。

🐛 修正

  • ▸ オートフィルのホバーカーソルをスクロールコンテナにも適用。フィルハンドルのヒット領域全体で十字カーソルが確実に表示されるようになりました。
  • ▸ 描画キャッシュキーに埋め込まれていた NUL バイトを | に置き換え。まれに発生する計測キャッシュの衝突や文字列処理上の挙動を回避します。

⚡ パフォーマンス

  • ▸ フレーム単位の Canvas ステートキャッシュにより、Book1.xlsx スクロール時の冗長な API 呼び出しを削減:ctx.font= 129 → 34(-74%)、ctx.fillStyle= 179 → 46(-74%)、ctx.measureText() 126 → 35(-72%)、save() / restore() 122 → 85(-30%)。実ブラウザではセルあたりのコストは ctx.font 解析と measureText のシェイピングが支配的なため、大きなシートでのスクロールが目に見えて滑らかになります。
  • ▸ 折り返し/複数行セル向けに layoutPlainTextLines() の結果をフレーム単位でキャッシュ。wrap-text を多用するテキスト中心のシートでは、スクロール時のフレームあたり処理量が大幅に減少します。単一行・折り返しなしのテキストはキャッシュをバイパスする高速経路を通ります。

v1.1.0

xlsx I/O の再現性とロード性能の向上、および .NET 版と同等のアウトライン読み書きを目的としたメンテナンスリリースです。公開 API に破壊的変更はありません。

✨ ハイライト

  • ▸ 大きなファイルの xlsx インポートが約 40% 高速化。 1945×503・約 44 万セルのシートのロードが 6.2 秒から 3.7 秒に短縮。
  • ▸ チャンク非同期ロード(LoadXlsxOptions.chunked)に対応。大きなファイルでも UI が固まらず、初回描画は数秒のフリーズではなく約 40 ms。デフォルトは従来どおり同期。
  • ▸ xlsx アウトラインのラウンドトリップ。 アウトラインレベル・非表示・折りたたみ状態・サマリー方向(上下/左右)の読み書きが、.NET 版と同等に。
  • ▸ ReoGrid JSON ファイル形式。 セル・スタイル・数値書式・リッチテキスト・結合・罫線・サイズ/表示状態・固定・条件付き書式・アウトライン・フィルター・セルタイプ・保護・交互行を、すべて無損失でシリアライズ。
  • ▸ アウトラインサマリー方向。 setRowSummaryBelow / setColumnSummaryRight でトグルボタンをグループの先頭側に切り替え。Excel と同様、アウトラインパネルの最内側に「すべて展開」用のスロットを確保。

+ 追加

  • ▸ LoadXlsxOptions.chunked — false(デフォルト・同期)、true(既定バッチサイズでチャンク)、または { batchSize } でバッチサイズを指定。await ws.loadFromFile(file, { chunked: true })。
  • ▸ Worksheet.loadCellsAsync(cells, { batchSize }) — バッチ間で yield しながら段階的に描画するチャンク非同期版。デフォルトバッチサイズは 5000 セル。
  • ▸ ReoGrid JSON 形式の読み書き API(writer + reader)。
  • ▸ 行・列アウトラインの xlsx 読み書きに対応:レベル、非表示、折りたたみ、サマリー方向。
  • ▸ Worksheet に setRowSummaryBelow(value) / setColumnSummaryRight(value) を追加(undo/redo 対応)。
  • ▸ 「すべて展開」アウトラインレベルボタン(アウトラインパネルの最内側スロット)。
  • ▸ autoFitColumns、autoFitRows、RowHandle / ColumnHandle の autoFit({ mode }) に AutoFitMode('fit' | 'expandOnly' | 'shrinkOnly')を追加。デフォルトの 'fit' は従来動作を維持。
  • ▸ 条件付き書式 cellIs ルールで value を value1 のエイリアスとして受け付けるように。between / notBetween では引き続き value2 が必要。両方指定された場合は value1 が優先。
  • ▸ xlsx インポートで、セル塗りつぶしのテーマカラーと tint を解決。
  • ▸ xlsx インポートで、<fgColor> に加え <bgColor> で表現された dxf 塗りつぶしも読み取り可能に。Excel が書き出した条件付き書式の塗りつぶしが正しく反映されます。
  • ▸ Code Runner(コード実行)デモページを追加。

~ 変更

  • ▸ xlsx インポート時、アウトラインと条件付き書式を非同期セル読み込みより前に適用。初回描画から正しい折りたたみ状態で表示され、展開後にスナップする挙動を解消。
  • ▸ Canvas のフォント文字列に常に汎用 sans-serif フォールバックを付与。指定フォントが未インストール(Office 未導入端末で「Aptos Narrow」を参照する xlsx など)でも、italic / bold プレフィックスが失われなくなりました。

🐛 修正

  • ▸ 非表示の行・列に含まれるセルの罫線を描画しないように修正。アウトライングループで A〜J 列を折りたたんだ際に、A 列の左罫線が行ヘッダー境界に縦線として残る不具合を解消。.NET 版と同等の挙動に。
  • ▸ xlsx インポート:プレーン共有文字列に対して cellXf/font で指定された太字が正しく描画されるように。従来はすべてのプレーン共有文字列がリッチテキスト扱いとなり、セルレベルのスタイルが無視されていました。
  • ▸ 数値書式の条件セクション([=0]、[<>N]、[<N]、[<=N]、[>N]、[>=N])を値の型と独立して評価するように修正。[=0]"-";m/d/yy のような書式コードで常に先頭セクションが選ばれる不具合を解消。
  • ▸ Excel シリアル日付エポックの 1 日ずれを修正。シリアル 45658 が期待どおり 2025-01-01 に解決されます。
  • ▸ xlsx インポート時に、テーマカラー・tint・<bgColor> で表現された dxf 塗りつぶし(Excel 出力ファイルでは一般的)を解決するように。
  • ▸ プレーンテキスト描画経路で複数単語のフォントファミリー(例:「Aptos Narrow」)が二重引用符で囲まれなくなりました。これにより Canvas 2D が italic / bold プレフィックスを無言で破棄する不具合を解消。
  • ▸ 非表示列の列ヘッダーラベルをスキップするように修正。アウトライングループの折りたたみ時に、次の表示列上にヘッダー文字が二重描画されなくなりました。
  • ▸ 折りたたまれた親により非表示となったグループのアウトライントグルとブラケット線をスキップ。内側のトグルが外側のトグル行に重ね描きされる不具合を解消。
  • ▸ 部分的に重なるアウトライングループを追加した場合、明確なエラーをスローするように。アウトライングループは厳密なツリー構造を成す必要があり、従来は交差により表示されるがクリックできない内側トグルが生成されていました。
  • ▸ 行・列両方のアウトラインパネルがある場合の、コーナー領域レベルボタンの当たり判定をレンダラーと整合。
  • ▸ 不正な条件付き書式 cellIs ルール(value1 欠落)が描画ループをクラッシュさせなくなり、ルールは単に不一致を返すように。
  • ▸ プレイグラウンドデモ:初回クリックで xlsx ファイルを開けるように修正(再描画まで worksheet=null の古いクロージャをツールバーが保持していました)。

⚡ パフォーマンス

  • ▸ xlsx エンドツーエンドロード時間(1945×503・約 44 万セルのテストファイル):node で 6.2 秒 → 3.9 秒(-37%)。改善はパーサー、セル抽出ウォーク、ワークシート一括ロード経路、数式エンジンの初期再構築に及びます。
  • ▸ インポート時の行オートフィットを遅延評価に変更:先行測定はビューポート内の行のみ、それ以外の行は初めてスクロール表示された時点で測定。Book1 規模のシートで約 100 万件の無駄なセル訪問をスキップ。
  • ▸ チャンクインジェスト({ chunked: true })により、ユーザーから見て「固まる」時間を、数秒のフリーズから 16〜30 ms スライスへと分割。

v1.0.0

初の安定版リリース。これ以降、公開 API は semver の下で凍結され、1.0.0 以降の破壊的変更にはメジャーバージョンアップが必要となります。

✨ ハイライト

  • ▸ ハンドルベースの公開 API。 構造・スタイル操作はすべて、フラットなトップレベルメソッドではなくチェーン可能なハンドル(worksheet.row(i)、worksheet.column('B')、worksheet.range('A1:C5').setBold()、worksheet.selection.range?.setStyle(...))経由で行います。今後はこの API に対して実装してください。
  • ▸ 内部 Manager レイヤリング。 Worksheet はエントリポイントとなり、状態変更は StyleOperations、SizingManager、VisibilityManager、StructureManager に分離。
  • ▸ 数式エンジン。 Lexer → parser → evaluator → 依存グラフ + 32 個の組み込み関数。インポートした xlsx 数式は再評価されます。tests/formula.spec.ts と tests/formula-ext.spec.ts に 151 件の数式テスト。
  • ▸ プラガブルなセルタイプ。 CellTypeHandler レジストリと 8 種類の組み込みタイプ:チェックボックス、ドロップダウン、ボタン、プログレス、レーティング、スパークライン(折れ線・面)、ハイパーリンク。
  • ▸ 条件付き書式(Pro)。 addConditionalFormat、removeConditionalFormat、clearConditionalFormats、getConditionalFormats。
  • ▸ セルツールチップ(Pro)。 setCellTooltip、showCellTooltip、hideCellTooltip、clearCellTooltip。
  • ▸ ブラウザ印刷(Pro)。 スタンドアロン関数 printWorksheet(...)。Lite ではアップグレード促進用の console.warn スタブとして提供。
  • ▸ xlsx ラウンドトリップ。 ReoGrid .NET 版とのクロスバリデーション付きインポート/エクスポート。
  • ▸ Lite / Pro ティアガード。 Lite は 100 行 × 26 列の上限を強制し、Pro 限定メソッドを公開ハンドル層と内部 Manager チョークポイントの両方でスタブ化。
  • ▸ React / Vue ラッパー。 別エントリポイントとして公開:@reogrid/lite/react、@reogrid/lite/vue、@reogrid/pro/react、@reogrid/pro/vue。

+ 追加

  • ▸ worksheet.reset(options?) — ワークシートを破棄せず、その場で空の状態に戻します。値、スタイル、セルタイプ、ヘッダードロップダウン、条件付き書式、セル保護、罫線、結合、非表示の行/列、アウトライン、固定枠、カスタム行/列サイズ、スクロール、選択を消去し、showGridLines を true にリセット。options.rows / options.columns でグリッドサイズも変更可能。CanvasWorksheet はさらに画像、オートフィルター、ツールチップも消去します。xlsx インポーターはロード前リセットとしてこれを使用。
  • ▸ シングル軸サイズ変更用の worksheet.rows.setCount(count) / worksheet.columns.setCount(count)(RowCollection / ColumnCollection)。
  • ▸ @reogrid/lite から printWorksheet を console.warn スタブとして再エクスポート。PRO_METHODS と統一されたガード機構を提供。
  • ▸ PRO_MANAGER_METHODS + applyLiteWorksheetGuards により Manager の裏口(structureManager.insertRows、visibilityManager.setRowHidden 等)を閉鎖。各ハンドルのエントリポイントがティアガードを迂回できなくなりました。
  • ▸ yarn test:perf スクリプトと tests/**/*-benchmark.spec.ts 命名規約。日常の yarn test を高速に保ちつつ、ベンチマークはオプトインで実行。
  • ▸ ワークシートコンテナに ResizeObserver を設置。flex/サイドバー/パネルのレイアウト変更にキャンバスが追従。
  • ▸ requestAnimationFrame ベースの描画バッチング(Worksheet.scheduleRender)。
  • ▸ 大規模データセットを高速にバルクロードする bulkSetCells() API。
  • ▸ Excel 流のキーボード選択:anchor + focus モデル、Shift+クリックでの選択拡張、方向認識する結合ナビゲーション、キーボード/ドラッグ時のオートスクロール。
  • ▸ グリッドにスナップしてリサイズする自動拡張型セルエディター。
  • ▸ tsconfig.json の stripInternal: true により、@internal メンバーが公開 .d.ts に漏れなくなりました。

~ 変更

  • ▸ 破壊的変更: worksheet.setRowCount(n) と worksheet.setColumnCount(n) を削除。代わりに worksheet.rows.setCount(n) / worksheet.columns.setCount(n)、または両軸を一括変更する worksheet.setGridSize(rows, cols) を使用してください。
  • ▸ 破壊的変更: worksheet.rows / worksheet.columns は RowCollection / ColumnCollection ハンドルを指すようになりました。数値カウントは worksheet.rowCount / worksheet.columnCount に移動。
  • ▸ 破壊的変更: worksheet.selection は bounds / isEmpty / activeCell / range / moveTo のみを公開する薄い SelectionHandle に。現在の選択に対するスタイル・値操作は、ハンドル上の委譲メソッドではなく worksheet.selection.range?.setBold() 経由で行ってください。
  • ▸ 破壊的変更: フラットな setSelection*Bold/Italic/Style/... メソッドを削除。ハンドル API(worksheet.range(...).setBold())に置き換え。
  • ▸ KeyboardController は window ではなくワークシートコンテナでリッスン。同一ページ上の複数グリッドインスタンス間でキーボードイベントが交差しなくなりました。
  • ▸ CellEditor のインラインテキストエリアが position: fixed ではなく、ワークシートコンテナ基準の position: absolute を使用するように。CSS transform を持つ祖先要素、モーダルダイアログ、iframe 内での位置ずれを解消。
  • ▸ 結合セル描画:結合アンカーがスクロールアウトしている場合、最も上・最も左にある表示中セルからコンテンツを描画するように。

🐛 修正

  • ▸ COUNT(1, 1/0, 2) のような直接引数中のエラーが正しく伝播するように(Excel と同等の挙動)。範囲引数内のエラーは従来どおり無視されます。
  • ▸ 行/列削除後の #REF! が正しくキャッシュされるように(評価器の name ノードで EXCEL_ERROR_LITERALS が参照されておらず、#NAME? として表面化していた問題)。
  • ▸ ビッグデータデモにおける bulkSetCells の初回描画経路。
  • ▸ エディターの背景がセルの backgroundColor を尊重するように。
  • ▸ ポインター/エディター操作におけるダブルクリックと編集コミットの各種エッジケース。

− 削除

  • ▸ レガシーなフラット setSelection* API(ハンドル API を使用してください)。
  • ▸ worksheet.setRowCount / setColumnCount(コレクションの setCount を使用してください)。

! 既知の問題

  • ▸ worksheet.columnWidths / rowHeights 配列は JS 配列インデックス経由で変更可能(readonly で強制されていません)。
  • ▸ React の <Reogrid> はマウント後の options prop 変更を無視します(強制リマウントには key を使用)。
  • ▸ オートフィットは列あたり O(rows)。
  • ▸ devicePixelRatio は resize() ごとに 1 度のみ読み取られ、モニター変更時には更新されません。

生のチェンジログや過去のリリース履歴は、npm の @reogrid/lite パッケージページをご覧ください。

ニュースレター

開発の最新情報をお届けします

新しいリリース・機能追加・お知らせをいち早く受け取るには、
メーリングリストにご登録ください。