diff --git a/src/java/org/apache/poi/hssf/model/FormulaParser.java b/src/java/org/apache/poi/hssf/model/FormulaParser.java index e56a4c61ca..a021803b6c 100644 --- a/src/java/org/apache/poi/hssf/model/FormulaParser.java +++ b/src/java/org/apache/poi/hssf/model/FormulaParser.java @@ -210,7 +210,6 @@ public class FormulaParser { } } - /** Get an Identifier */ private String GetName() { StringBuffer Token = new StringBuffer(); @@ -225,6 +224,20 @@ public class FormulaParser { return Token.toString(); } + /**Get an Identifier AS IS, without stripping white spaces or + converting to uppercase; used for literals */ + private String GetNameAsIs() { + StringBuffer Token = new StringBuffer(); + if (!IsAlpha(Look)) { + Expected("Name"); + } + while (IsAlNum(Look) || IsWhite(Look)) { + Token = Token.append(Look); + GetChar(); + } + return Token.toString(); + } + /** Get a Number */ private String GetNum() { @@ -355,7 +368,7 @@ public class FormulaParser { private void StringLiteral() { Match('"'); - String name= GetName(); + String name= GetNameAsIs(); Match('"'); tokens.add(new StringPtg(name)); } diff --git a/src/java/org/apache/poi/hssf/record/formula/StringPtg.java b/src/java/org/apache/poi/hssf/record/formula/StringPtg.java index 30833c605a..2a5e5b764a 100644 --- a/src/java/org/apache/poi/hssf/record/formula/StringPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/StringPtg.java @@ -114,7 +114,7 @@ public class StringPtg public String toFormulaString(SheetReferences refs) { - return getValue(); + return "\""+getValue()+"\""; } public byte getDefaultOperandClass() { return Ptg.CLASS_VALUE; diff --git a/src/testcases/org/apache/poi/hssf/data/StringFormulas.xls b/src/testcases/org/apache/poi/hssf/data/StringFormulas.xls new file mode 100644 index 0000000000..ebf28b0793 Binary files /dev/null and b/src/testcases/org/apache/poi/hssf/data/StringFormulas.xls differ diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java b/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java index 447191b305..6ca51ddb5f 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java @@ -824,6 +824,40 @@ extends TestCase { out.close(); assertTrue("file exists",file.exists()); } + + public void testStringFormulas() + throws java.io.IOException + { + String readFilename = System.getProperty("HSSF.testdata.path"); + + File file = File.createTempFile("testStringFormula",".xls"); + FileOutputStream out = new FileOutputStream(file); + HSSFWorkbook wb = new HSSFWorkbook(); + HSSFSheet s = wb.createSheet("A"); + HSSFRow r = null; + HSSFCell c = null; + r = s.createRow((short)0); + c=r.createCell((short)1); c.setCellFormula("UPPER(\"abc\")"); + c=r.createCell((short)2); c.setCellFormula("LOWER(\"ABC\")"); + c=r.createCell((short)3); c.setCellFormula("CONCATENATE(\" my \",\" name \")"); + + wb.write(out); + out.close(); + + assertTrue("file exists",file.exists()); + + FileInputStream in = new FileInputStream(readFilename+File.separator+"StringFormulas.xls"); + wb = new HSSFWorkbook(in); + s = wb.getSheetAt(0); + r = s.getRow(0); + c = r.getCell((short)0); + assertTrue("expected: UPPER(\"xyz\") got "+c.getCellFormula(), ("UPPER(\"xyz\")").equals(c.getCellFormula())); + //c = r.getCell((short)1); + //assertTrue("expected: A!A1+A!B1 got: "+c.getCellFormula(), ("A!A1+A!B1").equals(c.getCellFormula())); + in.close(); + } + + public static void main(String [] args) { System.out .println("Testing org.apache.poi.hssf.usermodel.TestFormulas");