记录easyExcel使用案例

@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)));
        }
    }

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的!下面是一个简单的SpringBoot集成EasyExcel的项目案例: 1. 首先在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>1.1.2-beta5</version> </dependency> ``` 2. 创建实体类User,用于存储Excel中的数据。 ``` @Data public class User { @ExcelProperty(value = "姓名", index = 0) private String name; @ExcelProperty(value = "性别", index = 1) private String sex; @ExcelProperty(value = "年龄", index = 2) private int age; } ``` 3. 创建Excel读取的监听器UserExcelListener,用于读取Excel数据并将数据转为实体类User。 ``` @Slf4j public class UserExcelListener extends AnalysisEventListener<User> { private List<User> userList = new ArrayList<>(); @Override public void invoke(User user, AnalysisContext analysisContext) { log.info("解析到一条数据:{}", JSON.toJSONString(user)); userList.add(user); } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { log.info("所有数据解析完成!"); } public List<User> getUserList() { return userList; } } ``` 4. 创建Controller,用于上传Excel文件并读取数据。 ``` @RestController public class UserController { @PostMapping("/upload") public void upload(MultipartFile file) throws IOException { InputStream inputStream = file.getInputStream(); UserExcelListener userExcelListener = new UserExcelListener(); ExcelReader excelReader = new ExcelReader(inputStream, ExcelTypeEnum.XLSX, null, userExcelListener); excelReader.read(); List<User> userList = userExcelListener.getUserList(); // do something with userList } } ``` 通过上述步骤,就可以实现SpringBoot集成EasyExcel的项目案例并读取Excel数据了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值