]> source.dussan.org Git - poi.git/commitdiff
Patch from Marcel May from bug #51875 - More XSSF formula new-line support
authorNick Burch <nick@apache.org>
Mon, 5 Dec 2011 00:52:39 +0000 (00:52 +0000)
committerNick Burch <nick@apache.org>
Mon, 5 Dec 2011 00:52:39 +0000 (00:52 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1210299 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/ss/formula/FormulaParser.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
test-data/spreadsheet/NewlineInFormulas.xlsx

index ffee4df0d6f5e9cd65a99f6004d7d4c7a0763424..6db3227e446ef84fcc9619fa1d1e3a412fe82c28 100644 (file)
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="3.8-beta5" date="2011-??-??">
+           <action dev="poi-developers" type="fix">51875 - More XSSF new-line in formula support</action>
            <action dev="poi-developers" type="add">POIFS EntryUtils.copyNodes(POFS,POIFS) now uses FilteringDirectoryNode, so can exclude from copying nodes not just directly under the root</action>
            <action dev="poi-developers" type="add">POIFS Helper FilteringDirectoryNode, which wraps a DirectoryEntry and allows certain parts to be ignored</action>
            <action dev="poi-developers" type="fix">52209 - fixed inserting multiple pictures in XSLF </action>
index f9f3ca0c7717265ddbb526eadb6eee4edc68dbcb..3e2f07cc49786c42bf2b3545b4039e4b9967bc4d 100644 (file)
@@ -121,7 +121,9 @@ public final class FormulaParser {
 
        private ParseNode _rootNode;
 
-       private static char TAB = '\t';
+       private final static char TAB = '\t'; // HSSF + XSSF
+       private final static char CR = '\r';  // Normally just XSSF
+       private final static char LF = '\n';  // Normally just XSSF
 
        /**
         * Lookahead Character.
@@ -229,7 +231,7 @@ public final class FormulaParser {
 
        /** Recognize White Space */
        private static boolean IsWhite( char c) {
-               return  c ==' ' || c== TAB;
+               return  c ==' ' || c== TAB || c == CR || c == LF;
        }
 
        /** Skip Over Leading White Space */
index e5bec593baa8c28e74fcfe2fca15b95daff5693d..e9ba3c7bb1df222e2a1e46a78a70e7b28fe5b58e 100644 (file)
@@ -34,8 +34,6 @@ import org.apache.poi.ss.formula.udf.UDFFinder;
 import org.apache.poi.xssf.model.IndexedUDFFinder;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDefinedName;
 
-import java.util.HashMap;
-
 /**
  * Internal POI use only
  *
@@ -147,26 +145,12 @@ public final class XSSFEvaluationWorkbook implements FormulaRenderingWorkbook, E
        public Ptg[] getFormulaTokens(EvaluationCell evalCell) {
                XSSFCell cell = ((XSSFEvaluationCell)evalCell).getXSSFCell();
                XSSFEvaluationWorkbook frBook = XSSFEvaluationWorkbook.create(_uBook);
-               String formulaText = cleanXSSFFormulaText(cell.getCellFormula());
-               return FormulaParser.parse(formulaText, frBook, FormulaType.CELL, _uBook.getSheetIndex(cell.getSheet()));
+               return FormulaParser.parse(cell.getCellFormula(), frBook, FormulaType.CELL, _uBook.getSheetIndex(cell.getSheet()));
        }
 
     public UDFFinder getUDFFinder(){
         return _uBook.getUDFFinder();
     }
-    
-   /**
-    * XSSF allows certain extra textual characters in the formula that
-    *  HSSF does not. As these can't be composed down to HSSF-compatible
-    *  Ptgs, this method strips them out for us.
-    */
-   private String cleanXSSFFormulaText(String text) {
-      // Newlines are allowed in XSSF
-      text = text.replaceAll("\\n", "").replaceAll("\\r", "");
-      
-      // All done with cleaning
-      return text;
-   }
 
        private static final class Name implements EvaluationName {
 
index 4467dc46a4e115add28de058d888fc7060de76f8..d163221d529b701d9d6d4fb3aa8e308bbad85acd 100644 (file)
@@ -623,7 +623,7 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
     /**
      * Newlines are valid characters in a formula
      */
-    public void test50440() throws Exception {
+    public void test50440And51875() throws Exception {
        Workbook wb = XSSFTestDataSamples.openSampleWorkbook("NewlineInFormulas.xlsx");
        Sheet s = wb.getSheetAt(0);
        Cell c = s.getRow(0).getCell(0);
@@ -636,6 +636,12 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
        
        assertEquals("SUM(\n1,2\n)", c.getCellFormula());
        assertEquals(3.0, c.getNumericCellValue());
+
+       // For 51875
+       Cell b3 = s.getRow(2).getCell(1);
+       formulaEvaluator.evaluateFormulaCell(b3);
+       assertEquals("B1+B2", b3.getCellFormula()); // The newline is lost for shared formulas
+       assertEquals(3.0, b3.getNumericCellValue());
     }
     
     /**
index 6a3ac949e9f0416d9986f3e0a5c5c18fb13ada42..18dec0aa5cd20672223456f1a6c0dc62a2579a19 100644 (file)
Binary files a/test-data/spreadsheet/NewlineInFormulas.xlsx and b/test-data/spreadsheet/NewlineInFormulas.xlsx differ