Excel单元格样式问题

时间:2016-01-20 12:52:21

标签: java excel apache-poi xssf

我使用下面的代码从XLSX文件中获取日期值。这对于某些xlsx文件来说非常好。但它没有提供xlsx文件中的确切日期格式。此问题适用于某些文件。

例如;我有这样的日期pstomo_eq 但在阅读之后,它会将日期设为21/01/2016 (dd/mm/yyyy)

还有其他方法可以获得cellstyle吗?

是xlsx文件的问题吗?

01/21/16(mm/dd/yy)

1 个答案:

答案 0 :(得分:6)

如果包含日期的单元格被格式化为默认日期格式(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中的

。此formatCode没有保存特殊numFmtId

因此Excel中的显示方式取决于系统的区域设置。

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

enter image description here

在英国的英国Windows系统中,默认情况下为DD/MM/YYYY

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

因此要知道Excel将如何使用numFmtId="14"显示日期,需要知道Region and Language中确切的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解决此问题的问题,请参阅POI DataFormatter returns 2 digits year instead of 4 digits year for date cells