暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

EasyExcel Springboot实现导入导出excel

精准丶优雅 2021-08-25
574

如何创建springboot项目就不做赘述了直接开始导入导出吧

1.引入easyexcel 依赖

 <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>${easyexcel-version}</version>
</dependency>
<easyexcel-version>2.2.10</easyexcel-version>
复制

2.在需要导入导出的实体类上添加模板注解

/**
* 专题名称
*/
@ExcelProperty(index = 0,value = "专题名称")
@Column(name = "special", nullable = true,length = 255)
private String special;


/**
* 标题名称
*/
@ExcelProperty(index = 1,value = "标题名称")
@Column(name = "title", nullable = true ,length = 255)
private String title;


/**
* 技术栈ID
*/
@ExcelIgnore
@Column(name = "technology_id", nullable = true, length = 36)
private String technologyId;
复制

2.1@ExcelProperty(index = 1,value = "标题名称")该注解标注 需要导入导出的字段

2.2@ExcelIgnore 该注解标注 无需导入导出的字段

3.导出excel

-------------------------------------------------直接上代码-------------------------------------------

/**
* @Description: 导出
* @Author: Kra
* @Date: 2021/8/19 13:22
*/
@Override
public void export(HttpServletResponse response) throws IOException {
// 注意:easyexcel 最多显示0-1048576条数据 超过会报错需要处理
// 1.获取面经题库所有的条数
Integer number = questionBankRepository.getCount();
// 2.计算按每页五万条数据可以存放几页
Integer sheetPage = number % excelPageNumber == 0 ?number/excelPageNumber : number/excelPageNumber + 1;
ServletOutputStream out = response.getOutputStream();
log.info("开始导出{}数据...",sheetName);
// 3.创建excel写入对象
ExcelWriter excelWriter = EasyExcel.write(out, QuestionBank.class).build();
for (Integer i = 1; i <= sheetPage; i++) {
Page<QuestionBank> questionBanks = questionBankRepository.findAll(LimitParaUtils.getPageRequest(i, excelPageNumber));
// 4.1.创建sheet
WriteSheet sheet = EasyExcel.writerSheet("sheet"+i).build();
// 4.2.写入
excelWriter.write(questionBanks.getContent(), sheet);
}
//通知浏览器以附件的形式下载处理,设置返回头要注意文件名有中文
response.setHeader("Content-disposition", "attachment;filename=" + new String( sheetName.getBytes("gb2312"), "ISO8859-1" ) + suffix);
// 5.关闭
excelWriter.finish();
response.setContentType("multipart/form-data");
response.setCharacterEncoding("utf-8");
out.flush();
log.info("导出完成!");
}
复制

要计算要导出的数据的总条数:

questionBankRepository.getCount();
复制


具体实现如下:

@Query(value = "select count(1) from t_question_bank",nativeQuery = true)
Integer getCount();
复制

注:至此后端导出结束,如此导出的excel前端需要做处理待续...

4.导入excel

需要一个监听类

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.myapestech.education.pojo.edu.QuestionBank;


import java.util.ArrayList;
import java.util.List;


/**
* @Author: Kra
* @Version: 1.0
* @Date: 2021/08/19/ 15:33
* @Description: excel 读取监听类
*/
public class EasyExcelListenner extends AnalysisEventListener<QuestionBank> {


private List<QuestionBank> datas = new ArrayList<>();
/**
* When analysis one row trigger invoke function.
*
* @param data one row value. Is is same as {@link AnalysisContext#readRowHolder()}
* @param context
*/
@Override
public void invoke(QuestionBank data, AnalysisContext context) {
datas.add(data);
}


public List<QuestionBank> getDatas() {
return datas;
}


public void setDatas(List<QuestionBank> datas) {
this.datas = datas;
}


/**
* if have something to do after all analysis
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 读取结束执行的操作
}
}
复制

5.开始编写导入excel 的代码 (excel 导入的所有的sheet必须为同一模板)

/**
* @Description: 导入
* @Author: Kra
* @Date: 2021/8/19 15:06
*/
@Override
@Transactional
public void imports(MultipartFile file) throws IOException {
//1.获取文件流
InputStream inputStream = file.getInputStream();
//2.实例化实现了AnalysisEventListener接口的类
EasyExcelListenner listener = new EasyExcelListenner();
//3.创建excel读取对象
ExcelReader excelReader = EasyExcel.read(inputStream, QuestionBank.class, listener).build();
//4.读取有几个sheet表
Integer sheetNum = excelReader.getSheets().size();
log.info("开始读取excel...");
for (Integer i = 0; i < sheetNum; i++) {
ReadSheet readSheet = EasyExcel.readSheet(i).build();
excelReader.read(readSheet);
excelReader.finish();
}
log.info("读取excel完成!");
//5.获取数据
List<QuestionBank> list = listener.getDatas();
//6.判断重复则不插入
log.info("开始写入数据库...");
for (QuestionBank q : list) {
Example example = Example.of(q);
boolean exists = questionBankRepository.exists(example);
if(!exists){
q.setCreatedTime(new Date());
questionBankRepository.save(q);
}
continue;
}
log.info("写入完成!");
}
复制

至此springboot 整合 easyexcel 实现导入导出就完成了!

如有文章对你有帮助,

欢迎关注❤️、点赞👍、转发📣!

复制

文章转载自精准丶优雅,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论