Excel单元格样式问题

Son*_*nal 0 java excel apache-poi xssf

我使用下面的代码从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);

}
Run Code Online (Sandbox Code Playgroud)

Axe*_*ter 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设置:

在此输入图像描述

在英国的英国Windows系统中,这将是DD/MM/YYYY默认的.

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

因此,要知道Excel将如何显示日期numFmtId="14",需要知道确切的Windows系统设置Region and Language.

因此,如果不知道系统的语言环境设置,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);

   }
Run Code Online (Sandbox Code Playgroud)

要明确:这一切都只有numFmtId="14" cell.getCellStyle().getDataFormat() == 14.所有其他日期格式都有明确的数据格式字符串cell.getCellStyle().getDataFormatString(),因此POI可以像在Excel中一样显示它们.


请参阅POI DataFormatter返回2位数年份而不是4位数年份的日期单元格,以了解如何使用DataFormatter此方法解决此问题.