Java POI: как читать значение ячейки Excel, а не формулу, вычисляющую его?

Я использую API Apache POI для получения значений из файла Excel. Все работает отлично, за исключением ячеек, содержащих формулы. Фактически, cell.getStringCellValue() возвращает формулу, используемую в ячейке, а не значение ячейки.

Я попытался использовать метод methodFormulaCell evaluateFormulaCell() но он не работает, потому что я использую формулу GETPIVOTDATA Excel, и эта формула не реализована в API:

 Exception in thread "main" org.apache.poi.ss.formula.eval.NotImplementedException: Error evaluating cell Landscape!K11 at org.apache.poi.ss.formula.WorkbookEvaluator.addExceptionInfo(WorkbookEvaluator.java:321) at org.apache.poi.ss.formula.WorkbookEvaluator.evaluateAny(WorkbookEvaluator.java:288) at org.apache.poi.ss.formula.WorkbookEvaluator.evaluate(WorkbookEvaluator.java:221) at org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator.evaluateFormulaCellValue(HSSFFormulaEvaluator.java:320) at org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator.evaluateFormulaCell(HSSFFormulaEvaluator.java:213) at fromExcelToJava.ExcelSheetReader.unAutreTest(ExcelSheetReader.java:193) at fromExcelToJava.ExcelSheetReader.main(ExcelSheetReader.java:224) Caused by: org.apache.poi.ss.formula.eval.NotImplementedException: GETPIVOTDATA at org.apache.poi.hssf.record.formula.functions.NotImplementedFunction.evaluate(NotImplementedFunction.java:42) 

    Для ячеек формулы excel хранит две вещи. Первая – это сама Формула, другая – «кэшированное» значение (последнее значение, которое оценивалось как forumla)

    Если вы хотите получить последнее кэшированное значение (которое может быть уже неверным, но пока Excel сохранил файл, и вы его не изменили), вам нужно что-то вроде:

      for(Cell cell : row) { if(cell.getCellType() == Cell.CELL_TYPE_FORMULA) { System.out.println("Formula is " + cell.getCellFormula()); switch(cell.getCachedFormulaResultType()) { case Cell.CELL_TYPE_NUMERIC: System.out.println("Last evaluated as: " + cell.getNumericCellValue()); break; case Cell.CELL_TYPE_STRING: System.out.println("Last evaluated as \"" + cell.getRichStringCellValue() + "\""); break; } } } 

    Выше предложения не сработали для меня cell.getRawValue () вернула ту же формулу, что и в ячейке excel на AUT, поэтому написала ниже функцию, и она сработала:

      public void readFormula() throws IOException { FileInputStream fis = new FileInputStream("Path of your file"); Workbook wb = new XSSFWorkbook(fis); Sheet sheet = wb.getSheetAt(0); FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator(); CellReference cellReference = new CellReference("C2"); //pass the cell which contains formula Row row = sheet.getRow(cellReference.getRow()); Cell cell = row.getCell(cellReference.getCol()); CellValue cellValue = evaluator.evaluate(cell); switch (cellValue.getCellType()) { case Cell.CELL_TYPE_BOOLEAN: System.out.println(cellValue.getBooleanValue()); break; case Cell.CELL_TYPE_NUMERIC: System.out.println(cellValue.getNumberValue()); break; case Cell.CELL_TYPE_STRING: System.out.println(cellValue.getStringValue()); break; case Cell.CELL_TYPE_BLANK: break; case Cell.CELL_TYPE_ERROR: break; // CELL_TYPE_FORMULA will never happen case Cell.CELL_TYPE_FORMULA: break; } } 

    Существует альтернативная команда, в которой вы можете получить исходное значение ячейки, в которую будет добавлена ​​формула. Он возвращает тип String. Использование:

     cell.getRawValue(); 
    Interesting Posts

    Ошибка 6 – переполнение на одном компьютере, но не на другом

    Запрет Excel на изменение текста на номер

    Откройте Internet Explorer В Excel VBA через прямой путь программы

    Сравнение Excel вставки / обновления производительности в C #

    Ошибка заголовка Excel VBA

    Создание таблиц R со встроенной графикой

    Создайте массив / список / набор идентификаторов в столбце, перекрестно привязанный к строкам, каждый из которых появляется в

    Как лучше структурировать код Excel VBA для обслуживания, ясности и обработки ошибок

    вопрос с регулярными выражениями в excel?

    Excel: условное форматирование подстановочных знаков

    Подсчет списка сравниваемых критериев

    Excel VBA: настройка каталога сохранения по умолчанию на уровне рабочей книги

    Excel находит идентификаторы в списке и добавляет их в запятую

    Excel Interpolate с логарифмическим прогнозом

    Преобразовать из 'System.Windows.Forms.DataGridViewTextBoxColumn' в 'System.Data.DataColumn'

    Давайте будем гением компьютера.