实现导出和导入,用到的是hutool工具类,代码官网上有,并且相对固定,可以收藏以后直接用。
1、导入依赖
- 导入hutool的依赖
<!--hutool工具-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.10</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.2</version>
</dependency>
2、实现导出
- 写导出接口
UserController.java
//导出
@GetMapping("/export")
public void export(HttpServletResponse response)throws Exception{
//从数据库查询出所有的数据
List<User>list=userService.list();
//在内存操作,写出到浏览器
ExcelWriter writer = ExcelUtil.getWriter(true);
//自定义标题别名 ,没有别名的话表头就是字段名了。这个可以不设置,这样的话导入导出就是可以相互转化的来
writer.addHeaderAlias("username","用户名");
writer.addHeaderAlias("password","密码");
writer.addHeaderAlias("nickname","昵称");
writer.addHeaderAlias("email","邮箱");
writer.addHeaderAlias("phone","电话");
writer.addHeaderAlias("address","地址");
writer.addHeaderAlias("creatTime","创建时间");
writer.addHeaderAlias("avatarUrl","头像");
//一次性写出list内的对象到excel,使用默认样式,强制输出标题
writer.write(list,true);
//设置浏览器响应的格式(一般都是固定的)
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
String fileName = URLEncoder.encode("用户信息","UTF-8");
response.setHeader("Content-Disposition","attachment;filename="+fileName+".xlsx");
ServletOutputStream out = response.getOutputStream();
writer.flush(out,true);
out.close();
writer.close();
}
- 可以不取别名,取别名的好处是导出的文件上是自己取的别名而不是数据库中的字段名。可以不取别名
- 其他的都是固定代码
- 测试导出接口
直接打开http://localhost:8081/user/export ,弹出下载文件,就成功了
3、实现导入
- 写导入接口
//导入
@PostMapping("/import")
public Boolean imp(MultipartFile file) throws Exception{
InputStream inputStream = file.getInputStream();
ExcelReader reader = ExcelUtil.getReader(inputStream);
List<User> list = reader.readAll(User.class); //要对应上自己数据库的字段名
System.out.println(list);
//导入到后端来,进行插入到数据库中
userService.saveBatch(list);
return true;
}
- 导入比导出相对繁琐,因为我们要找到相对应自己数据库字段的文件,并且不能含有id,因为我们的数据库自增的id,有id就插入不进去数据库
- 测试接口
打开swagger ,http://localhost:8081/swagger-ui.html
我上传的文件:
只有像这样表头名称对应上数据库的名字,并且不含id,才能被数据库插入进去。
4、VUE实现导入和导出
- 导入
</el-popconfirm>
<el-upload action="http://localhost:8081/user/import" :show-file-list="false" accept="'xlsx'" :on-success="handleImportSuccess" style="display:inline-block">
<el-button type="primary" class="ml-5">导入<i class="el-icon-top"></i></el-button>
</el-upload>
<script>
handleImportSuccess(){
this.$message.success("文件导入成功!")
this.load()
}
</script>
- 导出
<el-button type="primary" @click="exp" class="ml-5">导出<i class="el-icon-bottom"></i></el-button>
<script>
exp(){
window.open("http://localhost:8081/user/export")
}
</script>
打开前端页面进行导入导出操作,成功完成!