]> source.dussan.org Git - poi.git/commitdiff
fixed FormulaParser to correctly process defined names with underscore, see bugzilla...
authorYegor Kozlov <yegor@apache.org>
Thu, 12 Aug 2010 15:10:12 +0000 (15:10 +0000)
committerYegor Kozlov <yegor@apache.org>
Thu, 12 Aug 2010 15:10:12 +0000 (15:10 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@984823 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/model/TestFormulaParser.java

index 0b791f101b6355820edd3ac63a0e829c1f8cf00c..842b64b71861a16e581945f1fab442d45549a6c4 100644 (file)
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="3.7-beta3" date="2010-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">49725 - fixed FormulaParser to correctly process defined names with underscore</action>
            <action dev="POI-DEVELOPERS" type="add">48526 - added implementation for RANDBETWEEN()</action>
            <action dev="POI-DEVELOPERS" type="fix">49725 - avoid exception in OperandResolver.parseDouble when input is minus ("-")</action>
            <action dev="POI-DEVELOPERS" type="fix">49723 - fixed OperandResolver to correctly handle inputs with leading decimal place</action>
index 44c87364368746e83c359ddb6d86b85f64929e86..0f186e7449a43141481eea7028304663e6a88eea 100644 (file)
@@ -665,7 +665,7 @@ public final class FormulaParser {
                                hasDigits = true;
                        } else if (Character.isLetter(ch)) {
                                hasLetters = true;
-                       } else if (ch =='$') {
+                       } else if (ch =='$' || ch =='_') {
                                //
                        } else {
                                break;
index 72e055fe70a1192d9d42c2d8bcedede4e5c3bd69..aac3dd7d89aff4896878149721e06fddccc0a0ff 100644 (file)
@@ -271,7 +271,51 @@ public final class TestFormulaParser extends TestCase {
                cell.setCellFormula("Cash_Flow!A1");
        }
 
-       // bug 38396 : Formula with exponential numbers not parsed correctly.
+    /** bug 49725, defined names with underscore */
+    public void testNamesWithUnderscore() {
+        HSSFWorkbook wb = new HSSFWorkbook(); //or new XSSFWorkbook();
+        HSSFSheet sheet = wb.createSheet("NamesWithUnderscore");
+
+        HSSFName nm;
+
+        nm = wb.createName();
+        nm.setNameName("DA6_LEO_WBS_Number");
+        nm.setRefersToFormula("33");
+
+        nm = wb.createName();
+        nm.setNameName("DA6_LEO_WBS_Name");
+        nm.setRefersToFormula("33");
+
+        nm = wb.createName();
+        nm.setNameName("A1_");
+        nm.setRefersToFormula("22");
+
+        nm = wb.createName();
+        nm.setNameName("_A1");
+        nm.setRefersToFormula("11");
+
+        nm = wb.createName();
+        nm.setNameName("A_1");
+        nm.setRefersToFormula("44");
+
+        nm = wb.createName();
+        nm.setNameName("A_1_");
+        nm.setRefersToFormula("44");
+
+        HSSFRow row = sheet.createRow(0);
+        HSSFCell cell = row.createCell(0);
+
+        cell.setCellFormula("DA6_LEO_WBS_Number*2");
+        assertEquals("DA6_LEO_WBS_Number*2", cell.getCellFormula());
+
+        cell.setCellFormula("(A1_*_A1+A_1)/A_1_");
+        assertEquals("(A1_*_A1+A_1)/A_1_", cell.getCellFormula());
+
+        cell.setCellFormula("INDEX(DA6_LEO_WBS_Name,MATCH($A3,DA6_LEO_WBS_Number,0))");
+        assertEquals("INDEX(DA6_LEO_WBS_Name,MATCH($A3,DA6_LEO_WBS_Number,0))", cell.getCellFormula());
+    }
+
+    // bug 38396 : Formula with exponential numbers not parsed correctly.
        public void testExponentialParsing() {
                confirmTokenClasses("1.3E21/2",  NumberPtg.class, IntPtg.class, DividePtg.class);
                confirmTokenClasses("1322E21/2", NumberPtg.class, IntPtg.class, DividePtg.class);