1. 程式人生 > >POI解析Excel,解決長數字變成科學計數法或double的問題

POI解析Excel,解決長數字變成科學計數法或double的問題

最近在做專案的時候需要用的POI解析Excel,該Excel中資料型別較多,有日期型,整型,double型,文字型。但是在處理時碰見了以下兩個問題:

  1. 遇到數字型別時,雖然Excel中設定為文字型別,但是POI的Cell型別依然會變為數字型別,而且當數字比較長的時候,讀取出來的結果還會變成科學計數法的形式。

  2. 數字無論是否為小數還是整型,當使用cell.getNumbericCellValue()來讀取內單元格內容的時候,都會統一當成Double型別來處理。

為了解決以上問題,即獲取單元格的原始資料,統一用DecimalFormat對double進行格式化即可。如下:

DecimalFormat df = new
DecimalFormat("0"); String cellText = df.format(cell.getNumericCellValue());

這裡附上獲取單元格內容的相關程式碼。

public class ExcelUtil {
    private String           val = null;
    private SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); //日期格式yyyy-mm-dd
    private DecimalFormat    df = new DecimalFormat("0"
); //數字格式,防止長數字成為科學計數法形式,或者int變為double形式 List<ArrayList<String>> strLists = new ArrayList<ArrayList<String>>(); //存放Excel中的資料 /** * @author: LS * 2016-8-27 下午7:04:26 * @return List<ArrayList<String>> * @throws FileNotFoundException,IOException,InvalidFormatException * POI方式解析EXCEL表格(2007以上版本,xlsx) */
public List<ArrayList<String>> poiReadXExcel(String file) throws FileNotFoundException, IOException, InvalidFormatException { FileInputStream input = new FileInputStream(new File(file)); //讀取的檔案路徑 XSSFWorkbook wb = new XSSFWorkbook(new BufferedInputStream(input)); XSSFSheet sheet = wb.getSheetAt(0); //獲取第一張表 int rowNum = sheet.getPhysicalNumberOfRows();//得到資料的行數 System.out.println("行數:" + rowNum); strLists.clear(); //遍歷行 for (int i = 0; i < rowNum; i++) { List<String> strList = new ArrayList<String>(); XSSFRow row = sheet.getRow(i); int colNum = row.getPhysicalNumberOfCells();//得到當前行中存在資料的列數 //遍歷列 for (int j = 0; j < colNum; j++) { XSSFCell cell = row.getCell(j); strList.add(getXCellVal(cell)); } strLists.add(i, (ArrayList<String>) strList); //儲存該行 } //列印 for (ArrayList<String> stringList : strLists) { for (String str : stringList) { System.out.print(str + " "); } System.out.println(); } wb.close(); return strLists; } /** * @author: LS * 2016-8-25 下午7:40:05 * @param cell * @return String * 獲取單元格中的值 */ private String getXCellVal(XSSFCell cell) { switch (cell.getCellType()) { case XSSFCell.CELL_TYPE_NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { val = fmt.format(cell.getDateCellValue()); //日期型 } else { val = df.format(cell.getNumericCellValue()); //數字型 } break; case XSSFCell.CELL_TYPE_STRING: //文字型別 val = cell.getStringCellValue(); break; case XSSFCell.CELL_TYPE_BOOLEAN: //布林型 val = String.valueOf(cell.getBooleanCellValue()); break; case XSSFCell.CELL_TYPE_BLANK: //空白 val = cell.getStringCellValue(); break; case XSSFCell.CELL_TYPE_ERROR: //錯誤 val = "錯誤"; break; case XSSFCell.CELL_TYPE_FORMULA: //公式 try { val = String.valueOf(cell.getStringCellValue()); } catch (IllegalStateException e) { val = String.valueOf(cell.getNumericCellValue()); } break; default: val = cell.getRichStringCellValue() == null ? null : cell.getRichStringCellValue().toString(); } return val; } }