98 Commits
Author SHA1 Message Date
Marco Arnulfo 4b2ee2e2dd Conditional formatting: New Rule remembers its sheet by name, so moving or inserting sheets while it is open keeps the rule there (#2348) 2026-10-23 22:07:22 +02:00
Marco Arnulfo 45f06f50da Conditional formatting: New Rule keeps the range it was opened for when pointing on another sheet (#2348) 2026-10-23 22:05:24 +02:00
Marco Arnulfo d5aa6fbcbc Conditional formatting: New Rule's formula box takes references clicked or dragged on the grid (#2348) 2026-10-23 21:56:39 +02:00
Marco Arnulfo 43a5a3c435 PivotTables: Show Details checks the report is up to date before looking at the cell 2026-10-23 21:00:07 +02:00
Marco Arnulfo 7111812b87 PivotTables: Show Details refuses an out-of-date report, and reports its errors instead of editing the cell 2026-10-23 20:41:47 +02:00
Marco Arnulfo 0c14f59555 PivotTables: Show Details, double-click a value cell to list its source records on a new sheet (#2364) 2026-10-23 20:21:27 +02:00
Marco Arnulfo 45ec9dfbfe Build the saved UiState in the test with struct update syntax (clippy field_reassign_with_default) 2026-10-23 18:44:23 +02:00
Marco Arnulfo a0ceea1468 Open on the Home tab every launch, as in Excel (fixes #2329) 2026-10-23 17:16:30 +02:00
Marco Arnulfo 9135c7f6f0 Ribbon: fall back to Home when the active contextual tab is gone (fixes #2329) 2026-10-23 17:07:42 +02:00
Marco Arnulfo 042ac7060f macOS: bold interface text draws Cyrillic е open, not like ө (fixes #1184) 2026-10-16 16:50:12 +02:00
Marco Arnulfo 14f2ea9f57 Cell editor: the caret contrasts with the cell's fill (fixes #1408) 2026-10-16 14:53:20 +02:00
Marco Arnulfo 295f7dde33 Fill handle: right-drag opens the fill menu (Copy Cells, Fill Series, Fill Formatting Only, Fill Without Formatting, Series…) 2026-10-16 14:20:48 +02:00
Marco Arnulfo efc8171609 Keyboard: Ctrl+6 hides and shows objects, saved as workbookPr showObjects 2026-10-16 07:03:58 +02:00
Marco Arnulfo 0033dfcdeb Keyboard: Ctrl+Shift+A after a function name inserts its argument names 2026-10-16 06:24:36 +02:00
Marco Arnulfo ac8bbd84eb Grid: a cell with line breaks and Wrap Text off draws the whole string on one line (fixes #1604) 2026-10-16 05:14:19 +02:00
Marco Arnulfo e8c6fcb8b0 XLSX: keep custom column widths that round to the default width (fixes #1607) 2026-10-16 05:11:07 +02:00
Marco Arnulfo f3398ee218 Grid: a scrolled Table's header names and filter buttons in the column headings (#1423) 2026-10-16 04:27:49 +02:00
Marco Arnulfo 706127402a XLSX: keep header and footer pictures on save (part of #1257) 2026-10-16 02:48:25 +02:00
Marco Arnulfo 81422c315d Contributors: add my name for the About window 2026-10-16 02:19:55 +02:00
Marco Arnulfo 79e8973c30 Web: keep preferences such as dark mode between visits (fixes #1562) 2026-10-16 01:35:02 +02:00
Marco Arnulfo fda8e7b703 AutoFilter: Enter in the filter menu applies the filter and closes it (fixes #1516) 2026-10-16 01:13:10 +02:00
Marco Arnulfo 7a352cee09 Grid: an armed Format Painter paints whole rows and columns from their headers (refs #1211) 2026-10-15 21:22:40 +02:00
Marco Arnulfo c0d6f290e7 Name Manager: preview a name over several ranges through parse_name 2026-10-15 21:20:52 +02:00
Marco Arnulfo 62729e3a99 Keyboard: Alt+= no longer starts an edit with the = it types (fixes #1327) 2026-10-14 19:52:36 +02:00
Marco Arnulfo f36bc100d4 AutoFit measures each distinct text once, and quickly on large columns (#1316) 2026-10-14 18:14:09 +02:00
Marco Arnulfo f92b4d30cb AutoFit Column Width measures text in the font the grid draws it with (fixes #1316) 2026-10-14 18:01:11 +02:00
Marco Arnulfo 39602e6ce1 Filter and Subtotal: a Sheet! prefix on the range works on that sheet, not the active one (refs #1283) 2026-10-14 13:00:17 +02:00
Marco Arnulfo 13691e95e5 Remove Duplicates: a Sheet! prefix on the range works on that sheet, not the active one (refs #1283) 2026-10-14 12:51:05 +02:00
Marco Arnulfo be1af2d6ac Sort: a Sheet! prefix on the range sorts that sheet, not the active one (fixes #1283) 2026-10-14 12:08:41 +02:00
Marco Arnulfo 531d292930 N() converts a computed array element by element, so it works inside SUMPRODUCT (fixes #1279) 2026-10-14 11:46:48 +02:00
Marco Arnulfo 89439636d8 Dialogs move by their title bar instead of staying pinned to the centre (fixes #1250) 2026-10-14 08:08:41 +02:00
Marco Arnulfo 736cc89b2b Opening an XLSX with a part over 512 MB says how to get the data in (fixes #1242) 2026-10-14 07:44:41 +02:00
Marco Arnulfo d1075c067b BAHTTEXT: a final one after the millions reads เอ็ด (fixes #1234) 2026-10-14 05:46:44 +02:00
Marco Arnulfo 9f11e26e78 Journal: cap by serialized size and keep a recording's start through trims (part of #1228) 2026-10-14 05:10:19 +02:00
Marco Arnulfo f519fd67f6 XLSX: keep a dxf's protection, font size and face, and the font parts it turns off (part of #1209) 2026-10-14 04:49:33 +02:00
Marco Arnulfo 3f520a3420 File: Save a Copy asks where to save a bare name instead of writing it to the working directory (fixes #1212) 2026-10-14 03:03:33 +02:00
Marco Arnulfo 5e5e131be7 Grid: an armed Format Painter pastes onto the next cells clicked or dragged (fixes #1211) 2026-10-14 03:03:28 +02:00
Marco Arnulfo 2d0a7a1e42 Ribbon: more currency symbols in the Accounting Number Format menu (fixes #1063) 2026-10-13 14:48:32 +02:00
Marco Arnulfo f8838b15e1 Keyboard: an arrow that commits typing ends the run of Tabs, as in Excel
Typing then Right or Down committed through the Enter/Tab path, so Right
continued the run and Down went back to its starting column. Found by
@richard1912 against Excel 365: from B2, type, Tab, type, Right, Enter
lands on D3, and with Down on C4.
2026-10-13 14:32:23 +02:00
Marco Arnulfo 4d5360fd90 Sheet tabs: Ctrl-drag (Cmd or Option on macOS) drops a copy of the sheet (fixes #971) 2026-10-13 12:21:52 +02:00
Marco Arnulfo 3272097e15 Control: Go To and Select over the control channel scroll the active cell into view (fixes #966) 2026-10-13 12:02:55 +02:00
Marco Arnulfo 5a7fbfa5b8 Contributors: add my real name 2026-10-13 10:46:07 +02:00
Marco Arnulfo 4ec6a373b0 Ribbon: Font Size is a box you type into, the sizes behind its arrow (fixes #932) 2026-10-13 10:35:59 +02:00
Marco Arnulfo f644004cc6 Sheet tabs: New sheet (+) right after the last tab, the strip capped at 60% (part of #943) 2026-10-13 10:35:14 +02:00
Marco Arnulfo a54cf58f2e Keyboard: Enter after a run of Tabs goes to the next row in the column the run started from (fixes #911) 2026-10-13 07:48:23 +02:00
Marco Arnulfo 06c8ff640d Keytips: Alt, F opens the File view, and its F letters still run (part of #893) 2026-10-13 07:31:28 +02:00
Marco Arnulfo d0d4d26c74 UI: File › Account shows the version, platform and licence, with an About GridCraft button (fixes #896) 2026-10-13 07:12:34 +02:00
Marco Arnulfo c7cb91ea53 Merge remote-tracking branch 'origin/main' into fix/xlsx-xml-maps 2026-10-13 06:33:03 +02:00
Marco Arnulfo 638cbab9a5 Merge remote-tracking branch 'origin/main' into fix/edate-eomonth-1900
# Conflicts:
#	crates/functions/src/date.rs
2026-10-13 06:29:36 +02:00
Marco Arnulfo ca8fc73281 Merge remote-tracking branch 'origin/main' into fix/function-excel-diffs-738
# Conflicts:
#	crates/calc/src/eval.rs
2026-10-13 06:29:34 +02:00
Marco Arnulfo 9943e78952 Merge remote-tracking branch 'origin/main' into fix/close-unsaved-prompt 2026-10-13 06:26:10 +02:00
Marco Arnulfo 6de9cfe4e1 Merge remote-tracking branch 'origin/main' into fix/pivot-fields-pane-i18n 2026-10-13 06:24:55 +02:00
Marco Arnulfo d231823e1c Merge remote-tracking branch 'origin/main' into fix/name-union-definition 2026-10-13 06:22:09 +02:00
Marco Arnulfo 13bc5ecd11 Merge remote-tracking branch 'origin/main' into feat/cell-autocomplete 2026-10-13 06:21:58 +02:00
Marco Arnulfo 522ede0fca Save an XLSX opened under an unknown extension back to its own file as XLSX (#878) 2026-10-13 05:14:30 +02:00
Marco Arnulfo 9bb85ab9af Refuse to save to an unknown file extension instead of writing XLSX under it (fixes #878) 2026-10-13 04:34:03 +02:00
Marco Arnulfo 6dc9138a64 check: internal links and empty parts aren't package losses (part of #860) 2026-10-13 03:52:00 +02:00
Marco Arnulfo bf2923c4ba check: the package round trip reports relationship kinds the save lost (part of #860) 2026-10-13 03:04:37 +02:00
Marco Arnulfo dab4aa5e79 XLSX: write this-row structured references as [[#This Row],[Col]] (fixes #864)
[@Col] is only Excel's display shorthand. Written verbatim into cell formulas and calculatedColumnFormula, it made Excel repair the file and drop the tables.
2026-10-13 02:58:56 +02:00
Marco Arnulfo 2dd832e2d5 XLSX: XML maps survive a save, with their table columns and mapped cells (part of #860) 2026-10-13 02:45:40 +02:00
Marco Arnulfo 5564856feb PivotTables: the PivotTable Fields pane follows the interface language (fixes #858)
The pane's labels, field menus and buttons were hardcoded English strings that never went through i18n, so switching to Spanish left the whole pane in English. They now go through Language::tr, with Spanish entries in the catalog. The Summarize by / Show as items are keyed as whole labels so each one can be translated.
2026-10-13 02:41:49 +02:00
Marco Arnulfo 68a3eabe20 Sheet tabs: All Sheets navigator with a filter field (fixes #839) 2026-10-13 00:25:32 +02:00
Marco Arnulfo 443301f9ee UI: Enter pastes the copied range and ends copy mode (fixes #845) 2026-10-13 00:21:25 +02:00
Marco Arnulfo 9c3db37ca2 UI: AutoComplete folds case beyond ASCII and cuts the proposed rest on characters (#842) 2026-10-13 00:18:55 +02:00
Marco Arnulfo a7e22d299f Grid: horizontal scrollbar in the sheet tab bar (fixes #840) 2026-10-13 00:14:40 +02:00
Marco Arnulfo 7a8235a586 UI: AutoComplete for cell values can be turned off, Backspace and Escape drop the proposal (fixes #842) 2026-10-13 00:13:35 +02:00
Marco Arnulfo f25bded4ef Closing the window asks to save unsaved workbooks (fixes #838, fixes #841) 2026-10-13 00:12:20 +02:00
Marco Arnulfo 1f19bf4a27 Grid: Shift+arrows in point mode extend from the pointed cell, also up and left (fixes #835) 2026-10-12 23:28:26 +02:00
Marco Arnulfo 52b4f873c7 XLSX: a hyperlink to another file is saved as an external relationship (fixes #800) 2026-10-12 22:57:20 +02:00
Marco Arnulfo 484612f638 XLS: formulas that use a skipped defined name keep their saved results (fixes #803) 2026-10-12 22:56:40 +02:00
Marco Arnulfo 5406fc5629 XLSX: Save As into another folder keeps links on the same workbook (fixes #801)
Excel stores the path of a linked workbook relative to the file that uses it, and rewrites it when the file is saved into another folder. The path was kept as text, so after Save As it named a file next to the new copy: a missing link, or another workbook with the same name. Relative externalLinkPath targets are now resolved against the folder the workbook was read from and written relative to the folder it is saved into (absolute when there is no relative path, on another drive).
2026-10-12 22:55:53 +02:00
Marco Arnulfo 6939d95cae Formula bar: hide _xludf. like Excel, keep it when the edit is confirmed unchanged (#726) 2026-10-12 22:53:10 +02:00
Marco Arnulfo 75305dfedf XLSX: keep the workbook's default font on save (fixes #805)
Cell format 0 always mapped to the model's built-in Calibri 11 default, so the file's Normal font was replaced on save and every default-formatted cell changed size. The Normal style now takes the font of cell format 0, and a Normal font in the theme's body face is written with scheme="minor" again.
2026-10-12 22:51:41 +02:00
Marco Arnulfo 930fa1cada XLSX: keep fileVersion and calcFeatures in workbook.xml on save (fixes #799)
Excel uses the cached cell values of a saved file only when workbook.xml has both <fileVersion> and the calcFeatures extension; without them it recalculates everything on open, and lookups into closed workbooks come back as #CALC!. Both are now read into the workbook's kept content and written back in schema order: fileVersion first, the calcFeatures ext in <extLst> last. A workbook that had neither gets neither.
2026-10-12 22:49:34 +02:00
Marco Arnulfo 9a58f2d086 XLS: a formula kept as its saved value keeps a text result (fixes #802) 2026-10-12 22:40:01 +02:00
Marco Arnulfo a5f531838b Functions: note the dependency gap of computed criteria (part of #737) 2026-10-12 21:08:20 +02:00
Marco Arnulfo 531dc5a5aa functions: MODE comments name Excel 365 as the reference, not POI's cached values (#736) 2026-10-12 20:21:19 +02:00
Marco Arnulfo 1767a28371 Numfmt: scientific formats with a literal after E±, a % or a comma match Excel (fixes #768)
The exponent sign goes right before the exponent digits, after any literal that follows
the E; ? pads exponent digits with spaces; % and commas never scale a scientific section;
zero shows 0 in every integer placeholder. Checked against the 248 TEXT() rows of Apache
POI's NumberFormatApproxTests.xlsx, copied as data into a test.
2026-10-12 19:43:33 +02:00
Marco Arnulfo cf587ffe3b Names: a name over several ranges reads its top-level commas as unions (fixes #728) 2026-10-12 19:16:49 +02:00
Marco Arnulfo 4d2e8e3455 Functions: database functions evaluate computed criteria (part of #737)
A formula under a criteria label that names no field is evaluated for each record: its relative references move from the first record to that record, and the database labels name the record's fields, as in Excel. The calc evaluator passes the criteria reference to the database functions through Ctx::computed_criterion.
2026-10-12 19:16:00 +02:00
Marco Arnulfo f63a437d5b Formulas: keep _xludf. so user-defined calls stay user-defined (fixes #726)
The parser stripped _xludf. like _xlfn., but the two mean opposite things:
_xludf. marks a name Excel must not treat as a built-in. Keeping it in the
call name makes the call an unknown function (#NAME?, as in Excel) and the
writer emits it unchanged, so _xludf.EOMONTH() no longer saves as an
EOMONTH() call Excel repairs away.
2026-10-12 19:07:32 +02:00
Marco Arnulfo f968bb3269 CELL("width") returns the Column Width dialog value, without the padding (#735) 2026-10-12 19:05:41 +02:00
Marco Arnulfo 0a27d4a5d4 Functions: MIRR, COUNTIF, INDIRECT and USDOLLAR match Excel 365 (fixes #738) 2026-10-12 19:04:17 +02:00
Marco Arnulfo eb534b5caf Functions: DGET skips empty result fields and "" criteria match any text (part of #737) 2026-10-12 18:58:34 +02:00
Marco Arnulfo 94014c5594 Tables: structured references keep the spaces at the edges of a column name (fixes #732) 2026-10-12 18:51:40 +02:00
Marco Arnulfo f3e05e0ad8 XLS import: read the calculation mode and precision as displayed (fixes #724)
CalcMode repeats in every worksheet substream like the iteration records and sets wb.calc.mode from the first worksheet; CalcPrecision sits in the globals and sets precision_as_displayed, matching calcMode and fullPrecision on the .xlsx side.
2026-10-12 18:47:53 +02:00
Marco Arnulfo a34f106e93 XLS: open compound files whose last sector isn't padded (fixes #730) 2026-10-12 18:44:23 +02:00
Marco Arnulfo dbfed89a36 XLS import: read the iterative calculation settings (part of #724)
CalcIter, CalcCount and CalcDelta repeat in every worksheet substream and were skipped, so a workbook saved with iterative calculation on opened with it off and its circular references showed #CIRC!. They now set wb.calc from the first worksheet, as <calcPr iterate iterateCount iterateDelta> does for .xlsx.
2026-10-12 18:43:28 +02:00
Marco Arnulfo 3d0ed97d71 XLS: a FORMAT record shorter than its character count keeps the characters it holds (fixes #731) 2026-10-12 18:41:45 +02:00
Marco Arnulfo 0dc76090d7 functions: MODE skips typed text and logical arguments (fixes #736) 2026-10-12 18:38:01 +02:00
Marco Arnulfo 9e28655a8a ROMAN: forms 2 and 3 subtract IC, XM and VM like Excel (fixes #733) 2026-10-12 18:37:51 +02:00
Marco Arnulfo e88d3d7583 EDATE and EOMONTH: serial 0 is day 0 and February 1900 has 28 days (fixes #734)
Excel's EDATE and EOMONTH read serial 0 as 0 January 1900 and end
February 1900 on the 28th (serial 59), although the sheet itself keeps
the Lotus 29 February 1900 (serial 60). GridCraft clamped day 0 up to
day 1 and used the sheet's 29-day February, so EDATE(0,0) was 1,
EDATE(0,1) 32, EDATE(31,1) and EOMONTH(59,0) 60.

EDATE now keeps day 0 and both functions take the real calendar's month
lengths. Serial 60 still reads as 29 February, so EDATE(60,1) stays
29 March. DATE, DAY and the parser keep the leap day.

Tests: the Excel 365 table from the issue; the #124 cases that expected
60 at the end of February 1900 now expect 59.
2026-10-12 18:36:51 +02:00
Marco Arnulfo 15b346e6ca macOS: register the Window menu as NSApp's windowsMenu, so the tiling shortcuts work (fixes #716) 2026-10-12 18:36:00 +02:00
Marco Arnulfo ea5db94fe3 Numfmt: a negative number that rounds to zero shows no minus sign (fixes #729) 2026-10-12 18:35:01 +02:00
Marco Arnulfo 1a49d18dd1 Comments pane: one Show Comments button, and the pane keeps its width (fixes #710) 2026-10-12 18:02:02 +02:00
Marco Arnulfo dfb780a544 UI: clicking a column or row header in point mode inserts N:N / n:n (#691) 2026-10-12 15:56:22 +02:00
Marco Arnulfo ef15e22815 Charts: a newly inserted chart is selected, so Delete removes it (#668, #256)
Only the Recommended Charts dialog selected the chart it inserted. The Insert
gallery buttons and Alt+F1 dropped the id insert.chart returns, so the selection
stayed on the source cells and Delete cleared the data instead of the chart.
SheetApp::run now selects the new chart whenever insert.chart succeeds, which
covers every caller.
2026-10-12 13:27:27 +02:00
Marco Arnulfo 2589f3f7d4 Data validation: hide the input message while the cell's list is open (#505)
The input message is a tooltip-order area just below the cell, and the in-cell
dropdown opens at the same spot, so the message covered the first items of the
list. It now stays hidden while the list picker is open on the active cell and
comes back when the list closes.
2026-10-12 13:17:09 +02:00