Как получить дату из Excel с помощью формулы по Apache POI - PullRequest
0 голосов
/ 02 октября 2018

У меня есть лист Excel, в котором ячейке даты назначена формула даты в Excel TODAY() + 1.По сути, сегодня по умолчанию он отображается как 03/10/2018.Я создал код для чтения данных из Excel, в котором есть формула, но когда я получаю дату, она приходит по-другому.

Код:

  Cell c = CellUtil.getCell(r, columnIndex);
  CellType type = c.getCellType();
      if (type == CellType.FORMULA) {
          switch (c.getCachedFormulaResultType()) {
                 case NUMERIC:
                      if (DateUtil.isCellDateFormatted(c)) {
                          value = (new SimpleDateFormat("dd-MM-yyyy").format(c.getDateCellValue()));
                          data.add(value); // Date should display 03-10-2018 but it's showing 23-01-2018
                      } else {
                          value = (c.getNumericCellValue()) + "";
                          data.add(value);
                      }
                  break;
                  case STRING:
                           value = c.getStringCellValue();
                           data = new LinkedList <String>(Arrays.asList(value.split(";")));
                   break;
              }
      }

Я не знаю, почему он показывает дату января с примененной формулой TODAY() + 1

Аналогично этой другой функции TODAY() + 15 возврат22-04-2018.

1 Ответ

0 голосов
/ 05 октября 2018

Как указано в Оценка формулы :

"Формат файла Excel (и .xls, и .xlsx) хранит« кэшированный »результат для каждой формулы вместе с формулойсамо по себе. Это означает, что при открытии файла его можно быстро отобразить, не тратя много времени на вычисление всех результатов формулы. Это также означает, что при чтении файла через Apache POI результат быстро доступен для вас.тоже! "

Таким образом, все формулы будут иметь кэшированные результаты, сохраненные с момента их последней оценки.Это либо последний раз, когда книга открывалась в Excel, пересчитывалась и сохранялась, либо с того момента, когда в последний раз выполнялась оценка за пределами Excel.

Так что если ячейка с формулой =TODAY() имеет кэшированный результатиз 22-01-2018 сохранено, то 22 января 2018 г. последний раз оценивалась рабочая книга.

Чтобы всегда получать текущие результаты формул, необходимо оценить формулы сначала перед чтением.Простейший способ:

...
workbook.getCreationHelper().createFormulaEvaluator().evaluateAll();
...

Или вы используете DataFormatter вместе с FormulaEvaluator :

...
DataFormatter formatter = new DataFormatter(); 
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); 
...
Cell cell = CellUtil.getCell(...);
...
String value = formatter.formatCellValue(cell, evaluator);
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...