@Override
public ResultMap importTopic(MultipartFile file) throws Exception {
EasyExcel.read(file.getInputStream(), TbExamTopic.class, new TopicListener(tbExamTopicMapper)).sheet().doRead();
return ResultMap.init(Const.EXPORT_SHEET0, Const.EXPORT_SUCCESS, null);
}
基类也就是字段加ExcelProperty(“Excel的标题名”)就行了
监听的功能是将读到的内容进行想要的操作后再返回去
package com.example.entry.listener;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.example.entry.mapper.TbExamTopicMapper;
import com.example.entry.model.TbExamTopic;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @Description TODO
* @Author gourd
* @Date 2020/8/19 10:18
* @Version 1.0
*/
@Slf4j
@Transactional
public class TopicListener extends AnalysisEventListener<TbExamTopic> {
/**
* 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
*/
private static final int BATCH_COUNT = 5;
List<TbExamTopic> list = new ArrayList<TbExamTopic>();
/**
* 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
*/
private TbExamTopicMapper tbExamTopicMapper;
/**
* 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
*
*/
public TopicListener(TbExamTopicMapper tMerchantMapper) {
this.tbExamTopicMapper = tMerchantMapper;
}
/**
* 这个每一条数据解析都会来调用
*/
@Override
public void invoke(TbExamTopic tbExamTopic, AnalysisContext analysisContext) {
// log.info("解析到一条数据:"+ JSON.toJSONString(tbExamTopic));
if(tbExamTopic != null && tbExamTopic.getOptions() != null) {
String [] options = tbExamTopic.getOptions().split(";;");
String s = "[{\"value\":\"";
for (int i = 0; i < options.length; i++){
s = s+options[i]+ "\"},{\"value\":\"";
}
tbExamTopic.setOptions(s.substring(0,s.lastIndexOf(","))+"]");
tbExamTopic.setCreateTime(new Date());
// 通过pointId查找知识点名称
// String potinName = tbExamTopicMapper.getpotinName(tbExamTopic.getPotinId());
// 通过知识点名称查知识点id
String pointId = tbExamTopicMapper.getPointId(tbExamTopic.getTopicTypeId());
if (pointId == null) {
// 如果数据库没有这个知识点,则增加记录且设置为当前数据的PotinId
tbExamTopicMapper.addPoint(tbExamTopic.getTopicTypeId());
// Excel中传来的是知识点名称,要去表中查找该名称所对应的序号
tbExamTopic.setTopicTypeId(tbExamTopicMapper.getPointId(tbExamTopic.getTopicTypeId()));
} else {
tbExamTopic.setTopicTypeId(tbExamTopicMapper.getPointId(tbExamTopic.getTopicTypeId()));
}
list.add(tbExamTopic);
// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
// if (list.size() >= BATCH_COUNT) {
saveData();
// 存储完成清理 list
list.clear();
// }
}else{
log.info("解析到空数据");
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
if(list.size() > 0) {
tbExamTopicMapper.save(list);
}
}
/**
* 加上存储数据库
*/
private void saveData() {
log.info("{}条数据,开始存储数据库!", list.size());
tbExamTopicMapper.save(list);
log.info("存储数据库成功!");
}
}
另一个项目使用导出的功能:
// 查看是否拥有权限
Integer role = accessStatisticsService.getRole();
if (role != 1) {
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
response.getWriter().println(JSONObject.toJSONString(Const.getResultMap("501", "权限不足", null)));
}
// 获取所需数据
List<PoliceUseExcel> policeUseExcel = accessStatisticsService.getUseInfo(startTime, endTime);
try {
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 + ".xls");
// 这里需要设置不关闭流
EasyExcel.write(response.getOutputStream(), PoliceUseExcel.class).excelType(ExcelTypeEnum.XLS).autoCloseStream(Boolean.FALSE).sheet("信息")
.doWrite(policeUseExcel);
} catch (Exception e) {
e.printStackTrace();
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
response.getWriter().println(JSONObject.toJSONString(Const.getResultMap("501", "发生异常", null)));
}
}