JAVA使用POL导入Excel解决数据精度问题

JAVA使用POL导入Excel解决数据精度问题

  • 解决导入时数据精度损失问题
    • 问题描述
    • 解决方案
    • 结语

解决导入时数据精度损失问题

这篇文章主要是给Excel数据导入时存在精度损失问题提出解决方案。如果你想知道怎么解决,可仔细阅读, 可以仔细阅读这篇文章。

问题描述

我在前段时间开发中涉及到一个关于excel模板导入并且入库的需求,中间在使用wps提供的excel文档并没有出现问题,问题出现在我们测试小姐姐使用office提供的excel文档导入时出现了如同所示的问题

1.在文档中是137.8
在文档中是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);
  }

结语

把这个代码结合自身业务代码,选择性放入到合适的位置,即可使用

你可能感兴趣的:(开发时的解决方案,java,excel,正则表达式)