From fd533c2aeb4af32ed4092e811570e06f514da2ee Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 1 Mar 2026 13:19:59 +0000 Subject: [PATCH 1/5] Initial plan From 2e4d1225a685b6bb55928453c4c90bc000d66890 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 1 Mar 2026 13:30:57 +0000 Subject: [PATCH 2/5] Fix multiple print areas for XLS by fixing OperandClassTransformer ptgClass handling Co-authored-by: tonyqus <772561+tonyqus@users.noreply.github.com> --- main/SS/Formula/OperandClassTransformer.cs | 14 ++++++++++-- .../main/SS/UserModel/BaseTestWorkbook.cs | 22 +++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/main/SS/Formula/OperandClassTransformer.cs b/main/SS/Formula/OperandClassTransformer.cs index ea0f6d2cd3..a51454a587 100644 --- a/main/SS/Formula/OperandClassTransformer.cs +++ b/main/SS/Formula/OperandClassTransformer.cs @@ -114,11 +114,21 @@ private void TransformNode(ParseNode node, byte desiredOperandClass, // Note - the tAttrSum token (node.getToken()) is a base // token so does not need to have its operand class set } - if (token is ValueOperatorPtg || token is ControlPtg - || token is MemFuncPtg + if (token is MemFuncPtg || token is MemAreaPtg || token is UnionPtg || token is IntersectionPtg) + { + // Reference-type operators: children preserve the desired operand class. + // This ensures that Area3DPtg tokens inside union/intersection expressions + // (e.g. multiple print areas) keep CLASS_REF when used in a named range context. + for (int i = 0; i < children.Length; i++) + { + TransformNode(children[i], desiredOperandClass, callerForceArrayFlag); + } + return; + } + if (token is ValueOperatorPtg || token is ControlPtg) { // Value Operator Ptgs and Control are base Tokens, so Token will be unchanged // but any child nodes are processed according To desiredOperandClass and callerForceArrayFlag diff --git a/testcases/main/SS/UserModel/BaseTestWorkbook.cs b/testcases/main/SS/UserModel/BaseTestWorkbook.cs index d0c5233776..97baad56d2 100644 --- a/testcases/main/SS/UserModel/BaseTestWorkbook.cs +++ b/testcases/main/SS/UserModel/BaseTestWorkbook.cs @@ -388,6 +388,28 @@ public void TestPrintArea() workbook.Close(); } + [Test] + public void TestMultiplePrintArea() + { + IWorkbook workbook = _testDataProvider.CreateWorkbook(); + ISheet sheet1 = workbook.CreateSheet("Sheet1"); + String sheetName1 = sheet1.SheetName; + + // Set multiple print areas with comma-delimited references + String reference = "$A$1:$C$5,$E$6:$F$9"; + workbook.SetPrintArea(0, reference); + String retrievedPrintArea = workbook.GetPrintArea(0); + ClassicAssert.IsNotNull(retrievedPrintArea, "Multiple print area should not be null"); + // Both areas should be present with the sheet name prefix + ClassicAssert.IsTrue(retrievedPrintArea.Contains("$A$1:$C$5"), "First area should be present"); + ClassicAssert.IsTrue(retrievedPrintArea.Contains("$E$6:$F$9"), "Second area should be present"); + ClassicAssert.IsTrue(retrievedPrintArea.Contains(sheetName1), "Sheet name should be present"); + + workbook.RemovePrintArea(0); + ClassicAssert.IsNull(workbook.GetPrintArea(0)); + workbook.Close(); + } + [Test] public void TestGetSetActiveSheet() { From 5f785fa737750ec06600f8075b7d1ab890a703c2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 1 Mar 2026 14:15:10 +0000 Subject: [PATCH 3/5] Add multiple_print_area_demo.xls sample file and verification test Co-authored-by: tonyqus <772561+tonyqus@users.noreply.github.com> --- testcases/main/HSSF/UserModel/TestHSSFName.cs | 16 ++++++++++++++++ .../spreadsheet/multiple_print_area_demo.xls | Bin 0 -> 5632 bytes 2 files changed, 16 insertions(+) create mode 100644 testcases/test-data/spreadsheet/multiple_print_area_demo.xls diff --git a/testcases/main/HSSF/UserModel/TestHSSFName.cs b/testcases/main/HSSF/UserModel/TestHSSFName.cs index b110121b9b..589026ce32 100644 --- a/testcases/main/HSSF/UserModel/TestHSSFName.cs +++ b/testcases/main/HSSF/UserModel/TestHSSFName.cs @@ -203,6 +203,22 @@ public void TestPrintAreaFileRead() ClassicAssert.AreEqual(reference, workbook.GetPrintArea(0)); } + /** + * Test that a file generated with multiple print areas (comma-delimited) can be read back + * and correctly reports both areas. The demo file was produced by the fixed NPOI code. + */ + [Test] + public void TestMultiplePrintAreaDemoFileRead() + { + HSSFWorkbook workbook = HSSFTestDataSamples.OpenSampleWorkbook("multiple_print_area_demo.xls"); + + String area = workbook.GetPrintArea(0); + ClassicAssert.IsNotNull(area, "Print area should not be null"); + ClassicAssert.IsTrue(area.Contains("$A$1:$C$5"), "First print area ($A$1:$C$5) should be present"); + ClassicAssert.IsTrue(area.Contains("$E$6:$F$9"), "Second print area ($E$6:$F$9) should be present"); + ClassicAssert.IsTrue(area.Contains("Sheet1"), "Sheet name should be present"); + } + [Test] [Obsolete] public void TestDeletedReference() diff --git a/testcases/test-data/spreadsheet/multiple_print_area_demo.xls b/testcases/test-data/spreadsheet/multiple_print_area_demo.xls new file mode 100644 index 0000000000000000000000000000000000000000..9d99a80aad08465dcfab2b3ceabdc1ca5de69883 GIT binary patch literal 5632 zcmeHLOK4nG7(RD0lZS0`^RlVYrqfB%&P=8?^PXu;lXO}af*=u5FfukIP^m;2>Ov44 zp9@hCblFXpy6^#27mBp5TvQZY2(Hqu-3SUQZO89B-@P}J$%B9*SaZUE{`>vseD^zZ z?m73KKi_@Zw|ep8;cKR)Oqn)wtI=iJo8nH>wdpk`1kBj2Mx((dUgL7N{D)>>-aLc9 z^CoIen-%z)d7h7Q$7P?1IR4LFw?4MHLmS#IcdNsrP_LPDX3>u0+%~MuoBB;C(C0Wd z@3k@dx~IRf<^L7o-n|K<596mtVBGT^uufPPjBUH+_M8FkS-!`)C%1b3cc5(#Y%h%4 zrU&N2@Ch(|uzuJ8Y!G%QY#(e0wjXvEY#4So>>k(w*a++(EDAdWi@`==W3X}9Vb~E^ z9F~A3VH2?rIQ>|WR;EDg)RvalR14=ccS*X+*LYgZ?pVtd5=(0jFG4)eyne+?_* zqwp2GF0KPFm}eQUJ-4#5T#NoY<)j_M8Ha0g+SV5k>A`wp1aE!R1GfIqwtk_WXgTZj zI19(W94(;-&m@n9W^KQ>Y#p<84{FDJW;s9ENE$2mYxHlt_%^o$O2o|7o;vgNKiDu5 z9>!g=i$P*2m|Um!4?u62*%dTgmToY;xT_0CAgf zytt#Seb(Pe9rM^(*h5tcB%}U_JQ%k)G3CM7(HO>4jn7u0kixda2Cc@MS;^=cB^h1U ze;QjCkE2;gBVVV*K{d(E%&ZCKu>Y~+13{ndYkE{GyT)6!ZzN-WYhXHpayiO4AF_@A z>Njj3=X%?$|5kC{b+i7rbKK#w3yMFV6PkzL{RTgt*dm_VBA(nL-nAkAPAF`8>unAC zzIwa${q?Z*1N9E;P2E^OSdTQGwC{n}@OJrx#~$p$htDoApHIJuFQS9L4;<^mL)ci} z%K_iEB!8{LZ<`luPYjtU^7$PN@iGEJ7f>j9gYOCzqEi$Q9`_ zB4jF-kf~TgreX=1iX~(!mXN7fLRN&V2w4%bB4kC#ijWl{CqhnyoCrA)aw6nJ$cc~_ zAumE+guDoO5%MDBMJR|+5TPJKL4<+`1rZ7&6h$bCP!ypkLQ#aG2t^S}B9ufZiBJ-u zBtl7qk_crH$|96SD2q@Qp)5kVQpC}CK0R4Udp_g&tmku{&wIY$`C`L7fOSv<D=jZfJ6WgDrZk6*^I znecfuFQFyuP>V;sS8VTBZGF+iaQ7t`|3W6^q%dBV)fwMA<`J~ut|1;G^=rIjBgEq* zue}`3aZM*;yhUq_<8O`e0NWblh+AWr_6;%4Uu!?U30h;Ejn)_wq~_R7`-F5rHb%(7 z%=32$h3s?iQ5z7)uC_1`M=cZq;&_GHfjCkk-pz%skEp=Wsf`L8mk<@WB7~^G!@Lj` zxGIIHzym%J=h(GJeIY9F&@V&+3QR22Mg_ixg{Z(}gNQTf+O$K63QRzRsK8W2hzd+fgs2b=5ETvuhzcmOqztKfTN#9Tt%);q}bMBe*;r0Au2Gr5~4ybKvZDDr8X)s^%9~&(L-FB zE>D2AjUQ3hlmkSC;{l=qzoNVgzn-qSFF;h74iFVic!;arHGIvG*JTxE14MqP|E6mFI}z$PpYkD@Syo;-04CQr3b!iDV&@=C*Q~h> S_^RX9+*z)+Suc?PR{0C9n%xZm literal 0 HcmV?d00001 From c89e1e66e3fd6a5d21e4a5f2aec7bdb7fac14550 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 1 Mar 2026 14:30:59 +0000 Subject: [PATCH 4/5] Add single_print_area_demo.xls sample file and verification test Co-authored-by: tonyqus <772561+tonyqus@users.noreply.github.com> --- testcases/main/HSSF/UserModel/TestHSSFName.cs | 14 ++++++++++++++ .../spreadsheet/single_print_area_demo.xls | Bin 0 -> 5632 bytes 2 files changed, 14 insertions(+) create mode 100644 testcases/test-data/spreadsheet/single_print_area_demo.xls diff --git a/testcases/main/HSSF/UserModel/TestHSSFName.cs b/testcases/main/HSSF/UserModel/TestHSSFName.cs index 589026ce32..3dca61f084 100644 --- a/testcases/main/HSSF/UserModel/TestHSSFName.cs +++ b/testcases/main/HSSF/UserModel/TestHSSFName.cs @@ -203,6 +203,20 @@ public void TestPrintAreaFileRead() ClassicAssert.AreEqual(reference, workbook.GetPrintArea(0)); } + /** + * Test that a file generated with a single print area can be read back + * and correctly reports that area. The demo file was produced by the fixed NPOI code. + */ + [Test] + public void TestSinglePrintAreaDemoFileRead() + { + HSSFWorkbook workbook = HSSFTestDataSamples.OpenSampleWorkbook("single_print_area_demo.xls"); + + String area = workbook.GetPrintArea(0); + ClassicAssert.IsNotNull(area, "Print area should not be null"); + ClassicAssert.AreEqual("Sheet1!$A$1:$D$8", area); + } + /** * Test that a file generated with multiple print areas (comma-delimited) can be read back * and correctly reports both areas. The demo file was produced by the fixed NPOI code. diff --git a/testcases/test-data/spreadsheet/single_print_area_demo.xls b/testcases/test-data/spreadsheet/single_print_area_demo.xls new file mode 100644 index 0000000000000000000000000000000000000000..5fa62e57472582b7ba6f7af8e00c4bae336ebb68 GIT binary patch literal 5632 zcmeHLOK4nG7(RD0lZR-9RTc#qqi@*f(3Ir9wu z&Y8G5WtQPr%nO{#TP}kp<^(@?-TK((2`#9rb*aH4P+u`;&4TU6*=<;xSM`}lsLy_E z-fCm?d0&5H&HpRHy?X;jAH`3P!MNw!VC}FD80&V*?KuM6vwV+pPi{5;cc88lwhP8> z(+zWB_ym|eu*0x4>>k(zECb8Jaxf2;hwZG_TVJak?U=>Zn7P_>rEL~t$Gv|IE8^qm zWxFnZ0-iU|GQRTM^77J3{GTZ&Y#&ZLT$@w&dLEH(tS3hB*2lHqUO%$6U#KN&&N$u9 z{IM@bN@&3|$)k}O+wLuUP1tKUu8z56IX~J+1}pb#w6DMXHn#*y%*?Jlb^7VQv0^wn zgr{PMBt{b>>5-9%>iA?bxE~*m?#C!&uLKd)J~p?s_;_QJI9|-yNMv;IkHn8(h-9;#9x6%Tsk!=%OIlRiuwNuWQ~3bu&}y=gm5Q%XQt@@| zr?7P~9gRZj`8q9jszGjgdQH&7{>P3F1p{`V=~J!j8gJFUk&OAhj^PN)S8>KU$u|C5 zP_ccS>ut04TgCa*&D!72afiz;EWvml);RnTR0Q$yE#m1d;;Aj-9UJ2BM53mr)>5bM zt+iU;SBqNTUu(18)Qt55wOIWL`yO}$Zh_moqW}=eueb)Cm-+R8#`@Z1&V%^-2mGUGYPfYK@pM<{({}OyB zKBX7oEAYR-zX(5yCG;u$Jp9k_@4}B_C4B?W)0e)|J?8VSD{Ys7(ZqB{c-~TB8BEs_{@BO6BaZNj7 zd_;4MZ`tM;Ppr)`_P9BQVc!tr_%*lV#%+#qG@4_~h#F%z>beDk>~Fair9Gw zPzw+HC zUR;~E2vK1yY)OTKA)>;e5K$o+A}TP`;Zr!{uFZLbsKD$;hziVugs8xbNQer|jfAMc zEJ=t8IO|!&Rpi>tiFIxEH!z11q5`uiAu4zwq5?B4)ls1kA}SPp#Fgpt$Y)#ftLd6@ zh^TNZL{#9Hlh16&47%pt5K&<&L{vELBd&JW@HInThgFyf5fx@bM1>O}qCzD^R5%$T zDx3oP0c-C(7Sl!iU#j` Date: Sun, 1 Mar 2026 14:38:17 +0000 Subject: [PATCH 5/5] Remove demo XLS files and their tests from PR Co-authored-by: tonyqus <772561+tonyqus@users.noreply.github.com> --- testcases/main/HSSF/UserModel/TestHSSFName.cs | 30 ------------------ .../spreadsheet/multiple_print_area_demo.xls | Bin 5632 -> 0 bytes .../spreadsheet/single_print_area_demo.xls | Bin 5632 -> 0 bytes 3 files changed, 30 deletions(-) delete mode 100644 testcases/test-data/spreadsheet/multiple_print_area_demo.xls delete mode 100644 testcases/test-data/spreadsheet/single_print_area_demo.xls diff --git a/testcases/main/HSSF/UserModel/TestHSSFName.cs b/testcases/main/HSSF/UserModel/TestHSSFName.cs index 3dca61f084..b110121b9b 100644 --- a/testcases/main/HSSF/UserModel/TestHSSFName.cs +++ b/testcases/main/HSSF/UserModel/TestHSSFName.cs @@ -203,36 +203,6 @@ public void TestPrintAreaFileRead() ClassicAssert.AreEqual(reference, workbook.GetPrintArea(0)); } - /** - * Test that a file generated with a single print area can be read back - * and correctly reports that area. The demo file was produced by the fixed NPOI code. - */ - [Test] - public void TestSinglePrintAreaDemoFileRead() - { - HSSFWorkbook workbook = HSSFTestDataSamples.OpenSampleWorkbook("single_print_area_demo.xls"); - - String area = workbook.GetPrintArea(0); - ClassicAssert.IsNotNull(area, "Print area should not be null"); - ClassicAssert.AreEqual("Sheet1!$A$1:$D$8", area); - } - - /** - * Test that a file generated with multiple print areas (comma-delimited) can be read back - * and correctly reports both areas. The demo file was produced by the fixed NPOI code. - */ - [Test] - public void TestMultiplePrintAreaDemoFileRead() - { - HSSFWorkbook workbook = HSSFTestDataSamples.OpenSampleWorkbook("multiple_print_area_demo.xls"); - - String area = workbook.GetPrintArea(0); - ClassicAssert.IsNotNull(area, "Print area should not be null"); - ClassicAssert.IsTrue(area.Contains("$A$1:$C$5"), "First print area ($A$1:$C$5) should be present"); - ClassicAssert.IsTrue(area.Contains("$E$6:$F$9"), "Second print area ($E$6:$F$9) should be present"); - ClassicAssert.IsTrue(area.Contains("Sheet1"), "Sheet name should be present"); - } - [Test] [Obsolete] public void TestDeletedReference() diff --git a/testcases/test-data/spreadsheet/multiple_print_area_demo.xls b/testcases/test-data/spreadsheet/multiple_print_area_demo.xls deleted file mode 100644 index 9d99a80aad08465dcfab2b3ceabdc1ca5de69883..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5632 zcmeHLOK4nG7(RD0lZS0`^RlVYrqfB%&P=8?^PXu;lXO}af*=u5FfukIP^m;2>Ov44 zp9@hCblFXpy6^#27mBp5TvQZY2(Hqu-3SUQZO89B-@P}J$%B9*SaZUE{`>vseD^zZ z?m73KKi_@Zw|ep8;cKR)Oqn)wtI=iJo8nH>wdpk`1kBj2Mx((dUgL7N{D)>>-aLc9 z^CoIen-%z)d7h7Q$7P?1IR4LFw?4MHLmS#IcdNsrP_LPDX3>u0+%~MuoBB;C(C0Wd z@3k@dx~IRf<^L7o-n|K<596mtVBGT^uufPPjBUH+_M8FkS-!`)C%1b3cc5(#Y%h%4 zrU&N2@Ch(|uzuJ8Y!G%QY#(e0wjXvEY#4So>>k(w*a++(EDAdWi@`==W3X}9Vb~E^ z9F~A3VH2?rIQ>|WR;EDg)RvalR14=ccS*X+*LYgZ?pVtd5=(0jFG4)eyne+?_* zqwp2GF0KPFm}eQUJ-4#5T#NoY<)j_M8Ha0g+SV5k>A`wp1aE!R1GfIqwtk_WXgTZj zI19(W94(;-&m@n9W^KQ>Y#p<84{FDJW;s9ENE$2mYxHlt_%^o$O2o|7o;vgNKiDu5 z9>!g=i$P*2m|Um!4?u62*%dTgmToY;xT_0CAgf zytt#Seb(Pe9rM^(*h5tcB%}U_JQ%k)G3CM7(HO>4jn7u0kixda2Cc@MS;^=cB^h1U ze;QjCkE2;gBVVV*K{d(E%&ZCKu>Y~+13{ndYkE{GyT)6!ZzN-WYhXHpayiO4AF_@A z>Njj3=X%?$|5kC{b+i7rbKK#w3yMFV6PkzL{RTgt*dm_VBA(nL-nAkAPAF`8>unAC zzIwa${q?Z*1N9E;P2E^OSdTQGwC{n}@OJrx#~$p$htDoApHIJuFQS9L4;<^mL)ci} z%K_iEB!8{LZ<`luPYjtU^7$PN@iGEJ7f>j9gYOCzqEi$Q9`_ zB4jF-kf~TgreX=1iX~(!mXN7fLRN&V2w4%bB4kC#ijWl{CqhnyoCrA)aw6nJ$cc~_ zAumE+guDoO5%MDBMJR|+5TPJKL4<+`1rZ7&6h$bCP!ypkLQ#aG2t^S}B9ufZiBJ-u zBtl7qk_crH$|96SD2q@Qp)5kVQpC}CK0R4Udp_g&tmku{&wIY$`C`L7fOSv<D=jZfJ6WgDrZk6*^I znecfuFQFyuP>V;sS8VTBZGF+iaQ7t`|3W6^q%dBV)fwMA<`J~ut|1;G^=rIjBgEq* zue}`3aZM*;yhUq_<8O`e0NWblh+AWr_6;%4Uu!?U30h;Ejn)_wq~_R7`-F5rHb%(7 z%=32$h3s?iQ5z7)uC_1`M=cZq;&_GHfjCkk-pz%skEp=Wsf`L8mk<@WB7~^G!@Lj` zxGIIHzym%J=h(GJeIY9F&@V&+3QR22Mg_ixg{Z(}gNQTf+O$K63QRzRsK8W2hzd+fgs2b=5ETvuhzcmOqztKfTN#9Tt%);q}bMBe*;r0Au2Gr5~4ybKvZDDr8X)s^%9~&(L-FB zE>D2AjUQ3hlmkSC;{l=qzoNVgzn-qSFF;h74iFVic!;arHGIvG*JTxE14MqP|E6mFI}z$PpYkD@Syo;-04CQr3b!iDV&@=C*Q~h> S_^RX9+*z)+Suc?PR{0C9n%xZm diff --git a/testcases/test-data/spreadsheet/single_print_area_demo.xls b/testcases/test-data/spreadsheet/single_print_area_demo.xls deleted file mode 100644 index 5fa62e57472582b7ba6f7af8e00c4bae336ebb68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5632 zcmeHLOK4nG7(RD0lZR-9RTc#qqi@*f(3Ir9wu z&Y8G5WtQPr%nO{#TP}kp<^(@?-TK((2`#9rb*aH4P+u`;&4TU6*=<;xSM`}lsLy_E z-fCm?d0&5H&HpRHy?X;jAH`3P!MNw!VC}FD80&V*?KuM6vwV+pPi{5;cc88lwhP8> z(+zWB_ym|eu*0x4>>k(zECb8Jaxf2;hwZG_TVJak?U=>Zn7P_>rEL~t$Gv|IE8^qm zWxFnZ0-iU|GQRTM^77J3{GTZ&Y#&ZLT$@w&dLEH(tS3hB*2lHqUO%$6U#KN&&N$u9 z{IM@bN@&3|$)k}O+wLuUP1tKUu8z56IX~J+1}pb#w6DMXHn#*y%*?Jlb^7VQv0^wn zgr{PMBt{b>>5-9%>iA?bxE~*m?#C!&uLKd)J~p?s_;_QJI9|-yNMv;IkHn8(h-9;#9x6%Tsk!=%OIlRiuwNuWQ~3bu&}y=gm5Q%XQt@@| zr?7P~9gRZj`8q9jszGjgdQH&7{>P3F1p{`V=~J!j8gJFUk&OAhj^PN)S8>KU$u|C5 zP_ccS>ut04TgCa*&D!72afiz;EWvml);RnTR0Q$yE#m1d;;Aj-9UJ2BM53mr)>5bM zt+iU;SBqNTUu(18)Qt55wOIWL`yO}$Zh_moqW}=eueb)Cm-+R8#`@Z1&V%^-2mGUGYPfYK@pM<{({}OyB zKBX7oEAYR-zX(5yCG;u$Jp9k_@4}B_C4B?W)0e)|J?8VSD{Ys7(ZqB{c-~TB8BEs_{@BO6BaZNj7 zd_;4MZ`tM;Ppr)`_P9BQVc!tr_%*lV#%+#qG@4_~h#F%z>beDk>~Fair9Gw zPzw+HC zUR;~E2vK1yY)OTKA)>;e5K$o+A}TP`;Zr!{uFZLbsKD$;hziVugs8xbNQer|jfAMc zEJ=t8IO|!&Rpi>tiFIxEH!z11q5`uiAu4zwq5?B4)ls1kA}SPp#Fgpt$Y)#ftLd6@ zh^TNZL{#9Hlh16&47%pt5K&<&L{vELBd&JW@HInThgFyf5fx@bM1>O}qCzD^R5%$T zDx3oP0c-C(7Sl!iU#j`