poi EXCLE 解析

学无止境+ 2014-03-21 02:52:12

case HSSFCell.CELL_TYPE_NUMERIC:
case HSSFCell.CELL_TYPE_FORMULA: {
// 判断当前的cell是否为Date
if (HSSFDateUtil.isCellDateFormatted(cell)) {
// 如果是Date类型则,转化为Data格式
//方法1:这样子的data格式是带时分秒的:2011-10-12 0:00:00
//cellvalue = cell.getDateCellValue().toLocaleString();
//方法2:这样子的data格式是不带带时分秒的:2011-10-12
Date date = cell.getDateCellValue();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
cellvalue = sdf.format(date);
} // 如果是纯数字
else {
// 取得当前Cell的数值
cellvalue = String.valueOf(cell.getNumericCellValue());
}


一般写法都是这个样子的,但是HSSFCell.CELL_TYPE_FORMULA 属于是公式类型的,返回值类型不一定就是数字类型,也可能是其他类型,这样直接调用HSSFDateUtil.isCellDateFormatted(cell) 就会报错?

这个如何解决,我目前是
										case Cell.CELL_TYPE_FORMULA:
cell.setCellType(Cell.CELL_TYPE_STRING);
cellvalue = cell.getStringCellValue().trim();
LOGGER.info("第 "+(j+1)+" 行,第 " + lineNum +" 公式值:====>>>: " + cellvalue);
if(lineNum == 50 && cellvalue.startsWith("4")){ --这样根据4开头,不知道靠谱么 Date date = HSSFDateUtil.getJavaDate(Double.valueOf(cellvalue));
cellvalue = new SimpleDateFormat("yyyy-MM-dd").format(date);
求大神指导!!
...全文
246 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
学无止境+ 2016-09-06
  • 打赏
  • 举报
回复
Pattern p = Pattern.compile("[0-9]{4}-[0-9]{1,2}-[0-9]{2}"); Matcher m = p.matcher("2016-08-09"); boolean b = m.matches();
学无止境+ 2014-04-12
  • 打赏
  • 举报
回复
如何用正则表达式验证
wyx100 2014-03-25
  • 打赏
  • 举报
回复
引用 1 楼 longtian1213 的回复:
都转成字符串呗,然后用正则表达式判断下是不是日期格式的!
正解
wyx100 2014-03-25
  • 打赏
  • 举报
回复
引用 楼主 HappyVeryGood 的回复:

 case HSSFCell.CELL_TYPE_NUMERIC:            
case HSSFCell.CELL_TYPE_FORMULA: {                
// 判断当前的cell是否为Date                
if (HSSFDateUtil.isCellDateFormatted(cell)) {
                    // 如果是Date类型则,转化为Data格式 
          //方法1:这样子的data格式是带时分秒的:2011-10-12 0:00:00  
                  //cellvalue = cell.getDateCellValue().toLocaleString();                                       
                 //方法2:这样子的data格式是不带带时分秒的:2011-10-12                  
            Date date = cell.getDateCellValue();  
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
            cellvalue = sdf.format(date); 
  }  // 如果是纯数字
 else { 
              // 取得当前Cell的数值
       cellvalue = String.valueOf(cell.getNumericCellValue());      
 }
一般写法都是这个样子的,但是HSSFCell.CELL_TYPE_FORMULA 属于是公式类型的,返回值类型不一定就是数字类型,也可能是其他类型,这样直接调用HSSFDateUtil.isCellDateFormatted(cell) 就会报错? 这个如何解决,我目前是
										case Cell.CELL_TYPE_FORMULA:
											cell.setCellType(Cell.CELL_TYPE_STRING);
									    	cellvalue = cell.getStringCellValue().trim();
									    	LOGGER.info("第 "+(j+1)+" 行,第 " + lineNum +" 公式值:====>>>: " + cellvalue);
 if(lineNum == 50 && cellvalue.startsWith("4")){	--这样根据4开头,不知道靠谱么								    		  Date date = HSSFDateUtil.getJavaDate(Double.valueOf(cellvalue));
										          cellvalue = new SimpleDateFormat("yyyy-MM-dd").format(date);
									    	
求大神指导!!
正解
学无止境+ 2014-03-24
  • 打赏
  • 举报
回复
分享:好东西:希望来多点人 作者:Tony Qu 这个问题对于NPOI的很多玩家都是一个值得探讨的问题,虽然资深NPOI使用者会习惯性的使用如下语句进行判断: IRow row = sheet.GetRow(i) if(row.GetCell(j)!=null) { ... } 但有些人仍然不理解为何需要判空,如果没有直接创建不就完了。但事实上,如果没有就创建会带来潜在的问题,在解释这个问题之前我先来给大家介绍下Excel内部的单元格实现方式。 在xls文件中,单元格是以ValueRecord的形式存在的,如下图(LabelSSTRecord即单元格的字符串值记录) (上图截取的是POIFSBrowser的画面,关于如何使用POIFS Browser,请参考《POIFS Browser的使用》) 而单元格的值是由不同种类的Record提供的,例如double型值存在NumberRecord中,bool型值存在BoolErrRecor中,string型值保存在LabelSSTRecord和UnicodeString中(LabelSSTRecord只是关系记录,真正的字符串值保存在UnicodeString记录中)。这种设计本身十分灵活,而且相同的值在不同的单元格之间可以复用,从而缩小Excel文件的大小。 本文所要讨论的重点则是BlankRecord,即空值单元格所用的记录,BlankRecord其实是String类型的一种特殊情况,主要在单元格被清空时使用(但确切的创建条件我也不清楚,这是Excel内部的机制,没有源代码是很难分析彻底的。)这里就牵扯到一个有趣的问题:平时我们看到一个Excel单元格是空的,其实是有两种可能性的,一种是BlankRecord,另外一种则是不存在这个单元格,即RowRecord和BlankRecord都不存在。 说到这,就牵出了一个新问题:为什么微软要这么设计单元格呢?为何不是所有单元格都有Record,而是有的有,有的没有? 其实微软正是出于省空间的考虑才这么设计的,大家都知道Excel 2003文件格式理论上可以存65535行和255列数据,那是不是说保存一个Excel文件我要把所有的65535*255列数据都存在下来,不存在也存个BlankRecord,这样子可是可以,但最大的问题就是那个文件可能有几十M,你说动不动一个空xls文件这么大,谁敢用。别说几十兆了,很多人觉得xls初始创建时的11k都有点莫名其妙,呵呵,当然本文的重点不是11k问题,这里就不展开了。 所以呢,出于这点考虑,很多看似存在的空单元格其实是不保存在xls中的,至于BlankRecord在何种情况下才会生成,目前我也解释不清楚,似乎比较随机,只有看了Excel源代码才知道。 回过头来说NPOI的GetCell,同样的道理,如果GetCell没有就创建就等于犯了我之前说的几十兆文件的错误,更何况是GetCell又不是CreateCell,如果人家真的是要读怎么办? 当然NPOI其实留了一手,GetCell还有一种用法,如下 //默认情况,返回空或Blank row.GetCell(2, MissingCellPolicy.RETURN_NULL_AND_BLANK); //当单元格为BlankRecord时,也返回类型为Blank的ICell实例; row.GetCell(2, MissingCellPolicy.RETURN_BLANK_AS_NULL); //当单元格不存在时,返回类型为Blank的ICell实例;如果存在则返回当前类型 row.GetCell(1, MissingCellPolicy.CREATE_NULL_AS_BLANK); 以上方法在NPOI 1.2.5中就有,不需要等NPOI 2.0。
学无止境+ 2014-03-24
  • 打赏
  • 举报
回复
这个问题不难啊,为何没有人,,,难道都没有遇到么??
学无止境+ 2014-03-24
  • 打赏
  • 举报
回复
引用 1 楼 longtian1213 的回复:
都转成字符串呗,然后用正则表达式判断下是不是日期格式的!
日期:2014-03-24 读出来的并不是:“2014-03-24” 而是:数字41开头的数字 这样的话,读出来的数据用正则表达式就没办法验证了、、、
S117 2014-03-21
  • 打赏
  • 举报
回复
都转成字符串呗,然后用正则表达式判断下是不是日期格式的!

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧