在apache poi api中需要有关数组公式实现的帮助

时间:2013-07-02 10:10:48

标签: java apache-poi excel-formula

我分配了现有项目的更新。以前的开发人员使用jcom api将数据导出到Excel工作表。但jcom api不适用于64位系统。我决定改变代码并使用apache poi api。我设法做了很多方法。我的问题是数组公式。我需要使用apache poi实现数组公式。这些公式发布在下面,任何帮助都会更加明显。先谢谢你们。

公式:

String  formula1 = "SUM(R[-2]C/1.200)";//net income  calculation from gross income
String  formula2 = "SUM(R[-1]C-R[1]C)";
String  formula3 = "SUM(R[-" + Integer.toString(listTypeTotals.size()+1) + "]C:R[-2]C)";

我尝试将该单元格设置为公式,并将公式作为字符串传递。

setCellFormulaStyle(sheet, 4, i+2, formula2);

 public static void setCellFormulaStyle(HSSFSheet sheet,int row, int column,String value)
  {
    HSSFRow temprow = null;
    temprow =getRow_CreateRow(sheet, row);
    temprow.createCell(column).setCellFormula(value);
  }

public static HSSFRow getRow_CreateRow(HSSFSheet sheet,int row)
{
  HSSFRow excelrow=null;
  excelrow = sheet.getRow(row);
  if(excelrow==null)
  {
    excelrow =sheet.createRow(row);
    return excelrow;
  }else
  return excelrow;
}

我遇到了异常

org.apache.poi.ss.formula.FormulaParseException: Specified named range 'R' does not exist in the current workbook.
at org.apache.poi.ss.formula.FormulaParser.parseNonRange(FormulaParser.java:569)
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.hssf.model.HSSFFormulaParser.parse(HSSFFormulaParser.java:72)
at org.apache.poi.hssf.usermodel.HSSFCell.setCellFormula(HSSFCell.java:594)`

1 个答案:

答案 0 :(得分:2)

我不确定你是如何使用这个公式的。但是,如果您的问题是关于基于行和列的动态单元格引用,也许我可以帮助您。

对于任何单元格,在运行时说“B5”,

cell.getReference(); 

会给你单元格引用(比如示例......它会返回你“B5”

cell.getReference().toString().charAt(0); 

将为您提供列参考(如果当前单元格为B5,将为您提供“B”)。现在

cell.getRowIndex(); 

OR

 cell.getReference().toString().charAt(1);

会给你行索引。我已经多次使用它来更新/创建我的工作簿上的命名范围和公式。

较小的更改,包括AZ89

等处理地址

对于AZ99我们可以使用的情况,我们可以使用小型黑客,如:

String str = cell.getReference();
    for(index = 0;index<str.length();index++){
        if((int)str.charAt(index)<65){
            break;
        }
    }
    String Col = str.substring(0, index);
    String Row = str.substring(index+1, str.length());