JAVA使用POL导入Excel解决数据精度问题
解决导入时数据精度损失问题
这篇文章主要是给Excel数据导入时存在精度损失问题提出解决方案。如果你想知道怎么解决,可仔细阅读, 可以仔细阅读这篇文章。
问题描述
我在前段时间开发中涉及到一个关于excel模板导入并且入库的需求,中间在使用wps提供的excel文档并没有出现问题,问题出现在我们测试小姐姐使用office提供的excel文档导入时出现了如同所示的问题
1.在文档中是137.8 2.导入后精度加了
具体为什么wps和office解析出来的结果会有所不同,我也不知道,我在网上看来很多方法,最终结合起来写出如下代码
解决方案
先定义如下方法
public String getCellValue(Cell keyCell){
// 取得类型
int cellType = keyCell.getCellType();
// 定义接收
String cellValue = "";
switch (cellType) {
case Cell.CELL_TYPE_NUMERIC: // 数字
double numericCellValue = keyCell.getNumericCellValue();
// 核心代码 ⇒ 用于解决科学计数法导致的数字转码问题
DataFormatter dataFormatter = new DataFormatter();
dataFormatter.addFormat("###########", null);
String driveriphone = dataFormatter.formatCellValue(keyCell);
// 这个 IsNumber()是我定义的一个正则,主要用来校验是否是存数字
if (IsNumber(driveriphone)) {
keyCell.setCellType(CellType.STRING);
cellValue = keyCell.getStringCellValue();
} else {
cellValue = Double.toString(numericCellValue);
}
break;
case Cell.CELL_TYPE_STRING: // 字符串
cellValue = String.valueOf(keyCell.getStringCellValue());
break;
case Cell.CELL_TYPE_BOOLEAN: // Boolean
cellValue = String.valueOf(keyCell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_FORMULA: // 公式
try {
double numericCellValue1 = keyCell.getNumericCellValue();
cellValue = Double.toString(numericCellValue1);
} catch (IllegalStateException e) {
cellValue = String.valueOf(keyCell.getRichStringCellValue());
}
break;
case Cell.CELL_TYPE_BLANK: // 空值
cellValue = "";
break;
case Cell.CELL_TYPE_ERROR: // 故障
cellValue = "非法字符";
break;
default:
cellValue = "未知类型";
break;
}
return cellValue;
}
// 正则代码
private static boolean match(String regex, String str) {
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
return matcher.matches();
}
// 正则代码
public static boolean IsNumber(String str) {
String regex = "^[0-9]\d*$";
return match(regex, str);
}
结语
把这个代码结合自身业务代码,选择性放入到合适的位置,即可使用
