原文出自:https://blog.csdn.net/seesun2012
java
這是一個execl文件導入數據庫
操做,使用jxl解析execl導入數據庫過程出現了科學計數法
,與想要導入的數據不匹配,如下是案例以及解決方案:數據庫
導入成功後示例:
一、手機號:15388886666
科學計數法:1.54E+10
二、數字:123456789000000
科學計數法:1.23E+14
三、身份證:432222198808083789
科學計數法:4.32E+17
.net
解決思路:
一、判斷是否爲數字類型(NUMBER)或數字計算公式(NUMBER_FORMULA);
二、獲取解析後的值進行判斷是否包含有(E、e、+等符號);
三、使用java自帶數學類,將科學計算公式轉換成所需類型。excel
具體代碼:code
// 解析Execl public static List<String[]> readExcel(File filePath) { List<String[]> list = new ArrayList<String[]>(); // 日期的格式化 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { // 以IO流的形式讀取文件 InputStream in = new FileInputStream(filePath); // 獲取工做簿 Workbook book = Workbook.getWorkbook(in); // 獲取工做表 Sheet sheet = book.getSheet(0); // 獲得總列數 int columns = sheet.getColumns(); // 獲得總行數 int rows = sheet.getRows(); for (int k = 2; k < rows; k++) { // 行 String[] row = new String[columns]; for (int i = 0; i < columns; i++) { // 列 Cell cell = sheet.getCell(i, k); // 得到cell具體類型值的方式 if (cell.getType() == CellType.LABEL) { LabelCell labelcell = (LabelCell) cell; row[i] = labelcell.getString(); }else if (cell.getType() == CellType.DATE) {// excel 類型爲時間類型處理; DateCell dc = (DateCell) cell; row[i] = sdf.format(dc.getDate()); }else if (cell.getType() == CellType.NUMBER || cell.getType() == CellType.NUMBER_FORMULA) {// excel 類型爲數值類型處理; NumberCell nc = (NumberCell) cell; // 判斷是否爲科學計數法(包含E、e、+等符號) if ((""+nc.getValue()).indexOf("E")!=-1 || (""+nc.getValue()).indexOf("e")!=-1 || (""+nc.getValue()).indexOf("+")!=-1) { BigDecimal bd = new BigDecimal(""+nc.getValue()); row[i] = bd.toString(); }else{ row[i] = "" + nc.getValue(); } } else { // 通用的獲取cell值的方式,返回字符串 row[i] = cell.getContents(); } } // 添加到list集合中 list.add(row); } // 關閉工做薄 book.close(); } catch (Exception e) { e.printStackTrace(); } return list; }