easyexcel使用详解(来自阿里巴巴员工的总结,很详细)

2023-10-28

此篇博客是记录自己学习easyexcel中收集到的资料。

建议下载github地址,直接看使用案列。
1、easyexcelgithub地址
2、easyexcel使用文档
在单元测试模块:read,web,write三个目录中分有详细的使用。其中web中表格上传,下载。

在这里插入图片描述

文件上传

UploadDataListener

package com.alibaba.easyexcel.test.demo.web;

import java.util.List;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.fastjson.JSON;

import lombok.extern.slf4j.Slf4j;

/**
 * 模板的读取类
 *
 * @author Jiaju Zhuang
 */
// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
@Slf4j
public class UploadDataListener implements ReadListener<UploadData> {
    /**
     * 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收
     */
    private static final int BATCH_COUNT = 5;
    private List<UploadData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
    /**
     * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
     */
    private UploadDAO uploadDAO;

    public UploadDataListener() {
        // 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
        uploadDAO = new UploadDAO();
    }

    /**
     * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
     *
     * @param uploadDAO
     */
    public UploadDataListener(UploadDAO uploadDAO) {
        this.uploadDAO = uploadDAO;
    }

    /**
     * 这个每一条数据解析都会来调用
     *
     * @param data    one row value. Is is same as {@link AnalysisContext#readRowHolder()}
     * @param context
     */
    @Override
    public void invoke(UploadData data, AnalysisContext context) {
        log.info("解析到一条数据:{}", JSON.toJSONString(data));
        cachedDataList.add(data);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (cachedDataList.size() >= BATCH_COUNT) {
            saveData();
            // 存储完成清理 list
            cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
        }
    }

    /**
     * 所有数据解析完成了 都会来调用
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
        saveData();
        log.info("所有数据解析完成!");
    }

    /**
     * 加上存储数据库
     */
    private void saveData() {
        log.info("{}条数据,开始存储数据库!", cachedDataList.size());
        uploadDAO.save(cachedDataList);
        log.info("存储数据库成功!");
    }
}

    /**
     * 文件上传
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link UploadData}
     * <p>
     * 2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link UploadDataListener}
     * <p>
     * 3. 直接读即可
     */
    @PostMapping("upload")
    @ResponseBody
    public String upload(MultipartFile file) throws IOException {
        EasyExcel.read(file.getInputStream(), UploadData.class, new UploadDataListener(uploadDAO)).sheet().doRead();
        return "success";
    }

文件下载

    /**
     * 文件下载(失败了会返回一个有部分数据的Excel)
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link DownloadData}
     * <p>
     * 2. 设置返回的 参数
     * <p>
     * 3. 直接写,这里注意,finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大
     */
    @GetMapping("download")
    public void download(HttpServletResponse response) throws IOException {
        // 这里注意 有同学反应使用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");

        EasyExcel.write(response.getOutputStream()).sheet("模板").doWrite(data());
    }

data()数据

    private List<DownloadData> data() {
        List<DownloadData> list = ListUtils.newArrayList();
        for (int i = 0; i < 10; i++) {
            DownloadData data = new DownloadData();
            data.setString("字符串" + 0);
            data.setDate(new Date());
            data.setDoubleData(0.56);
            list.add(data);
        }
        return list;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

easyexcel使用详解(来自阿里巴巴员工的总结,很详细) 的相关文章

随机推荐

  • python处理网页弹窗,用于处理弹出式浏览器窗口的Python webdriver

    切换到弹出窗口至少有两个不同的原因 很多人都知道 当弹出窗口出现时 你需要同时使用driver switch to window window handle 这样你就可以在弹出窗口中找到元素 在弹出窗口关闭后 你就可以在主窗口中找到元素 只
  • 学习笔记-架构的演进之分布式架构-服务发现-2月day19

    文章目录 服务发现 Service Discovery 服务发现要解决注册 维护和发现三大功能问题 服务的注册 Service Registration 服务的维护 Service Maintaining 服务的发现 Service Dis
  • JDK1.8安装和环境搭建步骤

    JDK1 8安装步骤 1 安装文件 首先打开JDK的安装包 选择公共JRE 下载的路径可以根据自己的选择更改 我选择的是D盘 接着默认下一步 直到安装出现到下图 为了方便后期的使用 此处的jre安装建议和JDK文件同级 2 环境变量配置 1
  • C#初级需要掌握的知识点

    俗话说 温故而知新 可以为师矣 为师就拉倒吧 还是巩固巩固自己的地基吧 今天想要记录的就是C 语法中的基础部分 这一篇就先记录一下知识点的序列吧 然后接下来再根据这个序列来一步步的完成复习 1 C 和 Net框架的概念和运行原理 2 C 程
  • 万字长文人脸识别深度研究:发展与市场、市场研究、流程及主要技术、行业应用、产品落地和个人看法

    来源 知乎 软件定义世界 作者 放飞人夜 一 发展与市场 1 人脸识别的理解 人脸识别 Face Recognition 是一种依据人的面部特征 如统计或几何特征等 自动进行身份识别的一种生物识别技术 又称为面像识别 人像识别 相貌识别 面
  • Python十大装B语法

    Python 是一种代表简单思想的语言 其语法相对简单 很容易上手 不过 如果就此小视 Python 语法的精妙和深邃 那就大错特错了 本文精心筛选了最能展现 Python 语法之精妙的十个知识点 并附上详细的实例代码 如能在实战中融会贯通
  • mac jdk下载 https://www.oracle.com/java/technologies/downloads/archive/

    Java Archive Oracle MAC 系统安装 JDK 及环境变量配置 蜗牛的博客 CSDN博客
  • 给明年依然年轻的我们:欲望、外界、标签、天才、时间、人生目标、现实、后悔、和经历

    原文链接 http blog sina com cn s blog 6e8e05ac0100wu4h html 今天是22岁的最后一天 几个月前 我从沃顿商学院毕业 用文凭上 最高荣誉毕业 的标签安抚了已经年过半百的老妈 然后转头辞去了毕业
  • vue3 中使用tsx&插槽的使用

    app tsx文件 import defineComponent ref from vue import setPermissionsVisible from shared export default defineComponent se
  • 度量学习:使用多类N对损失改进深度度量学习

    度量学习系列 Author 码科智能 使用多类N对损失改进深度度量学习 度量学习是ReID任务中常用的方式之一 今天来看下一篇关于如何改进度量学习的论文 来自2016年NeurIPS上的一篇论文 被引用超过900次 论文 Improved
  • [C++] volatile 关键字

    C C 中的 volatile 关键字是一种类型修饰符 用它声明的类型变量表示可以被某些编译器未知的因素更改 比如 操作系统 硬件或者其它线程等 遇到这个关键字声明的变量 编译器对访问该变量的代码就不再进行优化 从而可以提供对特殊地址的稳定
  • C语言小游戏:三子棋(简单版)实现讲解

    目录 前言 打印菜单 初始化棋盘 打印棋盘 玩家下棋 电脑下棋 重难点 判断输赢 组合函数来实现游戏 源代码 前言 这是一篇实现一个简陋的C语言小游戏 三子棋 的讲解 后面要是有自己的想法的话可以自行为小游戏添加一点游戏项目 最终实现的样式
  • WSL忘记密码?记一次在 WSL 中重设 Linux 密码

    当你 在 Windows 上使用 WSL 安装 Linux 时 会要求你创建一个用户名和密码 当你在 WSL 上启动 Linux 时 这个用户会自动登录 现在的问题是 如果你有一段时间没有使用它 你可能会忘记 WSL 的账户密码 而如果你要
  • ccf-csp认证期末预测之最佳阈值(2020年12月13日)

    期末预测之最佳阈值 题目描述 具体来说 顿顿评估了 位同学上学期的安全指数 其中第 1 位同学的安全指数为 是一个 0 108 范围内的整数 同时 该同学上学期的挂科情况记作 0 1 其中 0 表示挂科 1 表示未挂科 相应地 顿顿用 表示
  • LD3320与STM32程序

    终于找到了程序 搭配了ucosII 根据语音指令然后从SD卡读取 百度网盘链接 https pan baidu com s 1rkJqqBKOmCs01Ihvg5d2Zg 提取码 0tvo
  • 目标检测——使用yolov6进行视频推理

    yolov6源码里自带了图片的推理 推理完成后结果图片保存再runs inference文件夹下 但当我们想对视频进行推理的时候不是很方便 但v6里面封装了对图片的推理函数 我们只需要稍微改一下即可 默认的图片推理代码如下 inferer
  • ChatGPT是否能够进行情感调节?

    ChatGPT 是一种基于自然语言处理技术的人工智能工具 可以用于情感调节 情感调节是指通过一系列方法和技巧来调节和管理自己的情感状态 以达到更好的情感体验和情感健康 ChatGPT 可以帮助人们更好地理解和表达自己的情感需求 提高情感意识
  • 微信小程序使用scroll-view自定义下拉刷新

    前言 很多朋友在进行小程序开发时 需要做下拉刷新功能 大部分人是直接使用系统的下拉刷新功能的 在 json文件中设置 enablePullDownRefresh true 使用onPullDownRefresh 监听用户下拉操作 实现刷新操
  • 8.无监督学习: SimCLRv2

    v2框架整体还是沿用了在NLP中流行的unsupervised pretrain外加10 的有监督label进行微调的范式 预训练阶段在没有先验的情况下学习没有标签的数据 论文中也提到了使用较深和较宽的神经网络可以提高label effic
  • easyexcel使用详解(来自阿里巴巴员工的总结,很详细)

    此篇博客是记录自己学习easyexcel中收集到的资料 建议下载github地址 直接看使用案列 1 easyexcelgithub地址 2 easyexcel使用文档 在单元测试模块 read web write三个目录中分有详细的使用