Java批量導入EXCEL數(shù)據(jù)
有些時候項目只是需要批量導入數(shù)據(jù)窘疮,這個時候就得使用程序遍歷導入慌烧。因為這個只是一個類似于工具類,所以沒必要整合到SpringBoot項目里面膏燕。類似這個demo一樣的工具程序我們可以寫在src下的test目錄下炭庙。
首先是獲取excel內容,遍歷excel以及獲取單元格對象用POI的apache提供的專門處理office的工具類
這里說一下excel的格式煌寇,.xls用HSSWorkBook接收輸入流焕蹄,如果是.xlsx就用XSSWorkBook接收輸入流,想兩者兼容可以加一個檢驗阀溶,或文件名再檢驗是否包含.xls還是.xlsx
還有一點要注意的是腻脏,單元格如果是數(shù)字鸦泳,獲取單元格內容的方法getValue會進行精度處理。例如100會變成100.0永品,如果你不想它轉化可以在轉化成字符串的時候再截取一下做鹰。
下面附上代碼:public List<Map<String,Object>> importShouldPayBill(MultipartFile upLoadFile)throws Exception{
String fileName=upLoadFile.getOriginalFilename();
String format=fileName.substring(fileName.lastIndexOf("."));
InputStream inputStream = upLoadFile.getInputStream();
Sheet sheet=null;
if(format.equals(".xls")){
HSSFWorkbook hwb=new HSSFWorkbook(inputStream);
sheet=hwb.getSheetAt(0);
}else if(format.equals(".xlsx")){
XSSFWorkbook hwb=new XSSFWorkbook(inputStream);
sheet=hwb.getSheetAt(0);
}
if(sheet==null){
throw buileSmartExceptionFactory.getInstance(ManagesystemErrorMsg.FILE_NOT_CONTENT);
}
List<Map<String,Object>>list=new ArrayList<>();
List<String>headList=new ArrayList<>();
for(int rowNumb=0;rowNumb<=sheet.getLastRowNum();rowNumb++){
Row hssfRow=sheet.getRow(rowNumb);
if(hssfRow==null){
continue;
}
Map<String,Object>map=new LinkedHashMap<>();
for (int cellNum=0;cellNum<=hssfRow.getLastCellNum();cellNum++){
Cell hssfCell=hssfRow.getCell(cellNum);
if(hssfCell==null||"".equals(String.valueOf(hssfCell))){
continue;
}
if(rowNumb==0){
headList.add(String.valueOf(getValue(hssfCell)));
//校驗表頭格式
}else{
map.put(headList.get(cellNum),getValue(hssfCell));
}
}
if(!"樓棟".equals(headList.get(0))||!"房屋".equals(headList.get(1))){
throw buileSmartExceptionFactory.getInstance(ManagesystemErrorMsg.FILE_FAIL_FORMAT);
}
list.add(map);
}
inputStream.close();
list.remove(0);
return list;
}