现在的位置: 首页 > 综合 > 正文

【转】 poi 处理excel文件时的问题,及解决方案

2013年10月23日 ⁄ 综合 ⁄ 共 3474字 ⁄ 字号 评论关闭

poi 处理excel文件时的问题,及解决方案

http://blog.csdn.net/guoqingcun/archive/2010/12/09/6065070.aspx

 

本文中要解决两个问题

1:读取cell数据时,NullPointerException异常问题和获取不同类型数据的问题

2:保存数值类型数据到excel文件时注意的问题

第一个问题描述:

     在取出cell数据时,如果cell本身没有数据,常常抛出NullPointerException异常。原因是当cell中没有数据时,获取cell对象本身就是等于NUll,内存不会为这个Cell new出对象,所以在调用cell方法时,无疑会抛出NullPointerException异常。

解决方案:

    写个工具类处理这个问题.

public class POIUtil {
  public static String getStringCell(Cell cell) {  
         String str = null;    
         if (cell != null) {  
             switch (cell.getCellType()) {  
                 case HSSFCell.CELL_TYPE_NUMERIC:  
                 case HSSFCell.CELL_TYPE_FORMULA:  
                     str = new Long((long) cell.getNumericCellValue()).toString();  
                     break;  
                 case HSSFCell.CELL_TYPE_STRING:  
                     str = cell.getStringCellValue().trim();  
                     break;  
                 default:  
                     break;  
             }         
         }  
           
         return str;  
     }  
       
     public static double getNumericCell(Cell cell) {  
         double doub = 0;      
         if (cell != null) {  
             switch (cell.getCellType()) {  
                 case HSSFCell.CELL_TYPE_NUMERIC:  
                 case HSSFCell.CELL_TYPE_FORMULA:  
                     doub = cell.getNumericCellValue();  
                     break;  
                 case HSSFCell.CELL_TYPE_STRING:  
                     doub = Double.parseDouble(cell.getStringCellValue().trim());  
                     break;  
                 default:  
                     break;  
             }         
         }  
           
         return doub;  
     }  
     public static float getFloatCell(Cell cell) {  
         float f = 0;      
         if (cell != null) {  
             switch (cell.getCellType()) {  
                 case HSSFCell.CELL_TYPE_NUMERIC:  
                 case HSSFCell.CELL_TYPE_FORMULA:  
                     f = (float)cell.getNumericCellValue();  
                     break;  
                 case HSSFCell.CELL_TYPE_STRING:  
                     f = Float.parseFloat(cell.getStringCellValue().trim());  
                     break;  
                 default:  
                     break;  
             }         
         }  
           
         return f;  
     }   
     public static long getLongCell(HSSFCell cell) {  
           
         return (long) getNumericCell(cell);  
     }  
       
     public static int getIntCell(Cell cell) {  
           
         return (int) getNumericCell(cell);  
     }  
       
     public static Date getDateCell(Cell cell) {  
      Date date = null;  
         if (cell != null) {  
             switch (cell.getCellType()) {  
                 case HSSFCell.CELL_TYPE_STRING:  
                     date = new Date(cell.getStringCellValue());  
                     break;  
                 case HSSFCell.CELL_TYPE_BLANK:  
                 case HSSFCell.CELL_TYPE_BOOLEAN:  
                 case HSSFCell.CELL_TYPE_ERROR:  
                     break;
                 default: date = cell.getDateCellValue();
             }  
         }  
           
         return date;  
     }  

}

第二种问题描述:

  在保存数值类型数据到excel文件时,excel中的数值只认识HSSFCell.CELL_TYPE_NUMERIC类型,此类型对应java中的double类型。比如把float值存入cell时,cell会自动处理成double值.

举个例子,我希望把float值保留两位小数的形式存入cell中,但打开excel文件发现cell中的数值并非两位小数。在float值存入之前,数值本身已经是两位小数,但在文件中并非如此表现。原因就是数值自动转为了double类型。现在我们知道问题的原因,解决办法也就很简单。我们写个方法,把float转为double类型,不劳它自己费心。自己转。哈哈

解决方案:

//double值保留俩位小数

 public double twoPointD(double d){
   BigDecimal bd = new BigDecimal(d);
   bd = bd.setScale(2,4);
   d = bd.doubleValue();
   return d;
 }

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/guoqingcun/archive/2010/12/09/6065070.aspx

抱歉!评论已关闭.