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