无法使用Java、Scala、Poi和Fillo计算日期类型字段的公式值

无法使用Java、Scala、Poi和Fillo计算日期类型字段的公式值,java,excel,scala,apache-poi,Java,Excel,Scala,Apache Poi,我正在尝试从excel工作表中读取日期类型值。样本Excel- 单元格B2不是公式字段 B3使用=右(B2,2)&“/”和中(B2,5,2)&“/”和左(B2,4) B4使用=日期(年(B3)、月(B3)、日(B3)) 我能够使用以下代码读取B2和B3单元- object ReadExcelFile { def main(args: Array[String]): Unit = { val xlsFilePath = "C:\\test.xlsx" val workbo

我正在尝试从excel工作表中读取日期类型值。样本Excel-

单元格B2不是公式字段

B3使用
=右(B2,2)&“/”和中(B2,5,2)&“/”和左(B2,4)

B4使用
=日期(年(B3)、月(B3)、日(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,每次得到的单元格类型都是错误的

我尝试了
evaluator.evaluateAll()
,但遇到以下异常-

线程“main”java.lang.RuntimeException中的异常:意外的eval类型(org.apache.poi.ss.formula.eval)。MissingArgEval@cff1a53)

我还尝试了
cell.getCachedFormulaResultType()
evaluator.evaluateInCell(cell)
,但没有成功

我也试过菲罗图书馆。代码-

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单元格的值?我只能使用上述公式。

为什么不读取上次计算公式时缓存的单元格值?如果公式值是最新的,则应该更快更简单。我已使用cell.getCachedFormulaResultType()尝试过此方法。获取错误。什么错误?或者你是说你得到了一个结果类型的错误?我得到的是错误类型,值是#值!如果在excel中打开该文件,请单击单元格,按enter键,然后保存该文件,然后将其读回是正确的吗?