java POI XSSF FormulaEvaluator

У меня проблема, когда я сохраняю свой новый файл excel. Я хочу, чтобы при сохранении формула вычисляла сама себя, но на данный момент она просто возвращает строку в файле excel. Формула правильная. Я точно не знаю, как заставить FormulaEvaluator работать.

Здесь я ввожу свою формулу, которая возвращает строку:

dataRow1.createCell((short)5).setCellValue("=VLOOKUP(A"+rowCountVlookup+",'C:\\Users\\Admin\\Documents\\JCreator LE\\MyProjects\\WordCount\\classes\\[Pricing.xlsx]Sheet1'!$B$3:$E$41,4, FALSE)*E"+rowCountVlookup+"");

Любая помощь приветствуется.


person The Gav Lad    schedule 06.06.2012    source источник


Ответы (2)


Я использую этот код для оценки формулы

//I use an instance of the workbook for the Excel workbook I'm working at the moment
Workbook wbook;

private CellValue formulaEvaluation(Cell cell) {
    FormulaEvaluator formulaEval = wbook.getCreationHelper().createFormulaEvaluator();
    return formulaEval.evaluate(cell);
}

public Double obtieneObjetoNumericoCelda(Cell cell) {
    Double dblValue = null;
    if (cell != null) {
        switch(cell.getCellType()) {
        case Cell.CELL_TYPE_NUMERIC:
            dblValue = cell.getNumericCellValue();
            break;
        case Cell.CELL_TYPE_FORMULA:
            CellValue objCellValue = formulaEvaluation(cell);
            if (objCellValue.getCellType() == Cell.CELL_TYPE_NUMERIC) {
                dblValue = objCellValue.getNumberValue();
            }
            break;
        }
    }
    return dblValor;
}
person Luiggi Mendoza    schedule 06.06.2012
comment
Вероятно, вам лучше просто создать оценщик формул один раз и использовать его повторно, а не создавать его один раз для каждой ячейки. - person Gagravarr; 06.06.2012
comment
Взято из документации Apache POI eval: обычно вам нужно создать только один экземпляр FormulaEvaluator. на листе, но на самом деле создание нескольких FormulaEvaluator на листе не требует дополнительных затрат, кроме создания объекта FormulaEvaluator. В моем случае для книги существует класс-оболочка, поэтому создание формулы более более одного раза не повлияет на производительность. - person Luiggi Mendoza; 06.06.2012
comment
документация обновлена! - person Gagravarr; 11.06.2012

Мне удалось решить это в конце концов.

String strFormula = "ROUND((VLOOKUP(A"+rowCountVlookup+",'C:\\Users\\Admin\\Desktop\\[pricing.xlsx]Sheet1'!$B$3:$E$41,4, FALSE)*E"+rowCountVlookup+"),2)";
                            dataRow1.createCell((short)5).setCellType(Cell.CELL_TYPE_FORMULA);
                            dataRow1.createCell((short)5).setCellFormula(strFormula);
person The Gav Lad    schedule 07.06.2012