Recalcular fórmulas na folha de cálculo, utilizando Apache POI
-
27-10-2019 - |
Pergunta
Eu estou tentando usar POI XSSF para avaliar algumas fórmulas do Excel. Os valores não têm de ser salvo, e eu pode ter que calcular muitas fórmulas, então eu estou tentando fazer tudo na mesma célula.
O problema é que o valor da célula parece ficar preso na primeira fórmula entrou mesmo depois de eu recalcular
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
XSSFCell formulaCell = row.createCell(6);
formulaCell.setCellFormula("Date(2011,10,6)");
CellValue cellValue = evaluator.evaluate(formulaCell);
System.out.println(cellValue.getNumberValue());
formulaCell.setCellFormula("Date(1911,3,4)");
cellValue = evaluator.evaluate(formulaCell);
System.out.println(cellValue.getNumberValue());
Isso gera 40.822,0 40822,0 (excel equivalente de 10/6/2011) as duas vezes, em vez de reavaliação para a nova fórmula.
Solução
Se você usar o formulaEvaluator mais de uma vez, você precisa esta linha entre usos, ou então ele usa o mesmo resultado cada vez.
formulaEvaluator.clearAllCachedResultValues()
Outras dicas
A célula caches FormulaEvaluator valores calculados para acelerar o processamento. Se você realizar atualizações celulares depois de criar o avaliador, então você precisa dizer a ele!
Veja a href="http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/FormulaEvaluator.html" rel="nofollow"> FormulaEvaluator documentação para obter mais detalhes. Para você caso, tente:
formulaCell.setCellFormula("Date(1911,3,4)");
evaluator.notifySetFormula(formulaCell);
cellValue = evaluator.evaluate(formulaCell);
System.out.println(cellValue.getNumberValue());
Você pode usar os seguintes passos para fazer seu trabalho. Estas são duas soluções a partir dos quais você pode fazer uso de qualquer função um. Ele avalia o livro completo assim que o que você formula utilização iria ficar avaliada. Espero que isso ajude.
1) evaluator.evaluateAll (); 2) XSSFFormulaEvaluator.evaluateAllFormulaCells (WB);