欢迎大家来到IT世界,在知识的湖畔探索吧!
引入 Maven 依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.1</version>
</dependency>
欢迎大家来到IT世界,在知识的湖畔探索吧!
导出、导入数据模型
Book.java
欢迎大家来到IT世界,在知识的湖畔探索吧!import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
@TableName("t_book")
public class Book {
@TableId
@ExcelIgnore
private String id;
@ExcelProperty(value = "书名")
@ColumnWidth(50)
private String name;
@ExcelProperty("作者")
private String author;
/** 封面图片地址 */
@ExcelIgnore
private String coverUrl;
@ExcelProperty("出版社")
@ColumnWidth(20)
private String publisher;
@ExcelProperty("评分")
private Double score;
/** 状态 */
@ExcelIgnore
private Integer status;
/** 排序序号 */
@ExcelIgnore
private Integer orderNo;
/** 创建者 */
@ExcelIgnore
private String createBy;
/** 创建时间 */
@ExcelProperty("创建时间")
@ColumnWidth(20)
@DateTimeFormat("yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/** 更新者 */
@ExcelIgnore
private String updateBy;
/** 更新时间 */
@ExcelIgnore
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}
数据导出功能
数据导出功能具体实现代码如下:
@RequestMapping("/export")
public void exportData(HttpServletResponse response) throws Exception {
// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("书籍", "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
List<Book> books = bookService.all();
EasyExcel.write(response.getOutputStream(), Book.class).sheet("书籍").doWrite(books);
}
数据导出功能实现比较简单,只需要指定输出流、导出模型对象、sheet名称、导出数据就可以了。
测试:在浏览器地址栏输入localhost:8001/book/export会直接弹出保存文件的对话框,文件名为:书籍.xlsx。
数据导入功能
数据导入需要如下3个前提条件:
- 一个回调监听器:ImportListener,监听数据变化,满足条件时调用数据持久化方法
- 一个有保存数据方法的接口:ExcelImporter,供其它具体数据持久化类实现
- 一个 Service 实现 ExcelImporter,实现具体的数据持久化操作
ImportListener.java
欢迎大家来到IT世界,在知识的湖畔探索吧!import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import jenny.learn.springboot.excel.support.ExcelImporter;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.RequiredArgsConstructor;
import java.util.ArrayList;
import java.util.List;
@Data
@RequiredArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class ImportListener<T> extends AnalysisEventListener<T> {
/**
* 默认每隔3000条存储数据库
*/
private int batchCount = 3000;
/**
* 缓存的数据列表
*/
private List<T> list = new ArrayList<>();
/**
* 数据导入类
*/
private final ExcelImporter<T> importer;
@Override
public void invoke(T data, AnalysisContext analysisContext) {
list.add(data);
// 达到BATCH_COUNT,则调用importer方法入库
if (list.size() >= batchCount) {
// 调用importer方法
importer.save(list);
// 存储完成清理list
list.clear();
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
// 调用importer方法
importer.save(list);
// 存储完成清理list
list.clear();
}
}
ExcelImporter.java
import java.util.List;
public interface ExcelImporter<T> {
/**
* 导入数据逻辑
*
* @param data 数据集合
*/
void save(List<T> data);
}
数据导入功能具体实现代码如下:
@RequestMapping("/import")
public void importData(MultipartFile file) throws Exception {
// 回调监听器
ImportListener<Book> importListener = new ImportListener<>(bookService);
EasyExcel.read(file.getInputStream(), Book.class, importListener).sheet().doRead();
}
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/17901.html