无法使用Java、Scala、Poi和Fillo计算日期类型字段的公式值
我正在尝试从excel工作表中读取日期类型值。样本Excel- 单元格B2不是公式字段 B3使用无法使用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
=右(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键,然后保存该文件,然后将其读回是正确的吗?