Я пытаюсь прочитать значение типа даты из таблицы Excel. Образец Excel -
Ячейка 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 без изменения формулы? Я должен использовать только вышеупомянутую формулу.