diff options
author | Yegor Kozlov <yegor@apache.org> | 2010-07-26 15:52:57 +0000 |
---|---|---|
committer | Yegor Kozlov <yegor@apache.org> | 2010-07-26 15:52:57 +0000 |
commit | af0406cd100de823fb5de84ae9fa4d54edf46932 (patch) | |
tree | d60d6ce4cae42bccb6948415aea0bff46b48835a /src | |
parent | 145e221f877ebbde9e9f291702dcc046b17063d8 (diff) | |
download | poi-af0406cd100de823fb5de84ae9fa4d54edf46932.tar.gz poi-af0406cd100de823fb5de84ae9fa4d54edf46932.zip |
Fixed parsing formulas containing defined names beginning with an underscore, see Bug 9640
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@979329 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src')
-rw-r--r-- | src/documentation/content/xdocs/status.xml | 1 | ||||
-rw-r--r-- | src/java/org/apache/poi/ss/formula/FormulaParser.java | 4 | ||||
-rw-r--r-- | src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java | 23 |
3 files changed, 27 insertions, 1 deletions
diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index d6fe9299e5..043a23cd07 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -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> diff --git a/src/java/org/apache/poi/ss/formula/FormulaParser.java b/src/java/org/apache/poi/ss/formula/FormulaParser.java index 9e63e6f4b9..44c8736436 100644 --- a/src/java/org/apache/poi/ss/formula/FormulaParser.java +++ b/src/java/org/apache/poi/ss/formula/FormulaParser.java @@ -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)) { diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java b/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java index 3e2feaed02..4e2bb2302a 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java @@ -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()); + } } |