Excel单元格样式问题

我使用下面的代码从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文件仅包含

styles.xml 。 此numFmtId没有保存特殊的numFmtId

因此,如何在Excel显示它取决于系统的区域设置。

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

在此处输入图像描述

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

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

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

因此,如果不知道系统的区域设置,apache POI也不知道应该如何显示,因为该文件不包含此信息。 所以它将假设en-us locale。 这导致日期的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中一样显示它们。