Java批量导入EXCEL数据
有些时候项目只是需要批量导入数据,这个时候就得使用程序遍历导入。因为这个只是一个类似于工具类,所以没必要整合到SpringBoot项目里面。类似这个demo一样的工具程序我们可以写在src下的test目录下。
首先是获取excel内容,遍历excel以及获取单元格对象用POI的apache提供的专门处理office的工具类
这里说一下excel的格式,.xls用HSSWorkBook接收输入流,如果是.xlsx就用XSSWorkBook接收输入流,想两者兼容可以加一个检验,或文件名再检验是否包含.xls还是.xlsx
还有一点要注意的是,单元格如果是数字,获取单元格内容的方法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;
}