17. SpringBoot+Vue实现数据的批量导入和导出
全部数据批量导出
ExcelWriter writer = ExcelUtil.getWriter(true);
writer.write(list, true);
// 设置浏览器响应的格式
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("用户信息表", "UTF-8") + ".xlsx");
ServletOutputStream out = response.getOutputStream();
writer.flush(out, true);
out.close();
writer.close();
为什么导出数据的时候会发生这个错误呢?

https://doc.hutool.cn/pages/poi/#%E4%BB%8B%E7%BB%8D
找依赖
https://mvnrepository.com/
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
如何给导出的 excel 表头设置中文?
只需要在实体类的属性上面加一个注解 @Alias("中文")
部分数据批量导出
为什么会翻车?
因为没写查询条件

@GetMapping("/export")
public void exportData(@RequestParam(required = false) String username,
@RequestParam(required = false) String name,
HttpServletResponse response) throws IOException {
ExcelWriter writer = ExcelUtil.getWriter(true);
// 第一种全部导出
List<User> list = new ArrayList<>();
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StrUtil.isNotBlank(username), "username", username);
queryWrapper.like(StrUtil.isNotBlank(name), "name", name);
list = userService.list(queryWrapper); // 查询出当前User表的所有数据
writer.write(list, true);
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("用户信息表", "UTF-8") + ".xlsx");
ServletOutputStream outputStream = response.getOutputStream();
writer.flush(outputStream, true);
writer.close();
outputStream.flush();
outputStream.close();
}
三种情况的导出完整的代码
@GetMapping("/export")
public void exportData(@RequestParam(required = false) String username,
@RequestParam(required = false) String name,
@RequestParam(required = false) String ids, // 1,2,3,4,5
HttpServletResponse response) throws IOException {
ExcelWriter writer = ExcelUtil.getWriter(true);
List<User> list;
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
if (StrUtil.isNotBlank(ids)) { // ["1", "2", "3"] => [1,2,3]
List<Integer> idsArr1 = Arrays.stream(ids.split(",")).map(Integer::valueOf).collect(Collectors.toList());
queryWrapper.in("id", idsArr1);
} else {
// 第一种全部导出或者条件导出
queryWrapper.like(StrUtil.isNotBlank(username), "username", username);
queryWrapper.like(StrUtil.isNotBlank(name), "name", name);
}
list = userService.list(queryWrapper); // 查询出当前User表的所有数据
writer.write(list, true);
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("用户信息表", "UTF-8") + ".xlsx");
ServletOutputStream outputStream = response.getOutputStream();
writer.flush(outputStream, true);
writer.close();
outputStream.flush();
outputStream.close();
}
批量导入
InputStream inputStream = file.getInputStream();
ExcelReader reader = ExcelUtil.getReader(inputStream);
List<Address> list = reader.readAll();
导入数据出错了:

出现这个错误的原因是什么?

因为 user 表导入的数据的用户名重复了
导入完整的代码
@PostMapping("/import")
public Result importData(MultipartFile file) throws IOException {
ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
List<User> userList = reader.readAll(User.class);
// 写入数据到数据库
try {
userService.saveBatch(userList);
} catch (Exception e) {
e.printStackTrace();
return Result.error("数据批量导入错误");
}
return Result.success();
}
前端 Vue 的导入和导出代码
handleImport(res, file, fileList) {
if (res.code === '200') {
this.$message.success("操作成功")
this.load(1)
} else {
this.$message.error(res.msg)
}
},
exportData() { // 批量导出数据
if (!this.ids.length) { // 没有选择行的时候,全部导出 或者根据我的搜索条件导出
window.open('http://localhost:9090/user/export?token=' + this.user.token + "&username="
+ this.username + "&name=" + this.name)
} else { // [1,2,3] => '1,2,3'
let idStr = this.ids.join(',')
window.open('http://localhost:9090/user/export?token=' + this.user.token + '&ids=' + idStr)
}
},