]> source.dussan.org Git - poi.git/commitdiff
Bug 60219: FormulaParser can't parse external references when sheet name is quoted
authorDominik Stadler <centic@apache.org>
Sat, 31 Dec 2016 16:53:16 +0000 (16:53 +0000)
committerDominik Stadler <centic@apache.org>
Sat, 31 Dec 2016 16:53:16 +0000 (16:53 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1776796 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/ss/formula/FormulaParser.java
src/ooxml/testcases/org/apache/poi/ss/formula/TestFormulaParser.java
src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java
src/testcases/org/apache/poi/hssf/model/TestWorkbook.java
src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java

index 6caf8e1eb70171f3cfad153163ce1da67aa128f9..745836ef73dbae84fd2517e4646f77b8b9bed2bd 100644 (file)
@@ -115,7 +115,7 @@ public final class FormulaParser {
      * Tracks whether the run of whitespace preceding "look" could be an
      * intersection operator.  See GetChar.
      */
-    private boolean _inIntersection = false;
+    private boolean _inIntersection;
 
     private final FormulaParsingWorkbook _book;
     private final SpreadsheetVersion _ssVersion;
@@ -133,7 +133,7 @@ public final class FormulaParser {
      * This class is recommended only for single threaded use.
      *
      * If you have a {@link org.apache.poi.hssf.usermodel.HSSFWorkbook}, and not a
-     *  {@link org.apache.poi.hssf.model.Workbook}, then use the convenience method on
+     *  {@link org.apache.poi.ss.usermodel.Workbook}, then use the convenience method on
      *  {@link org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator}
      */
     private FormulaParser(String formula, FormulaParsingWorkbook book, int sheetIndex, int rowIndex) {
@@ -298,7 +298,7 @@ public final class FormulaParser {
 
     /** Get a Number */
     private String GetNum() {
-        StringBuffer value = new StringBuffer();
+        StringBuilder value = new StringBuilder();
 
         while (IsDigit(this.look)){
             value.append(this.look);
@@ -670,7 +670,7 @@ public final class FormulaParser {
             GetChar();
         }
         // parse column quantifier
-        String startColumnName = null;
+        String startColumnName;
         String endColumnName = null;
         int nColQuantifiers = 0;
         int savePtr1 = _pointer;
@@ -1112,13 +1112,20 @@ public final class FormulaParser {
 
         @Override
         public String toString() {
-            StringBuilder sb = new StringBuilder(64);
-            sb.append(getClass().getName()).append(" [");
-            sb.append(_rep);
-            sb.append("]");
-            return sb.toString();
+            return getClass().getName() + " [" + _rep + "]";
         }
     }
+    
+    private String getBookName() {
+        StringBuilder sb = new StringBuilder();
+        GetChar();
+        while (look != ']') {
+            sb.append(look);
+            GetChar();
+        }
+        GetChar();
+        return sb.toString();
+    }
 
     /**
      * Note - caller should reset {@link #_pointer} upon <code>null</code> result
@@ -1127,22 +1134,18 @@ public final class FormulaParser {
     private SheetIdentifier parseSheetName() {
         String bookName;
         if (look == '[') {
-            StringBuilder sb = new StringBuilder();
-            GetChar();
-            while (look != ']') {
-                sb.append(look);
-                GetChar();
-            }
-            GetChar();
-            bookName = sb.toString();
+               bookName = getBookName();
         } else {
             bookName = null;
         }
 
         if (look == '\'') {
-            StringBuffer sb = new StringBuffer();
-
             Match('\'');
+            
+            if (look == '[')
+               bookName = getBookName();
+            
+            StringBuilder sb = new StringBuilder();
             boolean done = look == '\'';
             while(!done) {
                 sb.append(look);
@@ -1232,7 +1235,7 @@ public final class FormulaParser {
         boolean result = CellReference.classifyCellReference(str, _ssVersion) == NameType.CELL;
 
         if(result){
-            /**
+            /*
              * Check if the argument is a function. Certain names can be either a cell reference or a function name
              * depending on the contenxt. Compare the following examples in Excel 2007:
              * (a) LOG10(100) + 1
@@ -1323,7 +1326,7 @@ public final class FormulaParser {
      * Adds a name (named range or user defined function) to underlying workbook's names table
      * @param functionName
      */
-    private final void addName(String functionName) {
+    private void addName(String functionName) {
         final Name name = _book.createName();
         name.setFunction(true);
         name.setNameName(functionName);
@@ -1766,7 +1769,7 @@ public final class FormulaParser {
      * return Int or Number Ptg based on size of input
      */
     private static Ptg getNumberPtgFromString(String number1, String number2, String exponent) {
-        StringBuffer number = new StringBuffer();
+        StringBuilder number = new StringBuilder();
 
         if (number2 == null) {
             number.append(number1);
@@ -1808,7 +1811,7 @@ public final class FormulaParser {
     private String parseStringLiteral() {
         Match('"');
 
-        StringBuffer token = new StringBuffer();
+        StringBuilder token = new StringBuilder();
         while (true) {
             if (look == '"') {
                 GetChar();
@@ -1975,7 +1978,7 @@ public final class FormulaParser {
 
     //{--------------------------------------------------------------}
     //{ Parse and Translate an Assignment Statement }
-    /**
+    /*
 procedure Assignment;
 var Name: string[8];
 begin
index dfbbd4281cda522e6e78c4f749dfe65b1bf03669..421913fe7ccb51b97d3e8bb248189b2574893456 100644 (file)
@@ -33,7 +33,6 @@ import org.apache.poi.ss.formula.ptg.StringPtg;
 import org.apache.poi.xssf.XSSFTestDataSamples;
 import org.apache.poi.xssf.usermodel.XSSFEvaluationWorkbook;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -189,7 +188,6 @@ public class TestFormulaParser {
     }
     
     // bug 60219: FormulaParser can't parse external references when sheet name is quoted
-    @Ignore
     @Test
     public void testParseExternalReferencesWithQuotedSheetName() throws Exception {
         XSSFWorkbook wb = new XSSFWorkbook();
index 82153fe09e34ab27f422d332bc16f708a84422d6..a6cb2734300fd732d98436cdd2fdd187b4d82d20 100644 (file)
@@ -218,7 +218,7 @@ public final class TestFormulaParser {
         }
     }
     
-    private final static void assertEqualsIgnoreCase(String expected, String actual) {
+    private static void assertEqualsIgnoreCase(String expected, String actual) {
         assertEquals(expected.toLowerCase(Locale.ROOT), actual.toLowerCase(Locale.ROOT));
     }
 
@@ -414,7 +414,7 @@ public final class TestFormulaParser {
         HSSFSheet sheet = wb.createSheet("Test");
         HSSFRow row = sheet.createRow(0);
         HSSFCell cell = row.createCell(0);
-        String formula = null;
+        String formula;
 
         cell.setCellFormula("1.3E21/3");
         formula = cell.getCellFormula();
@@ -488,7 +488,7 @@ public final class TestFormulaParser {
         HSSFSheet sheet = wb.createSheet("Test");
         HSSFRow row = sheet.createRow(0);
         HSSFCell cell = row.createCell(0);
-        String formula = null;
+        String formula;
 
         // starts from decimal point
 
@@ -530,7 +530,7 @@ public final class TestFormulaParser {
         HSSFSheet sheet = wb.createSheet("Test");
         HSSFRow row = sheet.createRow(0);
         HSSFCell cell = row.createCell(0);
-        String formula = null;
+        String formula;
 
         cell.setCellFormula("A1.A2");
         formula = cell.getCellFormula();
@@ -557,7 +557,7 @@ public final class TestFormulaParser {
         HSSFSheet sheet = wb.createSheet("Test");
         HSSFRow row = sheet.createRow(0);
         HSSFCell cell = row.createCell(0);
-        String formula = null;
+        String formula;
 
         
         // References to a single cell:
@@ -718,8 +718,8 @@ public final class TestFormulaParser {
         assertEquals(65534.6, np.getValue(), 0);
     }
 
+    @Test
     public void testMissingArgs() {
-
         confirmTokenClasses("if(A1, ,C1)",
                 RefPtg.class,
                 AttrPtg.class, // tAttrIf
@@ -1327,8 +1327,7 @@ public final class TestFormulaParser {
     }
 
     /**
-     * TODO - delete equiv test:
-     * {@link BaseTestBugzillaIssues#test42448()}
+     * See the related/similar test: {@link BaseTestBugzillaIssues#bug42448()}
      */
     @Test
     public void testParseAbnormalSheetNamesAndRanges_bug42448() throws IOException {
@@ -1373,11 +1372,10 @@ public final class TestFormulaParser {
 
     @Test
     public void testUnionOfFullCollFullRowRef() throws IOException {
-        Ptg[] ptgs;
-        ptgs = parseFormula("3:4");
-        ptgs = parseFormula("$Z:$AC");
+        parseFormula("3:4");
+        Ptg[] ptgs = parseFormula("$Z:$AC");
         confirmTokenClasses(ptgs, AreaPtg.class);
-        ptgs = parseFormula("B:B");
+        parseFormula("B:B");
 
         ptgs = parseFormula("$11:$13");
         confirmTokenClasses(ptgs, AreaPtg.class);
index 6147358bccbebb9cf9a1573dbf98999b589b0c5e..558a5ec0ff5568be11bf6a13692edf08d5a5aceb 100644 (file)
@@ -115,7 +115,7 @@ public final class TestWorkbook {
             }
         };
 
-        /**
+        /*
          * register the two test UDFs in a UDF finder, to be passed to the evaluator
          */
         UDFFinder udff1 = new DefaultUDFFinder(new String[] { "myFunc", },
index 1308b2c1135d4d3c85f91b410e30dff8bcea6e00..862b6cec7d6aa87123637d143d6913e7c51ea1e2 100644 (file)
@@ -1836,17 +1836,26 @@ public final class TestBugs extends BaseTestBugzillaIssues {
        assertEquals("'[$http://gagravarr.org/FormulaRefs.xls]Sheet1'!B1", row.getCell(1).getCellFormula());
        assertEquals(112.0, row.getCell(1).getNumericCellValue(), 0);
 
+       // Link our new workbook
+       Workbook externalWb1 = new HSSFWorkbook();
+       externalWb1.createSheet("Sheet1");
+       wb1.linkExternalWorkbook("$http://gagravarr.org/FormulaRefs2.xls", externalWb1);
+       
        // Change 4
        row.getCell(1).setCellFormula("'[$http://gagravarr.org/FormulaRefs2.xls]Sheet1'!B2");
        row.getCell(1).setCellValue(123.0);
 
+       // Link our new workbook
+       Workbook externalWb2 = new HSSFWorkbook();
+       externalWb2.createSheet("Sheet1");
+       wb1.linkExternalWorkbook("$http://example.com/FormulaRefs.xls", externalWb2);
+       
        // Add 5
        row = s.createRow(5);
        row.createCell(1, CellType.FORMULA);
        row.getCell(1).setCellFormula("'[$http://example.com/FormulaRefs.xls]Sheet1'!B1");
        row.getCell(1).setCellValue(234.0);
 
-
        // Re-test
        HSSFWorkbook wb2 = writeOutAndReadBack(wb1);
        wb1.close();
@@ -1871,8 +1880,7 @@ public final class TestBugs extends BaseTestBugzillaIssues {
        assertEquals("[Formulas2.xls]Sheet1!B2", row.getCell(1).getCellFormula());
        assertEquals(112.0, row.getCell(1).getNumericCellValue(), 0);
 
-       // TODO - Fix these so they work...
-       /*row = s.getRow(4);
+       row = s.getRow(4);
        assertEquals(CellType.FORMULA, row.getCell(1).getCellTypeEnum());
        assertEquals("'[$http://gagravarr.org/FormulaRefs2.xls]Sheet1'!B2", row.getCell(1).getCellFormula());
        assertEquals(123.0, row.getCell(1).getNumericCellValue(), 0);
@@ -1880,7 +1888,7 @@ public final class TestBugs extends BaseTestBugzillaIssues {
        row = s.getRow(5);
        assertEquals(CellType.FORMULA, row.getCell(1).getCellTypeEnum());
        assertEquals("'[$http://example.com/FormulaRefs.xls]Sheet1'!B1", row.getCell(1).getCellFormula());
-       assertEquals(234.0, row.getCell(1).getNumericCellValue(), 0);*/
+       assertEquals(234.0, row.getCell(1).getNumericCellValue(), 0);
        
        wb2.close();
     }