Easyexcel导入导出

Easy Excel导入导出

1 . 导入(读)

  • 首先要导入依赖
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>版本号</version>
</dependency>
  • 创建实体类

在属性上用@ExcelPriPerty修饰

 @ExcelProperty(value = "姓名")
    private String name;

读取数据(普通Java项目)

//自定义监听器
public class DemoDataListener implements ReadListener<DemoData> {
    //每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收
    private static final int BATCH_COUNT = 100;
    //用于存放缓存的数据
    private List<DemoData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
    
    //假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。
    private DemoDAO demoDAO;

    public DemoDataListener() {
    //这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
        demoDAO = new DemoDAO();
    }
    
    //如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的
    public DemoDataListener(DemoDAO demoDAO) {
        this.demoDAO = demoDAO;
    }

    // 这个每一条数据解析都会来调用
    @Override
    public void invoke(DemoData data, AnalysisContext context) {
        cachedDataList.add(data);
        // 达到BATCH_COUNT(100)了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (cachedDataList.size() >= BATCH_COUNT) {
            saveData();
            // 存储完成清理 list
            cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
        }
    }

    // 所有数据解析完,会调用这个方法来保存未达到100的数据
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
        saveData();
    }

    //最后存储到数据库
    private void saveData() {
        demoDAO.save(cachedDataList);
    }
}

读取数据(Web项目)

    /**
     * 文件上传
     */
    @PostMapping("upload")
    @ResponseBody
    /**
     *MultipartFile file 是 Spring 提供的类,表示从前端上传过来的文件
     *file.getInputStream()	获取上传文件的输入流,即 Excel 文件内容
     *UploadData.class	数据模型类,用于映射 Excel 中每一行的数据
     *UploadDataListener(uploadDAO)	监听器,每读取一定数量的数据后会回调这个监听器,也可以自定义监听器
     *sheet() 表示要读取 Excel 中的工作表,默认读取第一个 sheet。
     *doRead() 表示开始实际执行读取操作。
     */
    public String upload(MultipartFile file) throws IOException {
        EasyExcel.read(file.getInputStream(), UploadData.class, new UploadDataListener(uploadDAO)).sheet().doRead();
        return "success";
    }

2 . 导出(写)

以上实体类等已经讲解,下面不在叙述

写入数据(普通Java项目)

  • 存储数据
  private List<DemoData> data() {
      //ListUtils 是 Apache Commons Collections 提供的一个工具类。
      //newArrayList() 方法用于创建一个新的、空的 ArrayList 实例。
        List<DemoData> list = ListUtils.newArrayList();
        for (int i = 0; i < 10; i++) {
            DemoData data = new DemoData();
            data.setString("字符串" + i);
            data.setDate(new Date());
            data.setDoubleData(0.56);
            list.add(data);
        }
        return list;
    }
  • 导出数据
@Test
    public void simpleWrite() {
         // 写法1
        /**
         *设置文件名
         *TestFileUtil.getPath():获取一个测试用的路径,比如:/Users/xxx/easy-excel-test/"simpleWrite":固定前缀名
         *System.currentTimeMillis():当前时间戳,用于避免文件重名
         *.xlsx:表示生成的是 Excel 2007 及以上格式(即 OOXML 格式)
         **/
        String fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
        /** 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
         *DemoData:将 Excel 中的每一行数据映射成 DemoData 对象
         */
          EasyExcel.write(fileName, DemoData.class)
            .sheet("模板")
            .doWrite(() -> {
        // 查询的数据,data() 方法返回一个实现了 Iterable 接口的对象,比如 List<DemoData>,其中包含了要写入Excel的数据
                return data();
            });

        // 写法2
        fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        // 如果这里想使用03 则 传入excelType参数即可
        EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());

        // 写法3
        fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
        // 这里 需要指定写用哪个class去写
        try (ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build()) {
            WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
            excelWriter.write(data(), writeSheet);
        }
    }

写入数据(Web项目)

    @GetMapping("download")
    public void download(HttpServletResponse response) throws IOException {
        //设置 MIME 类型,告诉浏览器返回的是一个 Excel 文件(.xlsx 格式)
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        //设置字符编码,告诉浏览器返回的内容使用的是 UTF-8 编码
        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");
        /**
          *fileName 参数指定了要写入的Excel文件的路径和名称
          *DemoData.class 参数则指定了将被映射到Excel行的数据模型类
          *sheet("模板"): 该方法指定了生成的Excel文件中的工作表(sheet)名称为"模板"
          *.doWrite(data())写入的数据
          */
        EasyExcel.write(response.getOutputStream(), DownloadData.class).sheet("模板").doWrite(data());
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值