]> source.dussan.org Git - poi.git/commitdiff
[bug-65638] Remove escaping of ampersand from headers and footers created by Excel...
authorPJ Fanning <fanningpj@apache.org>
Mon, 18 Oct 2021 17:15:04 +0000 (17:15 +0000)
committerPJ Fanning <fanningpj@apache.org>
Mon, 18 Oct 2021 17:15:04 +0000 (17:15 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1894357 13f79535-47bb-0310-9956-ffa450edef68

poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFSheet.java
poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/extensions/TestXSSFHeaderFooter.java
poi/src/main/java/org/apache/poi/hssf/usermodel/HeaderFooter.java
poi/src/test/java/org/apache/poi/hssf/usermodel/TestHSSFHeaderFooter.java
poi/src/test/java9/module-info.class
test-data/spreadsheet/AmpersandHeader.xls [new file with mode: 0644]
test-data/spreadsheet/AmpersandHeader.xlsx [new file with mode: 0644]

index 5c6f1670f1dd40ffa48df2cb741cbcc31eae68d0..d73ed34dfbe6f6889f544cdeeaba2588e3fd8c01 100644 (file)
@@ -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()) {
index 6238a4171346708d011b11866c5f5a80f7c8eeef..f5c1054849c620c7dc94800442ccec9b8c7201f5 100644 (file)
@@ -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
index 9d369ad3780d103fbb93f8e416fda1125969d33b..aa883dd44e249642050298ad591239f656778c5b 100644 (file)
@@ -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;
index 22ee32af31aa0680eee9fc18a6efbe11255ae979..b703390585f35ae24047ba25d27ac983702337d4 100644 (file)
@@ -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));
+        }
+    }
 }
index 438e778ab515b0d480b1fb79ccaffeeafa4e55c6..028b943d0ae7577c19f08d4b20ce352134f4f685 100644 (file)
Binary files a/poi/src/test/java9/module-info.class and b/poi/src/test/java9/module-info.class differ
diff --git a/test-data/spreadsheet/AmpersandHeader.xls b/test-data/spreadsheet/AmpersandHeader.xls
new file mode 100644 (file)
index 0000000..635ea0e
Binary files /dev/null and b/test-data/spreadsheet/AmpersandHeader.xls differ
diff --git a/test-data/spreadsheet/AmpersandHeader.xlsx b/test-data/spreadsheet/AmpersandHeader.xlsx
new file mode 100644 (file)
index 0000000..b305f31
Binary files /dev/null and b/test-data/spreadsheet/AmpersandHeader.xlsx differ