Excell细胞样式问题 [英] Excell Cell Style issue

查看:129
本文介绍了Excell细胞样式问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用下面的代码从XLSX文件获取日期值。对于某些xlsx文件,这是非常正常的。但是它没有给出在xlsx文件中的确切的日期格式。这个问题是一些文件。



eg;我有这样的日期 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)存储在文件中。请参阅



在英国的英国Windows系统中,这将是 DD / MM / YYYY 每个默认值。



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



所以要知道Excel将如何显示日期与 numFmtId =14,需要知道在区域和语言中确切的Windows系统设置。



所以apache POI也不知道这应该是显示不知道该loc系统的ale设置,因为该文件不包含此信息。所以它将假设 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){//默认的短日期没有显式格式化
dateFmt =dd / mm / yyyy; //这个
的默认日期格式} else {//显式格式化的其他数据格式
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中显示它们。


I am using below code to get date value from XLSX file. This is working absolutely fine for some xlsx file. But It is not giving exact date format which is in xlsx file. This issue is for some file.

eg; I have date like this 21/01/2016 (dd/mm/yyyy) but after reading, it gives date as 01/21/16(mm/dd/yy)

Is there any other way to get cellstyle?

Is it issue of xlsx file??

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);

}

解决方案

If the cell, which is containing the date, is formatted as the default date format (Short Date), then only the format id 0xE (14) is stored in the file. See https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/BuiltinFormats.html. The *.xlsx file contains only

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

in styles.xml. There is no special formatCode saved for this numFmtId.

So how this will be displayed in Excel depends on the locale settings of the system.

For example with my German Windows system the numFmtId="14" will be displayed as TT.MM.JJJJ as is set in Region and Language settings:

In English Great Britain Windows systems this will be DD/MM/YYYY per default.

But if you change the setting for Short Date in the system settings, to JJJJ-MM-TT for example, then this format will also displayed in Excel with the numFmtId="14".

So to know how exactly Excel will display the date with the numFmtId="14", one needs to know the exact Windows system settings in Region and Language.

So also apache POI can't know how this should be displayed without knowing the locale settings of the system, since the file contains no infomation about this. So it will assume en-us locale. This leads to m/d/yy for date.

You could check if the format id 14 is used and if so define your own default date format.

   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);

   }

To be clear: This all is only with numFmtId="14" cell.getCellStyle().getDataFormat() == 14. All other date formats will have explicit data format strings cell.getCellStyle().getDataFormatString() and so POI can display them exactly like in Excel.

这篇关于Excell细胞样式问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆