Excel单元格样式问题 [英] Excel Cell Style issue

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

问题描述

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



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



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



它是xlsx文件的问题吗?

 字符串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(日期+值);

}


解决方案

如果包含日期的单元格被格式化为默认日期格式(短日期),然后只有格式ID 0xE(14)存储在文件中。请参阅



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



但如果您在系统设置中更改短日期的设置,则为例如, 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);

字符串值= new CellDateFormatter(dateFmt).format(date);

System.out.println(日期+值);

}

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






参见 POI DataFormatter返回2位数年份而不是4位数年份的日期单元格如何使用 DataFormatter 解决此问题。


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.


See POI DataFormatter returns 2 digits year instead of 4 digits year for date cells for how to use DataFormatter to work around this issue.

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

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