前言
最近还得写excel的导入导出,结果还是得百度,虽然都能看懂,但是还是想记录下来这些东西
正文
1. 导入jar包
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency>
2. 开始导入
@RequestMapping(value = "importUsers",method = RequestMethod.POST) public Map<String,Object> importUsers(MultipartFile userFile){ Map<String,Object> resultMap = new HashMap<>(); if(userFile == null || userFile.isEmpty()){ resultMap.put("success", false); resultMap.put("msg", "数据文件不存在"); return resultMap; }
//开启新的线程来处理导入,并使用callback接受结果 FutureTask<Map<String,Object>> task = new FutureTask<>( ()->userService.importUsers(userFile) ); new Thread(task).start(); try { resultMap = task.get(); } catch (Exception e) { e.printStackTrace(); } return resultMap; }
3. 业务层
@Override public Map<String, Object> importUsers(MultipartFile userFile) { Map<String,Object> resultMap = new HashMap<>(); try { //获取文件的输入流 InputStream inputStream = userFile.getInputStream(); //根据不同类型excel创建book页。 String fileName = userFile.getOriginalFilename(); Workbook book = null; if(fileName.endsWith(XLSX)){ book = new XSSFWorkbook(inputStream); }else if(fileName.endsWith(XLS)){ book = new HSSFWorkbook(inputStream); }else{ resultMap.put("success", false); resultMap.put("msg", "文件格式有误!"); return resultMap; } if(book != null){ //第一个工作簿 Sheet sheet = book.getSheetAt(0); //将结果转换成集合 List<User> users = convert(sheet); for (User u : users) { userMapper.insert(u); } System.out.println(users); } resultMap.put("success", true); resultMap.put("msg", "上传成功!"); return resultMap; } catch (IOException e) { e.printStackTrace(); } return resultMap; }
/**
* 将每行数据封装成一个对象
*/
private List<User> convert(Sheet sheet){
List<User> userList = new ArrayList<>();
for (int i = 2; i <= sheet.getLastRowNum() ; i++) {
//第一行,第二行跳过,是记录名和字段名,从第三行开始
Row row = sheet.getRow(i);
User user = new User();
Iterator<Cell> iterator = row.cellIterator();
while (iterator.hasNext()){
Cell cell = iterator.next();
if(cell.getColumnIndex() == 1){
//第二列,类型设置为string,然后赋值给name
cell.setCellType(CellType.STRING);
user.setPhone(cell.getStringCellValue());
}
if(cell.getColumnIndex() == 3){
//第三列,时间格式
if(DateUtil.isCellDateFormatted(cell)){
Date date = cell.getDateCellValue();
user.setCreateDate(date);
}
}
if(cell.getColumnIndex() == 2){
//第二列,类型设置为string,然后赋值给name
cell.setCellType(CellType.STRING);
user.setPassword(cell.getStringCellValue());
}
}
userList.add(user);
}
return userList;
}
到现在为止,已经实现了excel的导入了!
需要注意的是:这里必须根据模板来进行数据的取出并分别赋值给不同的属性。