diff --git a/src/documentation/content/xdocs/changes.xml b/src/documentation/content/xdocs/changes.xml index 09fcd8574..c069267b7 100644 --- a/src/documentation/content/xdocs/changes.xml +++ b/src/documentation/content/xdocs/changes.xml @@ -37,6 +37,7 @@ + Support stripping XSSF header and footer fields (eg page number) out of header and footer text if required Add POIXMLPropertiesTextExtractor, which provides to the OOXML file formats a similar function to HPSF's HPSFPropertiesExtractor 45539 - Improve XWPFWordExtractor to extract headers and footers Improve how XWPF handles paragraph text diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 282ee631e..b9b02cc64 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + Support stripping XSSF header and footer fields (eg page number) out of header and footer text if required Add POIXMLPropertiesTextExtractor, which provides to the OOXML file formats a similar function to HPSF's HPSFPropertiesExtractor 45539 - Improve XWPFWordExtractor to extract headers and footers Improve how XWPF handles paragraph text diff --git a/src/java/org/apache/poi/hssf/usermodel/HeaderFooter.java b/src/java/org/apache/poi/hssf/usermodel/HeaderFooter.java index 499cda792..2f0aa8a07 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HeaderFooter.java +++ b/src/java/org/apache/poi/hssf/usermodel/HeaderFooter.java @@ -265,7 +265,7 @@ public abstract class HeaderFooter implements org.apache.poi.ss.usermodel.Header /** * Are fields currently being stripped from - * the text that this {@link HeaderStories} returns? + * the text that this {@link HeaderFooter} returns? * Default is false, but can be changed */ public boolean areFieldsStripped() { diff --git a/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Footer.java b/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Footer.java index de592a146..4a1bbfbb0 100644 --- a/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Footer.java +++ b/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Footer.java @@ -17,6 +17,13 @@ package org.apache.poi.ss.usermodel; +/** + * Common definition of a HSSF or XSSF page footer. + * For a list of all the different fields that can be + * placed into a footer, such as page number, + * bold, underline etc, see + * {@link org.apache.poi.hssf.usermodel.HeaderFooter}. + */ public interface Footer extends HeaderFooter { /** * Get the left side of the footer. diff --git a/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Header.java b/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Header.java index 9e864b573..e06345c9f 100644 --- a/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Header.java +++ b/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Header.java @@ -17,6 +17,13 @@ package org.apache.poi.ss.usermodel; +/** + * Common definition of a HSSF or XSSF page header. + * For a list of all the different fields that can be + * placed into a header, such as page number, + * bold, underline etc, see + * {@link org.apache.poi.hssf.usermodel.HeaderFooter}. + */ public interface Header extends HeaderFooter { /** * Get the left side of the header. diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFHeaderFooter.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFHeaderFooter.java index 8c79761e9..5a9e4cda0 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFHeaderFooter.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFHeaderFooter.java @@ -21,10 +21,20 @@ import org.apache.poi.ss.usermodel.HeaderFooter; import org.apache.poi.xssf.usermodel.helpers.HeaderFooterHelper; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTHeaderFooter; +/** + * Parent class of all XSSF headers and footers. + * + * For a list of all the different fields that can be + * placed into a header or footer, such as page number, + * bold, underline etc, see + * {@link org.apache.poi.hssf.usermodel.HeaderFooter}. + */ public abstract class XSSFHeaderFooter implements HeaderFooter { private HeaderFooterHelper helper; private CTHeaderFooter headerFooter; + private boolean stripFields = false; + public XSSFHeaderFooter(CTHeaderFooter headerFooter) { this.headerFooter = headerFooter; this.helper = new HeaderFooterHelper(); @@ -41,20 +51,53 @@ public abstract class XSSFHeaderFooter implements HeaderFooter { return value; } + + /** + * Are fields currently being stripped from + * the text that this {@link XSSFHeaderFooter} returns? + * Default is false, but can be changed + */ + public boolean areFieldsStripped() { + return stripFields; + } + /** + * Should fields (eg macros) be stripped from + * the text that this class returns? + * Default is not to strip. + * @param stripFields + */ + public void setAreFieldsStripped(boolean stripFields) { + this.stripFields = stripFields; + } + + public static String stripFields(String text) { + return org.apache.poi.hssf.usermodel.HeaderFooter.stripFields(text); + } + + public abstract String getText(); protected abstract void setText(String text); public String getCenter() { - return helper.getCenterSection(getText()); + String text = helper.getCenterSection(getText()); + if(stripFields) + return stripFields(text); + return text; } public String getLeft() { - return helper.getLeftSection(getText()); + String text = helper.getLeftSection(getText()); + if(stripFields) + return stripFields(text); + return text; } public String getRight() { - return helper.getRightSection(getText()); + String text = helper.getRightSection(getText()); + if(stripFields) + return stripFields(text); + return text; } public void setCenter(String newCenter) { @@ -68,5 +111,4 @@ public abstract class XSSFHeaderFooter implements HeaderFooter { public void setRight(String newRight) { setText(helper.setRightSection(getText(), newRight)); } - } diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFHeaderFooter.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFHeaderFooter.java index 52df16ab3..97e0218c1 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFHeaderFooter.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFHeaderFooter.java @@ -17,10 +17,47 @@ package org.apache.poi.xssf.usermodel; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTHeaderFooter; + import junit.framework.TestCase; public class TestXSSFHeaderFooter extends TestCase { - // So eclipse doesn't moan - public void testTODO() { + public void testStripFields() { + String simple = "I am a test header"; + String withPage = "I am a&P test header"; + String withLots = "I&A am&N a&P test&T header&U"; + String withFont = "I&22 am a&\"Arial,bold\" test header"; + String withOtherAnds = "I am a&P test header&&"; + String withOtherAnds2 = "I am a&P test header&a&b"; + + assertEquals(simple, XSSFOddHeader.stripFields(simple)); + assertEquals(simple, XSSFOddHeader.stripFields(withPage)); + assertEquals(simple, XSSFOddHeader.stripFields(withLots)); + assertEquals(simple, XSSFOddHeader.stripFields(withFont)); + assertEquals(simple + "&&", XSSFOddHeader.stripFields(withOtherAnds)); + assertEquals(simple + "&a&b", XSSFOddHeader.stripFields(withOtherAnds2)); + + // Now test the default strip flag + XSSFEvenHeader head = new XSSFEvenHeader(CTHeaderFooter.Factory.newInstance()); + head.setCenter("Center"); + head.setLeft("In the left"); + + assertEquals("In the left", head.getLeft()); + assertEquals("Center", head.getCenter()); + assertEquals("", head.getRight()); + + head.setLeft("Top &P&F&D Left"); + assertEquals("Top &P&F&D Left", head.getLeft()); + assertFalse(head.areFieldsStripped()); + + head.setAreFieldsStripped(true); + assertEquals("Top Left", head.getLeft()); + assertTrue(head.areFieldsStripped()); + + // Now even more complex + head.setCenter("HEADER TEXT &P&N&D&T&Z&F&F&A&G"); + assertEquals("HEADER TEXT &G", head.getCenter()); } + + // TODO Rest of tests }