Excel 单元格样式问题

Excel Cell Style issue

我正在使用以下代码从 XLSX 文件中获取日期值。这对于某些 XLSX 文件来说工作得很好,但它没有给出 XLSX 文件中的确切日期格式。此问题针对某些文件。

例如,我有这样的日期21/01/2016 (dd/mm/yyyy),但阅读后,它给出的日期为01/21/16(mm/dd/yy)

还有其他方法获取cellstyle吗?

是XLSX文件的问题吗?

String dateFmt = cell.getCellStyle().getDataFormatString();
                
if (DateUtil.isCellDateFormatted(cell)) {
    double val = cell.getNumericCellValue();
    Date date = DateUtil.getJavaDate(val);

    String dateFmt = cell.getCellStyle().getDataFormatString();
                                    
    System.out.println("dateFmt "+dateFmt);

    value = new CellDateFormatter(dateFmt).format(date);
                                    
    System.out.println("Date "+value);
                                
}

如果包含日期的单元格被格式化为默认日期格式 (Short Date),则只有格式 ID 0xE (14) 存储在文件中。参见 https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/BuiltinFormats.html*.xlsx 文件仅包含

<xf numFmtId="14" ... applyNumberFormat="1"/>

styles.xml 中。没有为此numFmtId保存特殊formatCode

那么在Excel中如何显示取决于系统的区域设置。

例如,对于我的德语 Windows 系统,numFmtId="14" 将显示为 TT.MM.JJJJ,如 Region and Language 设置中所设置:

在英语大不列颠 Windows 系统中,默认为 DD/MM/YYYY

但是如果您在系统设置中将 Short Date 的设置更改为 JJJJ-MM-TT,则此格式也会显示在 Excel 中,并带有 numFmtId="14" .

所以要知道 Excel 将如何用 numFmtId="14" 显示日期,需要知道 Region and Language.[=36 中的确切 Windows 系统设置=]

因此,apache POI 在不知道系统的区域设置的情况下也不知道应该如何显示,因为该文件不包含有关此的信息。因此它将采用 en-us 语言环境。这导致日期 m/d/yy

您可以检查是否使用了格式 ID 14,如果使用了,则定义您自己的默认日期格式。

   if (DateUtil.isCellDateFormatted(cell)) {
    Date date = cell.getDateCellValue();

    System.out.println(date);

    String dateFmt = "";

    if (cell.getCellStyle().getDataFormat() == 14) { //default short date without explicit formatting
     dateFmt = "dd/mm/yyyy"; //default date format for this
    } else { //other data formats with explicit formatting
     dateFmt = cell.getCellStyle().getDataFormatString();
    }

    System.out.println("dateFmt " + dateFmt);

    String value = new CellDateFormatter(dateFmt).format(date);

    System.out.println("Date " + value);

   }

需要说明的是:这一切只限于numFmtId="14" cell.getCellStyle().getDataFormat() == 14。所有其他日期格式都将具有明确的数据格式字符串 cell.getCellStyle().getDataFormatString(),因此 POI 可以像 Excel.

中一样显示它们

请参阅 了解如何使用 DataFormatter 解决此问题。