一. 单元格为数字 Cell cell = row.getCell(int t) 的返回值 为 xx.0 的问题处理
由于数据库中定义的是varchar 类型 xx.0 的数据 会影响业务的逻辑
1.第一种办法,获取值的时候转换类型
double tcell = cell.getNumericCellValue();
再把double 转成你需要的格式
2.第二种办法 使用 NumberFormat (DecimalFormat) 来处理数据
String result = new String();
double value = cell.getNumericCellValue();
DecimalFormat format = new DecimalFormat();
result = format.format(value);
PS:这里需要注意 如果传的数值是 科学计数法的 科学计数法的数字就转换成了带逗号的,
例如:12345678912345的科学计数法是1.23457E+13,经过这个格式化后就变成了字符串“12,345,678,912,345”,
或者是这个数值本身比较大, 在EXCEL中显示的时候是
![在这里插入图片描述] 这也并不是想要的结果
所以 我们需要 进行一下数据的处理
if(result!=null && result.indexOf(",")>=0){
result = result.replaceAll(",","");
}
这样就达到预期的结果了
二.有关时间格式的数据处理 (拷用了前辈的方法)
我把它和数字的处理合成了一个方法.
/**
* 判断单元格的内容 属于什么类型的数据 相应进行转换
* @param cell 数据对象
* @return
*/
@SuppressWarnings("deprecation")
public static Object getCellFormatValue(Cell cell) {
Object cellValue = null;
if (cell != null) {
// 判断cell类型
switch (cell.getCellType()) {
case Cell.CELL_TYPE_NUMERIC: // 数字
cellValue = stringDateProcess(cell);
break;
case Cell.CELL_TYPE_STRING: // 字符串
cellValue = String.valueOf(cell.getStringCellValue());
break;
case Cell.CELL_TYPE_BOOLEAN: // Boolean
cellValue = String.valueOf(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_FORMULA: // 公式
cellValue = String.valueOf(cell.getCellFormula());
break;
case Cell.CELL_TYPE_BLANK: // 空值
cellValue = cell.getStringCellValue();
break;
case Cell.CELL_TYPE_ERROR: // 异常
cellValue = "非法字符";
break;
default:
cellValue = cell;
break;
}
} else {
cellValue = "";
}
return cellValue;
}
/**
* 解析Excel日期格式转换方法
* @param cell 数据对象
* @return
*/
public static String stringDateProcess(Cell cell) {
String result = new String();
if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式
SimpleDateFormat sdf = null;
if (cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("h:mm")) {
sdf = new SimpleDateFormat("HH:mm");
} else {// 日期
sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
}
Date date = cell.getDateCellValue();
result = sdf.format(date);
} else if (cell.getCellStyle().getDataFormat() == 58) {
// 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
double value = cell.getNumericCellValue();
Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value);
result = sdf.format(date);
} else {
double value = cell.getNumericCellValue();
CellStyle style = cell.getCellStyle();
DecimalFormat format = new DecimalFormat();
String temp = style.getDataFormatString();
// 单元格设置成常规
if (temp.equals("General")) {
format.applyPattern("#");
}
result = format.format(value);
if (result!=null && result.indexOf(",")>=0) {
result = result.replaceAll(",","");
}
}
return result;
}
补充: 在实现完成之后,还遇到一个这样的问题. 如果给的数据小数位过长DecimalFormat 只会保留3位小数. 下面给出处理办法
0和#都是占位符,但在不同的地方,作用不一样。下面对他们做了具体的比较。
希望对大家有所帮助。
0:
比实际数字的位数多,不足的地方用0补上。
new DecimalFormat("00.00").format(3.14) //结果:03.14
new DecimalFormat("0.000").format(3.14) //结果: 3.140
new DecimalFormat("00.000").format(3.14) //结果:03.140
比实际数字的位数少:整数部分不改动,小数部分,四舍五入
new DecimalFormat("0.000").format(13.146) //结果:13.146
new DecimalFormat("00.00").format(13.146) //结果:13.15
new DecimalFormat("0.00").format(13.146) //结果:13.15
#:
**比实际数字的位数多,不变。**
new DecimalFormat("##.##").format(3.14) //结果:3.14
new DecimalFormat("#.###").format(3.14) //结果: 3.14
new DecimalFormat("##.###").format(3.14) //结果:3.14
比实际数字的位数少:整数部分不改动,小数部分,四舍五入
new DecimalFormat("#.###").format(13.146) //结果:13.146
new DecimalFormat("##.##").format(13.146) //结果:13.15
new DecimalFormat("#.##").format(13.146) //结果:13.15
```
EX: DecimalFormat format = new DecimalFormat("#.##########"); ####代表你要保留的几位小数,
根据自己业务情况而定.