`
saiyaren
  • 浏览: 225892 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JexcelApi和POI导入Excel日期识别成数字的解决方案

阅读更多
用过Jxl或者POI导入Excel信息的朋友应该都遇到过这样的问题。日期格式的单元格有些会识别成数字单元格。(为什么说有些呢?因为在Excel文件中输入2008-3-18的日期可以正确导入,但是输入3-18的就会识别成数字。)关于这个问题我找了很久,都没有找到解答。现在解决了,所以记录以下,一是怕以后忘了,二是希望遇到这个问题的朋友可以少走弯路。

首先来分析一下这个问题的成因。既然两个开源包都有同样的问题,说明可能是Excel内部就是这样存储的。所以需要通过一些其他的方式来从NUMERIC Cell中把这些日期找出来。

有两种方式可以辨别NUMERIC Cell储存的是否是日期:

方法一:如果用的是POI,可以直接用HSSFDateUtil.isCellDateFormatted(cell)这个方法。

Java代码
case HSSFCell.CELL_TYPE_NUMERIC:   
    if (HSSFDateUtil.isCellDateFormatted(cell)) {   
        double d = cell.getNumericCellValue();   
        Date date = HSSFDateUtil.getJavaDate(d);   
    }   
case HSSFCell.CELL_TYPE_NUMERIC:
    if (HSSFDateUtil.isCellDateFormatted(cell)) {
        double d = cell.getNumericCellValue();
        Date date = HSSFDateUtil.getJavaDate(d);
    }

方法二:如果用的是Jxl,可以将cell.getCellFormat 强制转换成 XFRecord。然后判断XFRecord.formatIndex 如果等于 58就是DateCell。

Java代码
if (cell.getType() == CellType.NUMBER) {   
    NumberCell nc = (NumberCell) cell;   
    XFRecord xfr = (XFRecord) nc.getCellFormat();   
    final int INDEX_OF_DATE = 58;   
    if(xfr.formatIndex == INDEX_OF_DATE) {   
        Date date = HSSFDateUtil.getJavaDate(nc.getValue());   
        content = dateformat.format(date);   
    }    
}  
if (cell.getType() == CellType.NUMBER) {
    NumberCell nc = (NumberCell) cell;
    XFRecord xfr = (XFRecord) nc.getCellFormat();
    final int INDEX_OF_DATE = 58;
if(xfr.formatIndex == INDEX_OF_DATE) {
    Date date = HSSFDateUtil.getJavaDate(nc.getValue());
    content = dateformat.format(date);
    }
}

得到的这个double不能直接拿来用。转换可以用HSSFDateUtil.getJavaDate(double date)这个方法。

PS:接下来还有 jxl下注释的导入和单元格链接两道难关要闯,希望有这方面经验的朋友也能跟我分享一下。谢谢。



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/qianling3439/archive/2009/03/17/3998861.aspx
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics