Sto cercando di inserire una semplice formula VLookup nel mio file ".xlsx" utilizzando Java e Apache POI.
Questa formula ha il riferimento esterno e NON funziona per me.Java POI XSSF VLookup formula
Quindi, per darvi maggiori dettagli sto usando poi e poi-OOXML versione 3.13 e Excel 2007.
sto mettendo la formula nella cella in questo modo (in cui cellula è una cellula):
cell.setCellType(Cell.CELL_TYPE_FORMULA);
cell.setCellFormula("StringContainingFormula");
E poi valutare la formula, ho provato tre modi diversi ma senza alcuna fortuna. (wb è XSSFWorkbook).
FormulaEvaluator mainWorkbookEvaluator = wb.getCreationHelper().createFormulaEvaluator();
Map<String,FormulaEvaluator> workbooks = new HashMap<String, FormulaEvaluator>();
workbooks.put("SpreadsheetName.xlsx", mainWorkbookEvaluator);
mainWorkbookEvaluator.setupReferencedWorkbooks(workbooks);
mainWorkbookEvaluator.evaluateAll();
XSSFEvaluationWorkbook.create(wb);
Workbook nwb = wb;
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
for (Sheet sheet : nwb) {
for (Row r : sheet) {
for (Cell c : r) {
if (c.getCellType() == Cell.CELL_TYPE_FORMULA) {
try {
//evaluator.evaluateFormulaCell(c);
evaluator.evaluate(c);
} catch (Exception e) {
System.out.println("Error occured in 'EvaluateFormulas' : " + e);
}
}
}
}
}
XSSFFormulaEvaluator.evaluateAllFormulaCells(wb);
Il problema è, si scrive in un file Excel e poi durante la valutazione getta errore:
java.lang.IllegalArgumentException: Invalid sheetIndex: -1
Ora, se apro il file di Excel, mi dà avvertimento:
Automatic update of links has been disabled
Se abilito il contenuto, formula mostra il risultato correttamente e se non faccio niente di formula con conseguente #N/A
.
Ora se seleziono la cella con la formula al suo interno e fai clic su barra della formula e premi invio di una formula mostra il risultato.
Aggiornamento:
Così, ho disabilitato il messaggio di avviso andando in Opzioni di Excel e ha cominciato a darmi la formula all'interno della cellula.
Ma, quando ho cercato di ottenere il valore del risultato da esso usando
if (cell.getCachedFormulaResultType == Cell.CELL_TYPE_STRING) {
System.out.println("Last evaluated as \"" + cell.getRichStringCellValue() + "\"");
}
Non è mai mi ha dato la getCachedFormulaResultType
come CELL_TYPE_STRING
, si ritorna sempre CELL_TYPE_NUMERIC
. Dovrebbe restituire il valore di stringa. Sto indicando l'URL e un altro valore (parole separate da "|" - "gatto | cane | uccello").
Apprezzo qualsiasi aiuto/suggerimento.
Probabilmente meglio controllare la [valutazione di formula] (https: // poi. apache.org/spreadsheet/eval.html) documentazione attentamente. Forse qualcosa come 'wb.setForceFormulaRecalculation (true);' ti aiuterà? –
Inoltre, il documento dice di 'createFormulaEvaluator' per i fogli di lavoro cui si fa riferimento. Ad esempio, 'workbooks.put (" input.xls ", WorkbookFactory.create (" c: \ temp \ input22.xls "). GetCreationHelper(). CreateFormulaEvaluator());' –
@Nicholas, grazie mille per i tuoi suggerimenti , ma non ho trovato nulla di simile a 'wb.setForceFormulaRecalculation (true);' e ho già provato il riferimento 'createFormulaEvaluator', ma senza fortuna. – ManishChristian