使用easy excel进行简单的excel表格导入导出

2023-11-10

1. 创建项目,导入easy excel的依赖

<!--  easy excel 依赖 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.0.5</version>
</dependency>

<!-- mybatis 依赖 -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.7</version>
</dependency>

<!-- lombok依赖 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.0</version>
    <scope>provided</scope>
</dependency>

<!--mybatis-plus 依赖 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.3.2</version>
</dependency>

2. 配值application.yml文件

server:
  port: 8081

# 配置数据库连接
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/portdemo?serverTimezone=UTC&characterEncoding=utf-8
    username: root
    password: 123456
  application:
    name: demoExport
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 配置mybatis-plus 打印控制台日志

3.创建数据库表实体

/**
 * @Description 用户表对应实体
 * @Author small Geng
 * @Data 2022/11/17 12:59
 */
@Data
@TableName("sys_user")
@ContentRowHeight(18)//内容行高
@HeadRowHeight(25)//标题行高
@ColumnWidth(20)//列宽,可设置成员变量上
public class User {

    @ExcelProperty(index = 0, value = "申请人ID")
    private Integer userId;

    @ExcelProperty(index = 1, value = "申请人姓名")
    private String userName;

    @ExcelProperty(index = 2, value = "申请人身份证号")
    private String userCard;

    @ExcelProperty(index = 3, value = "申请人班级")
    private String userClass;

    @ExcelProperty(index = 4, value = "申请人邮箱")
    private String userMail;

}

4. 业务逻辑

4.1 导出excel
/**
* 导出excel
* @param response
*/
@GetMapping("downLoad")
public void downLoad(HttpServletResponse response) throws IOException {

    List<User> users = exportService.list();

    exportService.downLoad(response, users);

}

// serviceImpl实现
@Override
public void downLoad(HttpServletResponse response, List<User> users) throws IOException {
    // 设置响应内容
    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    // 设置编码格式
    response.setCharacterEncoding("UTF-8");
    //设置文件名
    String fileName = URLEncoder.encode("userExcel", "UTF-8").replaceAll("\\+", "%20");
    //设置响应头
    response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
    //获取写出流
    ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), User.class).build();
    // 创建sheet
    WriteSheet writeSheet = EasyExcel.writerSheet("学生记录").build();
    // 读出
    excelWriter.write(users, writeSheet);
    // 关闭流
    excelWriter.finish();

}
4.2 导入excel
/**
* 导入excel
* @param response
*/
@PostMapping("upload")
public String upload(@RequestPart("file")MultipartFile file) throws IOException {
    exportService.upload(file);
    return "success";
}

// serviceImpl 实现
@Override
public void upload(MultipartFile file) throws IOException {
    // 读取excel
    ExcelReader reader = EasyExcel.read(file.getInputStream(), User.class,new ExportListener(exportMapper)).build();
    ReadSheet sheet = EasyExcel.readSheet(0).build();// 读取第一个sheet
    // 读取
    reader.read(sheet);
    // 关闭流
    reader.finish();
}
4.3 工具类 ``ExportListener`
/**
 * @Description 导入excel的监听器
 * @Author small Geng
 * @Data 2022/11/17 14:03
 */
@Slf4j
public class ExportListener extends AnalysisEventListener<User> {

    // 每隔一百条数据存储数据库 然后清理list 方便内存回收
    private static final int BATCH_COUNT = 100;
    // 缓存的数据
    private List<User> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);

    private ExportMapper exportMapper;

    public ExportListener(ExportMapper exportMapper) {
        this.exportMapper = exportMapper;
    }

    // 每解析一条数据都会进行调用
    @Override
    public void invoke(User user, AnalysisContext context) {
        log.info("解析到一条数据:{}", JSON.toJSONString(user));
        // 将解析的数据添加到缓存集合中
        user.setUserId(null);
        cachedDataList.add(user);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (cachedDataList.size() >= BATCH_COUNT) {
            // 向数据库中插入数据
            exportMapper.insert(user);
            // 清理一次list
            cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
        }
    }

    /**
     * 所有数据解析完成之后就会调用该方法
     * 防止出现数据量没有达到BATCH_COUNT条的时候,依然进行数据库插入操作
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 数据保存到数据库中
        saveData();
        log.info("所有数据解析完成,进入doAfterAllAnalysed方法");
    }

    /**
     * 保存数据
     */
    private void saveData() {
        log.info("{}条数据,开始存储数据库...", cachedDataList.size());
        for (User user : cachedDataList) {
            exportMapper.insert(user);
        }
        log.info("存储数据完成!!");
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用easy excel进行简单的excel表格导入导出 的相关文章

随机推荐

  • JUC之实现Callable接口

    public class callable public static void main String args throws ExecutionException InterruptedException FutureTask ft n
  • C# 学习教程九

    C 集合类 集合 collection 提供了一种结构化组织任意对象的方式 而且我们早就知道集合在日常编程工作中的重要性 NET类库提供了丰富的集合数据类型 其种类之繁多甚至使许多人看得眼都花了 这些集合对象都具有各自的专用场合 不管怎么说
  • C语言中float值的比较

    预测以下C程序的输出 include
  • NSGAIII求极值点、超平面方程和截点的方法(用于标准化)

    NSGAIII求极值点 超平面方程和截点的方法 用于标准化 1 标准化的目的 由于测试问题不同目标的量纲或者范围不同 若直接进行运算 则量纲大的值会覆盖掉小的值 因此需要进行标准化 2 极值点 extreme point 在一些文章中 提到
  • 结构体内重载小于号< 及构造函数

    struct Node int d e bool operator lt const Node x const return x d lt d Node int d int e d d e e
  • Zookeeper集群节点数量为什么要是奇数个?

    无论是公司的生产环境 还是自己搭建的测试环境 Zookeeper集群的节点个数都是奇数个 至于为什么要是奇数个 以前只是模糊的知道是为了满足选举需要 并不知道详细的原因 最近重点学习zookeeper 了解到其中的原理 现将其整理记录下来
  • Kafka为何要设计缓冲池机制?初看一脸懵逼,看懂直接跪下!

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 1 Kafka的客户端缓冲机制 2 内存缓冲造成的频繁GC问题 3 Kafka设计者实现的缓冲池机制 4 总结一下 这篇文章 同样给大家聊一个硬核的技术知识 我
  • 疑难杂症之malloc死锁__lll_lock_wait_private

    查看glibc源码可知 malloc内部是有锁的 那说明malloc是一个线程安全型函数 但是它不是一个可重入函数 重入的意思是 比如当前线程正在做malloc 如果此时因为某种原因触发了信号 那么操作系统会保存好现场 正在执行的mallo
  • 网维无盘服务器错误代码,因客户机网关地址写错导致无盘客户机开机获取到dhcp后卡在tftp前无法启动...

    问题现象 客户机启动后获取DHCP界面卡住 DHCP信息中缺少网关 如下图 原因说明 无盘服务端设置的网关地址错误 解决方案 修改为正确的网关地址 问题分析 1 按照过去的经验 出现这种问题一般都是arp绑定错误导致 或者tftp69端口占
  • 医学知识-FFR(冠状动脉血流储备分数)

    什么是FFR 冠状动脉血流储备分数 FFR 作为一项创功能学评价指标 对冠心病的治疗策略具有重要指导意义 前期研究证实FFR指导介入治疗策略不仅安全 经济 并能改善患者的预后 冠状动脉造影及血管内超声均被认为是诊断冠心病的 金标准 但它们只
  • 拥抱开放|OpenPie引领PostgreSQL中国代码贡献力

    OpenPie拥抱开放 和PostgreSQL社区互为兄弟社区 PostgreSQL作为世界上最受欢迎的开源数据库之一 起源于加利福尼亚大学伯克利分校 其卓越的性能倍受广大数据库用户的赞誉 OpenPie一直活跃于PostgreSQL社区
  • pytorch LayerNorm参数详解,计算过程

    目录 说明 LayerNorm参数 normalized shape eps elementwise affine LayerNorm前向传播 以normalized shape为一个int举例 总结 说明 LayerNorm中不会像Bat
  • npm的.npmrc文件在哪里?缓存及全局包文件在什么位置?

    npm的 npmrc文件在哪里 缓存及全局包文件在什么位置 npm作为node开发过程中的必备工具 长期使用之后 您可能会想 这些全局安装的node包都放在硬盘里面的哪个地方 配置文件 npmrc文件在哪里 node包的缓存位置在哪里 本文
  • Ubuntu和windows系统下安装odoo15 企业版终于安装成功了附带安装方法

    方法和社区版一样 用官方方法 轻松简单 界面清爽多了 比社区版 和14的企业版 比起来 效率高了很多 很多细节上的改变 网站模板多了 还有多了视频会议功能 安装方法 先安装数据库 sudo apt install postgresql y
  • Windows------openvino 2022.1安装步骤

    openvino安装 1 下载安装包 官网链接 https www intel com content www us en developer tools openvino toolkit download html 点击download
  • C#泛型方法的定义及使用

    在 C 语言中泛型方法是指通过泛型来约束方法中的参数类型 也可以理解为对数据类型设置了参数 如果没有泛型 每次方法中的参数类型都是固定的 不能随意更改 在使用泛型后 方法中的数据类型则有指定的泛型来约束 即可以根据提供的泛型来传递不同类型的
  • [疯狂Java]AWT:菜单栏、菜单、菜单项、菜单事件处理

    1 菜单栏 菜单 菜单项之间的关系 1 菜单栏 MenuBar 就是窗口中常见的顶层菜单栏 包含文件 编辑 格式等等子菜单的菜单条 即包含菜单的容器 2 菜单 Menu 是必定包含菜单项或者菜单 嵌套包含菜单 也叫子菜单 的容器 3 菜单项
  • python爬虫入门案例(爬取lol所有英雄名称及技能)

    滴滴滴 这几天忙着增强自己的实力 发现了一个非常适合新手的案例 案例就是爬取英雄联盟的所有英雄名称和技能 废话不多说 我们来分析分析 要练手的链接 进入此网站我们会发现 网页上的响应数据里面并没有我们想要的数据 由此我们可以猜测 该响应的数
  • onvif协议常见错误总结

    1 返回28 TCP ERROR或者error 28 SOAP ENV Receiver No route to h 可能存在的原因 原因可能是账号密码错误 或者设备不在线的原因 导致TCP连接超时 或者onvif的地址写错导致的 我当时是
  • 使用easy excel进行简单的excel表格导入导出

    1 创建项目 导入easy excel的依赖