1.使用插件阿里提供的easyexcel 官网链接:https://github.com/alibaba/easyexcel
2.文件名称乱码问题解决
3.这里的示例–同步上传和下载,阿里的插件也支持异步写入
4.最重要的是使用简单,只需一到两行代码即可
依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.6</version>
</dependency>
web请求,excel上传
controller:
@ApiOperation("使用excel批量创建用户")
@ApiImplicitParams({
@ApiImplicitParam(paramType = "header", name = RequestConstants.AUTHORIZATION, dataType = "String", required = true, value = "用户token")
})
@PostMapping(value = "/api/user-service/users")
public CommonResult<String> createUsers(@RequestBody MultipartFile file) {
return CommonResult.ok(userService.addUsersFromFile(file));
}
service:
一行代码就可以解决excel上传解析为对象列表
EasyExcel.read(file.getInputStream()).head(ImportUser.class).sheet().doReadSync();
public String addUsersFromFile(MultipartFile file) {
List<User> list = null;
try {
list = EasyExcel.read(file.getInputStream()).head(ImportUser.class).sheet().doReadSync();
} catch (IOException e) {
log.error("file read error", e);
throw new PlatformException(ErrorCode.FILE_READ_ERROR);
}
if (CollectionUtils.isEmpty(list)) {
return "文件没有数据";
}
for (User data : list) {
log.info("读取到数据:{}", JSON.toJSONString(data));
try {
UserAddRequest userAddRequest = new UserAddRequest();
userAddRequest.setUsername(data.getUsername());
userAddRequest.setCellphone(data.getCellphone());
userAddRequest.setRole(UserRole.getRoleByName(data.getRole()).getRoleType());
userAddRequest.setJob(data.getJob());
userAddRequest.setCompany(data.getCompany());
addUser(userAddRequest);
} catch (PlatformException e) {
return data.getUsername() + "-" + data.getCellphone() + ":" + e.getMessage();
} catch (Exception e) {
return data.getUsername() + "-" + data.getCellphone() + ":" + "该条数据插入失败,请重试";
}
}
return "批量用户创建成功";
}
web请求,excel导出
controller:
@ApiOperation("学生学期成绩导出")
@GetMapping("/api/service/terms/{termId}/result/export")
public void exportTermStudents(@PathVariable Long termId, HttpServletResponse response) {
termService.exportTermStudents(termId, response);
}
service:
文件乱码解决:
response.setHeader(“Content-disposition”, “attachment;filename*=utf-8’’” + fileName + “.xlsx”);
针对不是固定head的可以自定义head:
EasyExcel.write(response.getOutputStream()).head(head).sheet() .doWrite(data);
固定head的:
EasyExcel.write(response.getOutputStream(),Data.class).sheet().doWrite(data);
public void exportTermStudents(Long termId, HttpServletResponse response) {
String termName="测试学期名称导出";
List<Performance> performances=Lists.newArrayList();// 具体数据来源逻辑--自行写入
response.setContentType("application/x-xls; charset=UTF-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = null;
try {
fileName = URLEncoder.encode(termName + "成绩单", "UTF-8");
} catch (UnsupportedEncodingException e) {
log.error("file name is error");
}
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
try {
EasyExcel.write(response.getOutputStream()).head(head).sheet()
.doWrite(performances);
} catch (IOException e) {
e.printStackTrace();
}
}