https://issues.apache.org/bugzilla/show_bug.cgi?id=55413

            Bug ID: 55413
           Summary: XSSFCell.setCellFormula(String) Formula Parsing Error
           Product: POI
           Version: 3.9
          Hardware: PC
            Status: NEW
          Severity: normal
          Priority: P2
         Component: XSSF
          Assignee: dev@poi.apache.org
          Reporter: selli...@dig-inc.net

The formula comes from an .xlsm file, brought out via:

cell.getCellFormula();

The original formula in Excel is:
=IFERROR(IF([@Status]="C",ABS([@[Code: Lag]]),ABS([@[Code: Aging]])),"Data
Error")

The formula I get back is:

IFERROR(IF(DCASdata[[#This Row],[Status]]="C",ABS(DCASdata[[#This Row],[Code:
Lag]]),ABS(DCASdata[[#This Row],[Code: Aging]])),"Data Error")

Code:

In a loop.
...
XSSFCell testCell = testRow.createCell(i);
testCell.setCellType(2); // Formula Type (ENUM, I know, just testing)
testCell.setCellFormula(formula);
...


This formula is one among many which XSSFCell.setCellFormula(formula) chokes
on. The parser spits out this error:

Caused by: org.apache.poi.ss.formula.FormulaParseException: Parse error near
char 19 '[' in specified formula 'IFERROR(IF(DCASdata[[#This
Row],[Status]]="C",ABS(DCASdata[[#This Row],[Code: Lag]]),ABS(DCASdata[[#This
Row],[Code: Aging]])),"Data Error")'. Expected ',' or ')'
    at org.apache.poi.ss.formula.FormulaParser.expected(FormulaParser.java:219)
    at
org.apache.poi.ss.formula.FormulaParser.Arguments(FormulaParser.java:1056)
    at org.apache.poi.ss.formula.FormulaParser.function(FormulaParser.java:936)
    at
org.apache.poi.ss.formula.FormulaParser.parseNonRange(FormulaParser.java:558)
    at
org.apache.poi.ss.formula.FormulaParser.parseRangeable(FormulaParser.java:517)
    at
org.apache.poi.ss.formula.FormulaParser.parseRangeExpression(FormulaParser.java:268)
    at
org.apache.poi.ss.formula.FormulaParser.parseSimpleFactor(FormulaParser.java:1119)
    at
org.apache.poi.ss.formula.FormulaParser.percentFactor(FormulaParser.java:1079)
    at
org.apache.poi.ss.formula.FormulaParser.powerFactor(FormulaParser.java:1066)
    at org.apache.poi.ss.formula.FormulaParser.Term(FormulaParser.java:1426)
    at
org.apache.poi.ss.formula.FormulaParser.additiveExpression(FormulaParser.java:1526)
    at
org.apache.poi.ss.formula.FormulaParser.concatExpression(FormulaParser.java:1510)
    at
org.apache.poi.ss.formula.FormulaParser.comparisonExpression(FormulaParser.java:1467)
    at
org.apache.poi.ss.formula.FormulaParser.Arguments(FormulaParser.java:1051)
    at org.apache.poi.ss.formula.FormulaParser.function(FormulaParser.java:936)
    at
org.apache.poi.ss.formula.FormulaParser.parseNonRange(FormulaParser.java:558)
    at
org.apache.poi.ss.formula.FormulaParser.parseRangeable(FormulaParser.java:429)
    at
org.apache.poi.ss.formula.FormulaParser.parseRangeExpression(FormulaParser.java:268)
    at
org.apache.poi.ss.formula.FormulaParser.parseSimpleFactor(FormulaParser.java:1119)
    at
org.apache.poi.ss.formula.FormulaParser.percentFactor(FormulaParser.java:1079)
    at
org.apache.poi.ss.formula.FormulaParser.powerFactor(FormulaParser.java:1066)
    at org.apache.poi.ss.formula.FormulaParser.Term(FormulaParser.java:1426)
    at
org.apache.poi.ss.formula.FormulaParser.additiveExpression(FormulaParser.java:1526)
    at
org.apache.poi.ss.formula.FormulaParser.concatExpression(FormulaParser.java:1510)
    at
org.apache.poi.ss.formula.FormulaParser.comparisonExpression(FormulaParser.java:1467)
    at
org.apache.poi.ss.formula.FormulaParser.unionExpression(FormulaParser.java:1447)
    at org.apache.poi.ss.formula.FormulaParser.parse(FormulaParser.java:1568)
    at org.apache.poi.ss.formula.FormulaParser.parse(FormulaParser.java:176)
    at org.apache.poi.xssf.usermodel.XSSFCell.setFormula(XSSFCell.java:439)
    at org.apache.poi.xssf.usermodel.XSSFCell.setCellFormula(XSSFCell.java:419)

My workaround:

In a loop.
...
XSSFCell testCell = testRow.createCell(i);
testCell.setCellType(2); // Formula Type

CTCell c = testCell.getCTCell();
CTCellFormula x = c.getF();
x.setStringValue(formulas.get(new Integer(i))); // map of formulas
<col,formula>
c.setF(x);
...

And this works perfectly, no errors, and the formulas work perfectly when the
workbook is opened in Excel.

It seems to me that XSSFCell's setCellFormula(String) ought to behave as my
workaround does.

-- 
You are receiving this mail because:
You are the assignee for the bug.

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@poi.apache.org
For additional commands, e-mail: dev-h...@poi.apache.org

Reply via email to