| Display | A number too wide for its column spilled into the next cell. As in Excel, a number in General format is now rounded to the digits that fit (scientific notation if even the integer part does not), and a formatted one shows #### |
| Display | A merged cell whose top-left lies outside a pane was blank where it was visible (a vertical merge scrolled past its top, a merge across the frozen columns or rows) |
| WinForms | Drawing repeatedly onto the same Graphics with RenderTo / RenderFrame compounded the scale, and at 150% threw OverflowException after a few dozen frames |
| Data validation | In a workbook opened virtualized (XlsxReader.OpenVirtual), a list rule whose options come from a sheet not shown yet (such as a “lists” sheet) or from rows off screen had no options: its ▼ opened nothing, and no value passed the rule, so the edit could not be committed |
| Virtualization | In a workbook opened virtualized, sorting, undo, multi-range copy and Replace All treated rows not loaded yet as empty: sorted or replaced values were overwritten when those rows loaded, and undo could erase the file’s values. A merged cell whose top-left row was above the view was drawn blank. Each now loads the rows it needs first. Formulas, conditional-format statistics, filters and row/column insert or delete still do not see rows not loaded yet — call MaterializeAll() before editing (Large data) |
| Display | Text too wide for its cell (stopped by a neighbouring cell, or in a merged cell) was shortened with ”…”. As in Excel, it now keeps its alignment and is clipped at the cell edge: left-aligned text shows its start, right-aligned its end, centred its middle. WinForms (GDI+ / Direct2D), WPF, Avalonia and PDF alike |
| Data validation | A rule with its error alert turned off (ShowErrorMessage = false, or no showErrorMessage in an xlsx) rejected an invalid entry without saying so, leaving Esc as the only way out of the editor. As in Excel, such an entry is now accepted |
| WinForms | The list of a dropdown cell or a list validation rule could be cut off at the edge of the grid. As on WPF and Avalonia, it now opens in a popup, above the cell when there is no room below on the screen |
| Display | A merged cell showed the borders of the cells it covers as a grid inside it (in an xlsx, every cell of a merged range often carries its own borders). As in Excel, a merged cell now draws only its outer borders, in PDF and print too |
| XLSX | In a loaded workbook, editing a value did not recalculate the formulas that refer to it (on the same sheet or another). The formula dependencies are now registered at the end of the load; what is shown stays the file’s cached values. A workbook opened virtualized registers them after MaterializeAll() |
| XLSX | Loading: built-in number format IDs 41–43 (thousands separator, accounting) are resolved. A row without an r attribute is read as the one after the previous row. ISO 8601 date cells (t="d") are read. A workbook with overlapping merged cells opens. A <pageSetup> without paperSize is read as Letter (the OOXML default), a font with no colour (automatic) as black, a column of width 0 as hidden, and medium dashed borders (mediumDashed and the like) as dashed lines of weight 2 |
| XLSX | Saving: functions newer than Excel 2007 are written with the _xlfn. prefix. _xHHHH_ escapes are read and written, so a cell holding control characters can be saved. A " in the options of a list validation rule is escaped. A cell in a circular reference is written with the cached value 0, as Excel does. Formatted cells without a value (a filled header, input cells formatted in advance) and formulas without a cached result were lost on save. Formatted cells without a value are now saved to reogrid-json too |
| Virtualization | In a workbook opened virtualized, a sheet with rows lower than the default showed a blank lower part right after opening, until the next repaint. Row heights and hidden rows now apply from the moment the sheet opens. Find in formulas missed formulas in rows loaded later. Repainting right after the workbook was closed threw for a sheet not shown yet |
| Formulas | Results now match Excel. A formula that refers to an empty cell returns 0. 0^0 returns #NUM!, 0^-1 returns #DIV/0!, and a result beyond the range of a double returns #NUM!. Cancellation in the last addition or subtraction of a formula gives 0 (=924081.39+3604900.09-759790.51-3769190.97 is 0). Rounding in the ROUND family and in CEILING FLOOR MROUND. NaN and ∞ from math functions become error values. A date function given an out-of-range serial returns #NUM! |
| Formulas | Function arguments and lookups now follow Excel’s rules. Lookups in VLOOKUP HLOOKUP MATCH XLOOKUP INDEX. A COUNTIF-family criterion no longer matches a value of another type. COUNT counts logical values and numeric text written directly as arguments. AND OR XOR accept ranges. An argument that takes a range returns its error if it is one. SEARCH uses wildcards, and PROPER capitalizes at Excel’s word breaks. A character escaped with ~ in a wildcard pattern matched anything. Argument handling in LEFT RIGHT SUBSTITUTE CHAR ISEVEN ISODD |
| Formulas | A formula that reads its own cell (=A1+1 entered in A1, for example) is detected as a circular reference (#CIRCULAR!). Function names with the _xlfn. prefix resolve to the function itself. A formula using a name broken by deleting its range returns #REF! instead of #NAME?. Renaming a sheet by case alone also rewrites the sheet name in references. Deleting rows or columns could erase the formula text of a formula that moved up into their place. A long chain of operators, and edge arguments to RANDBETWEEN and REPT, threw or ran out of memory |
| Number formats | The text section (@, the fourth section), a comma just before the decimal point (scaling by 1,000), colour and condition brackets in either order, and an empty negative section (negative values shown as nothing) now behave as in Excel. Decimals are rounded on the value’s 15 significant digits. A negative zero showed as -0 in General format. A number with an explicit General or @ format showed #### when too wide for its column; it is now rounded like an unformatted number |
| Input | In the in-cell editor and the formula bar, 50% is entered as 0.5 (with a % format), 2026/10/21 and 2026-10-21 (optionally with a time) as dates, and 13:45 as a time. A leading ' marks the entry as text and is not stored. A cell formatted as text (@) keeps what was typed as text. TRUE / FALSE become logical values on every input path, and NaN Infinity 1e400 stay text. A float passed to SetObjectValue is stored as written (0.1f used to become 0.100000001490116) |
| Editing | ClearCell (the Delete key, Clear Contents, the source of a cut) also removed the cell’s fill and bold. As with Excel’s Clear Contents, it now removes the value and formula and keeps the formatting |
| Editing | The in-cell editor treats a surrogate pair (an emoji, for example) as one character. Moving a reference frame while editing a formula keeps the $ of absolute references. While editing a formula, a reference to another sheet got a frame on the sheet being edited. Word-by-word drag selection carried on after the text was edited. A line that fits exactly up to a space pushed its last word to the next line |
| Selection | The arrow keys and Shift+arrow keys stopped on hidden rows and columns |
| Rows & columns | Inserting or deleting rows and columns also moves formatted cells without a value, each column’s AutoFilter criteria, and the references in formula rules of conditional formats. Deleting every row (column) left a sheet of 0 rows and crashed; as in Excel, the sheet now keeps its size and is emptied. A negative position or count throws ArgumentOutOfRangeException before anything changes. On a sheet widened past 16,384 columns by inserting columns, borders and merged cells could be drawn in the wrong place. On a sheet where deleting columns left only frozen columns, drawing threw |
| Undo | Undoing a row or column deletion also restores the AutoFilter range, its criteria and the rows it hid, and the outline groups removed with the deletion. Recording a paste that runs over the edge of the sheet threw |
| Filters | Rows hidden by AutoFilter are always shown again, including when they lie outside the used range and when the filter is removed. A percentage in a condition filter, such as 100%, is compared as a number |
| Conditional formats | Top/bottom, average, color scale, data bar and icon set rules apply only to cells holding numbers. After a rule was deleted, the rules behind it were judged on another rule’s statistics |
| Merged cells | A formula cell that disappears into a merge is removed from the formulas, and the formulas that referred to it recalculate. Merging a range that runs off the sheet, or several ranges one of which cuts an existing merge, is refused before anything changes. Copying and pasting an empty merged cell keeps the merge |
| AutoFill | In a column mixing values and formulas, formula references are still shifted to the destination. A cell with a time-only format advances by one hour, as in Excel. A target range past the edge of the sheet is filled up to the edge. A target that extends in more than one direction writes nothing |
| Outline | A group refused for being too deep took the existing groups with it. Removing a group re-levels the remaining ones. A group that runs off the sheet is refused |
| Clipboard | Copying a range that runs off the sheet, and pasting beyond its edge, threw |
| Worksheet | An empty sheet name, and a duplicate that differs only in case, are refused. A negative row or column index, and a negative, NaN or infinite row height or column width, throw ArgumentOutOfRangeException (loading an xlsx or reogrid-json skips such values) |