Невозможно вычислить значение формулы для поля Тип даты, используя Java, Scala, Poi и Fillo - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь прочитать значение типа даты из таблицы Excel. Образец Excel -

enter image description here

Ячейка B2 не является полем формулы.

B3, заполненная с использованием =RIGHT(B2,2)&"/"&MID(B2,5,2)&"/"&LEFT(B2,4)

B4 заполняется с использованием =DATE(YEAR(B3),MONTH(B3),DAY(B3))

Я могу прочитать ячейки B2 и B3, используя код ниже -

object ReadExcelFile {

  def main(args: Array[String]): Unit = {
    val xlsFilePath = "C:\\test.xlsx"

    val workbook = new XSSFWorkbook(new FileInputStream(new File(xlsFilePath)))
    val sheet  = workbook.getSheet("Sheet1")

    val evaluator = workbook.getCreationHelper().createFormulaEvaluator()
    //evaluator.evaluateAll()

    sheet.map(row => {
      row.map(cell => {
        val cellValue = readCellValues(cell, evaluator)
        print(cellValue + "\t")
      })
      println()
    })
    workbook.close()
  }

  def readCellValues(cell: Cell, evaluator: XSSFFormulaEvaluator): Any = {

    val dataFormatter = new DataFormatter()
    if (cell.getCellType() == CellType.FORMULA) {
      evaluator.evaluateFormulaCell(cell) match {
        case CellType.BOOLEAN => cell.getBooleanCellValue()
        case CellType.NUMERIC => {
          if (DateUtil.isCellDateFormatted(cell)) {
            val dateFormat = new SimpleDateFormat("dd-MM-yyyy")
            dateFormat.format(cell.getDateCellValue())
          } else {
            cell.getNumericCellValue()
          }
        }
        case CellType.STRING => cell.getRichStringCellValue()
        case CellType.ERROR => cell.getErrorCellValue
        case CellType.BLANK => ""
        case CellType._NONE => ""
      }
    } else {
      dataFormatter.formatCellValue(cell)
    }
  }
}

Для ячейки B4 я получаю значение барахла 15 и каждый раз получение CellType как ERROR

Я пробовал evaluator.evaluateAll(), но получаю исключение ниже -

Исключение в потоке "main" java .lang.RuntimeException: Неожиданный тип eval (org . apache .poi.ss.formula.eval. MissingArgEval@cff1a53)

Я также пробовал cell.getCachedFormulaResultType() и evaluator.evaluateInCell(cell), но не повезло.

Я пробовал библиотеку Fillo также. Код -

Fillo fillo=new Fillo();
String xlsFilePath = "C:\\test.xlsx";
Connection connection=fillo.getConnection(xlsFilePath);
String strQuery="Select * from Sheet1";
Recordset recordset=connection.executeQuery(strQuery);

while(recordset.next()){
    System.out.println(recordset.getField("Date"));
}

recordset.close();
connection.close();

Получение выходных данных -

20190726
26/07/2019

Есть ли способ получить значение ячейки B4 без изменения формулы? Я должен использовать только вышеупомянутую формулу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...