]> source.dussan.org Git - poi.git/commitdiff
Fixed parsing formulas containing defined names beginning with an underscore, see...
authorYegor Kozlov <yegor@apache.org>
Mon, 26 Jul 2010 15:52:57 +0000 (15:52 +0000)
committerYegor Kozlov <yegor@apache.org>
Mon, 26 Jul 2010 15:52:57 +0000 (15:52 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@979329 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/ss/formula/FormulaParser.java
src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java

index d6fe9299e59a8d015d70dcb7e9eb738d92142cfa..043a23cd07513c76e12a0021f70dc3e7a612dbd4 100644 (file)
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="3.7-beta2" date="2010-??-??">
+           <action dev="POI-DEVELOPERS" type="add">49640 - Fixed parsing formulas containing defined names beginning with an underscore</action>
            <action dev="POI-DEVELOPERS" type="add">49538 - Added implementation for POISSON()</action>
            <action dev="POI-DEVELOPERS" type="add">49524 - Support for setting cell text to be vertically rotated, via style.setRotation(0xff)</action>
            <action dev="POI-DEVELOPERS" type="fix">49609 - Case insensitive matching of OOXML part names</action>
index 9e63e6f4b992a8a9b53d5ed7ca8e1f5375691211..44c87364368746e83c359ddb6d86b85f64929e86 100644 (file)
@@ -52,6 +52,7 @@ import org.apache.poi.ss.util.CellReference.NameType;
  *  @author Peter M. Murray (pete at quantrix dot com)
  *  @author Pavel Krupets (pkrupets at palmtreebusiness dot com)
  *  @author Josh Micich
+ *  @author David Lewis (DLewis400 at gmail dot com)
  */
 public final class FormulaParser {
        private static final class Identifier {
@@ -537,7 +538,8 @@ public final class FormulaParser {
                // which will either be named ranges or functions
                StringBuilder sb = new StringBuilder();
 
-               if (!Character.isLetter(look)) {
+               // defined names may begin with a letter or underscore
+               if (!Character.isLetter(look) && look != '_') {
                        throw expected("number, string, or defined name");
                }
                while (isValidDefinedNameChar(look)) {
index 3e2feaed021a3b7c3927e1fd76621bc6d674b3e9..4e2bb2302ab192b2e49f907877c2f68ba243efa6 100644 (file)
@@ -31,6 +31,9 @@ import org.apache.poi.hssf.record.formula.NamePtg;
 import org.apache.poi.hssf.util.CellReference;
 import org.apache.poi.util.TempFile;
 import org.apache.poi.ss.formula.FormulaType;
+import org.apache.poi.ss.usermodel.Name;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Cell;
 
 /**
  * @author Andrew C. Oliver (acoliver at apache dot org)
@@ -935,4 +938,24 @@ public final class TestFormulas extends TestCase {
         assertEquals(5.0, evaluator.evaluate(sh2.getRow(0).getCell(1)).getNumberValue(), 0.0);
         assertEquals(15.0, evaluator.evaluate(sh2.getRow(0).getCell(2)).getNumberValue(), 0.0);
     }
+
+    /**
+     * Verify that FormulaParser handles defined names beginning with underscores,
+     * see Bug #49640
+     */
+    public void testFormulasWithUnderscore(){
+        HSSFWorkbook wb = new HSSFWorkbook();
+        Name nm1 = wb.createName();
+        nm1.setNameName("_score1");
+        nm1.setRefersToFormula("A1");
+
+        Name nm2 = wb.createName();
+        nm2.setNameName("_score2");
+        nm2.setRefersToFormula("A2");
+
+        Sheet sheet = wb.createSheet();
+        Cell cell = sheet.createRow(0).createCell(2);
+        cell.setCellFormula("_score1*SUM(_score1+_score2)");
+        assertEquals("_score1*SUM(_score1+_score2)", cell.getCellFormula());
+    }
 }