Я пытаюсь поместить простую формулу VLookup в свой файл «.xlsx», используя Java и Apache POI.
Эта формула имеет внешнюю ссылку, и она НЕ работает для меня.
Итак, чтобы дать вам более подробную информацию, я использую poi и poi-ooxml версии 3.13 и excel 2007.
Я помещаю формулу в ячейку следующим образом (где ячейка - это ячейка):
cell.setCellType(Cell.CELL_TYPE_FORMULA);
cell.setCellFormula("StringContainingFormula");
А затем оцените формулу. Я пробовал три разных способа, но безуспешно. (wb - это XSSFWorkbook).
1
FormulaEvaluator mainWorkbookEvaluator = wb.getCreationHelper().createFormulaEvaluator();
Map<String,FormulaEvaluator> workbooks = new HashMap<String, FormulaEvaluator>();
workbooks.put("SpreadsheetName.xlsx", mainWorkbookEvaluator);
mainWorkbookEvaluator.setupReferencedWorkbooks(workbooks);
mainWorkbookEvaluator.evaluateAll();
2
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);
}
}
}
}
}
3
XSSFFormulaEvaluator.evaluateAllFormulaCells(wb);
Проблема в том, что он записывает в файл Excel, а затем при его оценке выдает ошибку:
java.lang.IllegalArgumentException: недопустимый sheetIndex: -1
Теперь, если я открываю файл Excel, появляется предупреждение:
Автоматическое обновление ссылок отключено
Если я включаю содержимое, формула показывает результат правильно, а если я не делаю ничего, кроме формулы, в результате получается #N/A
.
Теперь, если я выберу ячейку с формулой в ней, щелкните панель формул и нажмите введите, чем формула показывает результат.
Обновление:
Итак, я отключил предупреждающее сообщение, перейдя в параметры Excel, и он начал выдавать мне формулу внутри ячейки.
НО, когда я попытался получить из него значение результата, используя
if (cell.getCachedFormulaResultType == Cell.CELL_TYPE_STRING) {
System.out.println("Last evaluated as \"" + cell.getRichStringCellValue() + "\"");
}
Он никогда не давал мне getCachedFormulaResultType
как CELL_TYPE_STRING
, он всегда возвращал CELL_TYPE_NUMERIC
. Он должен возвращать строковое значение. Я указываю URL и другое значение (слова, разделенные "|" - "кошка | собака | птица").
Я ценю любую помощь / предложение.
wb.setForceFormulaRecalculation(true);
? - person K.Nicholas   schedule 30.01.2016createFormulaEvaluator
для листов, на которые вы ссылаетесь. Например,workbooks.put("input.xls", WorkbookFactory.create("c:\temp\input22.xls").getCreationHelper().createFormulaEvaluator());
- person K.Nicholas   schedule 30.01.2016wb.setForceFormulaRecalculation(true);
, и я уже пробовалcreateFormulaEvaluator
ссылку, но не повезло. - person ManishChristian   schedule 01.02.2016createFormulatEvaluator
для каждой электронной таблицы, как основной электронной таблицы, так и электронной таблицы, на которую ссылается VLookup. - person K.Nicholas   schedule 01.02.2016Attempted to register same workbook under names "Spreadsheet one (reference from)" and "Spreadsheet two ((reference to))"
. - person ManishChristian   schedule 01.02.2016setupReferencedWorkbooks(java.util.Map<java.lang.String,FormulaEvaluator> workbooks)
? - person K.Nicholas   schedule 01.02.2016setupReferencedWorkbooks
. Возможно, мне придется преобразовать его в рабочую книгу, а затем попробовать. - person ManishChristian   schedule 01.02.2016