From 005810640deb3499a03bbec0cddbacc178bdb2d5 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Mon, 18 Oct 2021 17:15:04 +0000 Subject: [PATCH] [bug-65638] Remove escaping of ampersand from headers and footers created by Excel. Thanks to Viru. git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1894357 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/xssf/usermodel/TestXSSFSheet.java | 14 ++++++++++++++ .../extensions/TestXSSFHeaderFooter.java | 2 +- .../poi/hssf/usermodel/HeaderFooter.java | 11 +++++++---- .../hssf/usermodel/TestHSSFHeaderFooter.java | 16 +++++++++++++++- poi/src/test/java9/module-info.class | Bin 4198 -> 4145 bytes test-data/spreadsheet/AmpersandHeader.xls | Bin 0 -> 25600 bytes test-data/spreadsheet/AmpersandHeader.xlsx | Bin 0 -> 9480 bytes 7 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 test-data/spreadsheet/AmpersandHeader.xls create mode 100644 test-data/spreadsheet/AmpersandHeader.xlsx diff --git a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFSheet.java b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFSheet.java index 5c6f1670f1..d73ed34dfb 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFSheet.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFSheet.java @@ -178,6 +178,20 @@ public final class TestXSSFSheet extends BaseTestXSheet { } } + @Test + void testHeaderWithAmpersand() throws IOException { + try (XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("AmpersandHeader.xlsx")) { + XSSFSheet s = wb.getSheetAt(0); + XSSFOddHeader hdr = (XSSFOddHeader) s.getHeader(); + assertEquals("one && two &&&&", hdr.getCenter()); + hdr.setAreFieldsStripped(true); + + // In Excel headers fields start with '&' + // For '&' to appear as text it needs to be escaped as '&&' + assertEquals("one & two &&", hdr.getCenter()); + } + } + @Test void getAllHeadersFooters() throws IOException { try (XSSFWorkbook workbook = new XSSFWorkbook()) { diff --git a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/extensions/TestXSSFHeaderFooter.java b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/extensions/TestXSSFHeaderFooter.java index 6238a41713..f5c1054849 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/extensions/TestXSSFHeaderFooter.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/extensions/TestXSSFHeaderFooter.java @@ -132,7 +132,7 @@ class TestXSSFHeaderFooter { assertEquals(simple, XSSFOddHeader.stripFields(withPage)); assertEquals(simple, XSSFOddHeader.stripFields(withLots)); assertEquals(simple, XSSFOddHeader.stripFields(withFont)); - assertEquals(simple + "&&", XSSFOddHeader.stripFields(withOtherAnds)); + assertEquals(simple + "&", XSSFOddHeader.stripFields(withOtherAnds)); assertEquals(simple + "&a&b", XSSFOddHeader.stripFields(withOtherAnds2)); // Now test the default strip flag diff --git a/poi/src/main/java/org/apache/poi/hssf/usermodel/HeaderFooter.java b/poi/src/main/java/org/apache/poi/hssf/usermodel/HeaderFooter.java index 9d369ad378..aa883dd44e 100644 --- a/poi/src/main/java/org/apache/poi/hssf/usermodel/HeaderFooter.java +++ b/poi/src/main/java/org/apache/poi/hssf/usermodel/HeaderFooter.java @@ -298,10 +298,13 @@ public abstract class HeaderFooter implements org.apache.poi.ss.usermodel.Header // Now do the tricky, dynamic ones // These are things like font sizes, font names and colours - text = text.replaceAll("\\&\\d+", ""); - text = text.replaceAll("\\&\".*?,.*?\"", ""); - text = text.replaceAll("\\&K[\\dA-F]{6}", ""); - text = text.replaceAll("\\&K[\\d]{2}[+][\\d]{3}", ""); + text = text.replaceAll("&\\d+", ""); + text = text.replaceAll("&\".*?,.*?\"", ""); + text = text.replaceAll("&K[\\dA-F]{6}", ""); + text = text.replaceAll("&K[\\d]{2}[+][\\d]{3}", ""); + + text = text.replaceAll("&&", "&"); + // All done return text; diff --git a/poi/src/test/java/org/apache/poi/hssf/usermodel/TestHSSFHeaderFooter.java b/poi/src/test/java/org/apache/poi/hssf/usermodel/TestHSSFHeaderFooter.java index 22ee32af31..b703390585 100644 --- a/poi/src/test/java/org/apache/poi/hssf/usermodel/TestHSSFHeaderFooter.java +++ b/poi/src/test/java/org/apache/poi/hssf/usermodel/TestHSSFHeaderFooter.java @@ -69,7 +69,7 @@ final class TestHSSFHeaderFooter { assertEquals(simple, HSSFHeader.stripFields(withPage)); assertEquals(simple, HSSFHeader.stripFields(withLots)); assertEquals(simple, HSSFHeader.stripFields(withFont)); - assertEquals(simple + "&&", HSSFHeader.stripFields(withOtherAnds)); + assertEquals(simple + "&", HSSFHeader.stripFields(withOtherAnds)); assertEquals(simple + "&a&b", HSSFHeader.stripFields(withOtherAnds2)); // Now test the default strip flag @@ -192,4 +192,18 @@ final class TestHSSFHeaderFooter { assertEquals("bar", footer2.getCenter()); } } + + @Test + void testHeaderWithAmpersand() throws IOException { + try (HSSFWorkbook wb = openSampleWorkbook("AmpersandHeader.xls")) { + HSSFSheet s = wb.getSheetAt(0); + HSSFHeader h = s.getHeader(); + String header = h.getCenter(); + assertEquals("one && two &&&&", header); + + // In Excel headers fields start with '&' + // For '&' to appear as text it needs to be escaped as '&&' + assertEquals("one & two &&", HSSFHeader.stripFields(header)); + } + } } diff --git a/poi/src/test/java9/module-info.class b/poi/src/test/java9/module-info.class index 438e778ab515b0d480b1fb79ccaffeeafa4e55c6..028b943d0ae7577c19f08d4b20ce352134f4f685 100644 GIT binary patch literal 4145 zcmai1`Fj*a5PgH_iXbRkf)@fR9w<9RgZF``2r7z1#ak!4lg%W%Gvmx`LOk)l@B6;* z`}Xq({{a6eKkL=*Cd2Fy^L=?Q(_P(NU9Y;j^UuG3{S9Cf{;c3G2ZxMAouuw>4O+f~ z!`e}!)ABb2;aF6g@TNQm2ko$?D!eL29aM&fY8z`q8>^^S(Wt_&Vyud$+MQ7w8m00%V!_>lM34$HK}Rqpm=^32%n0rg+$*?G zaKGRI!GnUmf`zBx!?=Imx8YZUkknwd@J}) z@O>3O2!5>KrwV?q;Fk)1t>Cu`ey`vU2a9u2bg(>1nl&%>>f?SbjspHVSj6DgM!i&n zzB*@6kJ{}hOl$S1)$;3EpnnfLII`5D;ny7;+8@#Ovhgz=EE$QtB=xrh*@&O*JF*ou zn?cyDDGyJmrMb{+?0+`=bTW%#2g@cJleJEmcH%fnGQXiKg??5Woyq*sPNOm7;0QW3 z(Fuc0F%B|6(Ov4+%-Mb0)g`Z;I#{Yh+-@jb3j^oKHMrf)bVD-O?sif?(b)Q$OzTQV z&RMu)QJCqHjDCKmMq{k&V!qMelOVQ=xt!{2qY5%m}YE6dGbXYQL z%2`(yXVq4>;ZHd@uB^wO^24mR{p0s*kc(06|Bc*6r`?`O{CbqA!~@%)L%D4pRW@PI zqod3E`V$w`8t25_PS_3NQ!>gWQ+yvZ5) zQ(no%Q81vVlf3TcS#7Kn+STl!n9I4z`bH&HEoT*H`gEFS;~idCCDG35Q{uyH?_BX1 zNU7BAmJYr?@>NBhV~1PU+iTiu=_9UqC63Ht)9n_iEsH@MNK%XouN4~-7{E@28ybK^#zY-bKJeWe~<4>qN$+aYneE`V9f3HUlHzZ)p|6FCg;pI6wO;X z^O2U$IWiti&)FACP5(e{=gHdThw1~pC{8=)@(wQuXWiavj}Wa7Lj^awrGD1$Z6hOF z`@YYPDTbx*iarI~Uc8S(djUuP1?c`Pzykea0S>@IVBvBcXw6G-&|aW|gY9dP;UR{L z4VNe$ilvGbEHgaJ@NmWDs45DMFx-L_%D_s)BMpx-JlgOW!($Cs86Ic2+Hj5GTEpWF zPcS^uaGl{vh9?`IVtA_Idc)HUPdD6PSTl4DHyREZo?&>V;jrN*!?O&}Hay4hT*LDW z&o{il@Iu3j3@cUbB2z2!njTXxep4|r zH6v3sGIb+UIWn~)Q#~^EBU3>#H6&9-a(^e(liyU7OijsDl}ug9RF+I_$yAq2eaTdq zOpVD@nM|F@RGLh!$yA$6y~$LZOwGxgdraN=P36hdo=o-0)St`@ATtNZ%mOm=fXqxF zGZ)Cr1~T)3%#0v2C&z9K&^xMIm F{{h);L3;oI literal 4198 zcmai1X`9qU5UxgGT}4L4TQW)SOm;I#OfoZ!=ZdI!-}i-h zE8aIB`~m(bAFC>vnd~I9?8CnAcDlN|y58#Q=HLI${R04d;9MU}6ELUhSv5!Pu-#El z!0e(|3rsa+J4(R9RF^hp)C~bMN7%XmeF7GHL0L0=!>lOH_iXwtz$^i?$W$vCAx<%~ ze?Z%*?JB@r0qausrdO?cZm5}_<0vz-@$Z2G%ongc*T_<40Tv3F*BVzfqRQ?9EEX`g z=o>+(2JNV*q5{atQ#f9^Y`bL*d0-6P*`=XF{RLQt1KG{Qpa3gcUn~`lN1k7RRRR`_ zS>syG4Qsyd1(C7}um+uQRiu@gkt)?Jt0|zbU+c$z`wFmLz!LI*tmfJgqHjkkz!2F2 zX6(`S(!!e(|0bK@7K~~rVT*wIIDsBVRmX@*xHz6P^-YhXAmNfYsM#*P7ODW%Q;vj7 z1#Fo-XEMHHq>p-Tgv;-UMNQ9VS)&s4*y;3lbvz0TGx7on{Q?SI3sn3NhwT=yCZ|JB zjos73q@f&V-1Qo+gv)cL4{7>+0+w}8j~%+D>JqLLur{w#)s-71k-1vH#-28*2wp2d zJHMT7)vDEIpiD2YBwUxXF>)@o_v;0$$eT9t?x28`dEKoQZpi9dp%vnO-6)p>RW>4p zx*qD`Ok!$cFmDpDzV~XnSuui0!iazkQ(5t;mT+q}FVn7>m~9enJI`D}(~mp}#i_UH z+jTFBjFO`y+|gs3DJhTkn5}K1SCr$c0E2dSHtBg2waCU(b+3R`U6H`kIvTdm=KWdu z5(CpS!;htnN_M(5#5Q~i$9p-&$8Z$47&gO5RV7rjDHG3=Ho^-kKj>A%3_R5A zp1E~N zE+5G?NY#YLvNa87u&ccE6SBx!GcHV5qNlTA3q!mV0=#A=Je#dk zNpH3g|yq-6Xc*PpgQr$l{}lZ&Aq7pPCN z2MRYueY%O4Yr}BHC48E_TjSB6WqoY;od<)2FS1ENm%fhAJ{#X^U&Ylgc?tQB5m7eb zbB~{W628e+zw`~kRlN_s%U-;A8aja(QBmL(D~7KQ2VUK_RL}?C3)t3m2HNLKKiGP; zbnJf=u)WKk;?#OS=|?e{N}e~~8S%4#9o-|+UKJhmq*(D9ogu$w>tL%e9HO&*M7iiZ zx&M21@{ao>hV8buFvQQVW*_`1pufwX_@Zj>VYpZvYVD&v?C)%#T0Y@px@!27JevRz z_`inuXBu39e@uhvFauz^gqi$#E?hVPFdOD@YaZhQ#zl+;#3is4aW*VxT*hVa7)pA7`9k zJi&O9@fpTbjL$Q^$oMkjtBkKRzRCDD~*GmM`j3iuMfPB>PCzK|xw zTN5T-s7=ZclQzVp4smNH(uvxn6ftQni7+$#H1@RDN9V+5+6&rl(3aBX-xf4smF{w^Wx)YP~#H2m(M8YQ$KAAA(0QH|rnDT(ylnKO?3&fNS#FP)jlo7;~ v6U3Ai#FQ7rlo`a78^os*K9lea_!iE>5AYNGg4N(G+Wdws0e@gyz+e9ZM%i|U diff --git a/test-data/spreadsheet/AmpersandHeader.xls b/test-data/spreadsheet/AmpersandHeader.xls new file mode 100644 index 0000000000000000000000000000000000000000..635ea0e2f4088982bef9618f6f26e5bcd80e3974 GIT binary patch literal 25600 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 literal 0 HcmV?d00001 diff --git a/test-data/spreadsheet/AmpersandHeader.xlsx b/test-data/spreadsheet/AmpersandHeader.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b305f31259167362d5b487864e147ca28ce85f6e GIT binary patch literal 9480 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 Nz!5=+0Gc0H{|_So2C@JE literal 0 HcmV?d00001