Apache POI 错误地打印自动格式化为时间的单元格

Apache POI incorrectly printing cell that is auto formatted to time

我正在尝试从加密的 Excel 工作簿中打印一个单元格。该单元格包含一个时间,当我尝试打印 cell.getNumericCellValue() 时,结果是一个随机数,它似乎取决于单元格内的时间,在本例中为 0.5208333333333334。当我尝试只打印单元格时,结果总是这个日期:31-Dez.-1899,独立于单元格内的时间。这是 Excel sheet 中的单元格:Screenshot

我使用的是Windows11,Eclipse版本:2021-12(4.22.0),JDK版本:jdk-17.0.2

这是执行的代码:

        XSSFWorkbook wb = null;
        
        try (FileInputStream fis = new FileInputStream(excelFilePath);){
            wb = ((XSSFWorkbook)WorkbookFactory.create(fis, password));
        } catch (IOException | EncryptedDocumentException e) {
            e.printStackTrace();
        }
        
        XSSFSheet sheet = wb.getSheetAt(0);
        
        XSSFCell cell = sheet.getRow(1).getCell(1);
        
        System.out.println(cell); // results in 31-Dez.-1899
        System.out.println(cell.getNumericCellValue()); // results in 0.5208333333333334

要以与 Excel sheet 相同的格式获取 String 的单元格值,请使用 DataFormatter,如下所示:

Java POI : How to read Excel cell value and not the formula computing it?

代码摘录:

...
DataFormatter dataFormatter = new DataFormatter(new java.util.Locale("en", "US"));
...
String value = dataFormatter.formatCellValue(cell);
...

或者,如果您想要日期单元格值,请获取日期单元格值而不是数字单元格值,如 https://poi.apache.org/components/spreadsheet/quick-guide.html#CellContents:

中所示
import org.apache.poi.ss.usermodel.CellType;
...
    switch (cell.getCellType()) {
...
        case NUMERIC:
            if (DateUtil.isCellDateFormatted(cell)) {
                System.out.println(cell.getDateCellValue());
            } else {
                System.out.println(cell.getNumericCellValue());
            }
...