文章目录
- 前言
- 1 EasyExcel的导入导出
- 导出
- 1 导入依赖
- 2 项目中的CourseEntity实体类
- 3 CoureseVo VO类 (对CourseEntity进行EasyExcel导入导出操作)
- 4 导出代码的编写 并最终测试导出效果
- 5 (前端内容 可选)通过vue按钮点击 导出
- 导入
- 1 导入依赖 跟导出相同
- 2 创建回调监听器
- 3 编写导入代码
- 4 最终测试
前言
介绍
excel的导入导出
两种方式
(1 EasyExcel(alibaba) 2 Hutool工具类)
已经实现了 1 EasyExcel 的导入导出
待完善 2023/4/18
1 EasyExcel的导入导出
导出
1 导入依赖
<!-- easyexcel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.1</version>
</dependency>
2 项目中的CourseEntity实体类
项目用到的课程实体类
这个实体类是我们DAO层绑定用的
不能使用这个实体类操作EasyExcel 我们等会儿再创建一个VO类
用VO类 操作EasyExcel
这里使用的是mybatis-plus的操作方式
@TableName("course") 注解绑定的是数据库中的course表
@TableId(type = IdType.AUTO) 主键ID ID为AUTO自增策略
/**
* 课程表
*/
@Data
@TableName("course")
public class CourseEntity {
/**
* 主键
*/
@TableId(type = IdType.AUTO)
private Integer id;
/**
* 课程id
*/
private Integer cid;
/**
* 课程名
*/
private String name;
}
3 CoureseVo VO类 (对CourseEntity进行EasyExcel导入导出操作)
@ExcelIgnore 忽略 也就是导出的时候没有这个字段
@ExcelProperty(value = "课程id",index = 0)
value是指 导出到excel中的列名称
Index 是指在第几列 0 代表在第一列
@Data
public class CoureseVo {
/**
* 主键
*/
@ExcelIgnore
private Integer id;
/**
* 课程id
*/
@ExcelProperty(value = "课程id",index = 0)
private Integer cid;
/**
* 课程名
*/
@ExcelProperty(value = "课程名称",index = 1)
private String name;
}
4 导出代码的编写 并最终测试导出效果
这里为了方便
就在controller层写了
你当然可以抽出逻辑写到service层 这都无所谓
@RestController
@RequestMapping("/excel")
public class EasyExcelController {
//注入的是Mybatis-plus Dao层
// 这个CourseDao 与数据库中的course 表已经绑定了
//这里注入 DAO 直接调Dao的方法进行测试
@Autowired
CourseDao courseDao;
@RequestMapping("/export")
public void export(HttpServletResponse response) throws IOException {
//1 设置下载
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("数据字典", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename="+ fileName + ".xlsx");
// 2 查所有course实体 封装到coureseVo中 再把coureseVo通过Easyexcel写出
// coureseVo相当于 course实体 和 Easyexcel工具的一个中介 实现了解耦
List<CourseEntity> courseEntities = courseDao.selectList(null);
ArrayList<CoureseVo> vos = new ArrayList<>();
for (CourseEntity courseEntity : courseEntities) {
CoureseVo coureseVo = new CoureseVo();
BeanUtils.copyProperties(courseEntity,coureseVo);
vos.add(coureseVo);
}
//write写出(输出位置,输出类型) .sheet(标题) .diwrite(实际写出的list集合数据)
EasyExcel.write(response.getOutputStream(), CoureseVo.class).sheet("数据库课程").doWrite(vos);
}
}
结果 测试
直接启动项目,浏览器 url 端口加路径访问
结果
5 (前端内容 可选)通过vue按钮点击 导出
1 <template 标签内容>
<div class="el-toolbar">
<div class="el-toolbar-body"style="justify-content: flex-start;">
<el-button type="text"@click="exportData"><i class="fa fa-plus"/> 导出</el-button>
</div>
</div>
2 <script标签内容>
调我们后端写的接口
exportData() {
window.location.href = 'http://localhost:8202/admin/cmn/dict/exportData'
}
导入
1 导入依赖 跟导出相同
2 创建回调监听器
package com.example.cat.EasyExcelListen;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.example.cat.dao.CourseDao;
import com.example.cat.entity.CoureseVo;
import com.example.cat.entity.CourseEntity;
import org.springframework.beans.BeanUtils;
//监听器类
//需要继承阿里的 AnalysisEventListener 泛型里写 EasyExcel工具和实体类的 中介VO类
public class courseListener extends AnalysisEventListener<CoureseVo> {
//这里注入 mybatis-plus Dao层 方便我们对从excel表中读到的数据进行处理
private CourseDao courseDao;
public courseListener(CourseDao courseDao) {
this.courseDao = courseDao;
}
//这个方法会 一行一行的读取 excel
//把excel 中的一行内容变成 一个 中介类coureseVo
@Override
public void invoke(CoureseVo coureseVo, AnalysisContext analysisContext) {
//创建数据库中对应的实体类
CourseEntity courseEntity = new CourseEntity();
//把每个中介类VO的 属性 copy给 数据库中对应的实体类
BeanUtils.copyProperties(coureseVo,courseEntity);
//添加到数据库中 实现到导入
courseDao.insert(courseEntity);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}
3 编写导入代码
我这里直接在cont
这里为了方便
就在controller层写了
你当然可以抽出逻辑写到service层 这都无所谓
@RestController
@RequestMapping("/excel")
public class EasyExcelController {
//注入的是Mybatis-plus Dao层
// 这个CourseDao 与数据库中的course 表已经绑定了
//这里注入 DAO 直接调Dao的方法进行测试
@Autowired
CourseDao courseDao;
@RequestMapping("/import")
public void importData(MultipartFile file) throws IOException {
System.out.println("打印出来的是_" + file.toString());
//导入操作
// read(文件中,读的类型,设置监听器(传入一个Mybatis-plus的dao 方便数据添加))
EasyExcel.read(file.getInputStream(),CoureseVo.class,new courseListener(courseDao)).sheet().doRead();
}
}
4 最终测试
先准备一个excel
使用POSTMAN访问接口
插入成功