SpringBoot使用EasyExcel类一键导出数据库数据生成Excel,导入Excle生成List<>数据(作者直接给demo项目)

news2025/7/10 18:01:03

文章目录

  • 一、简单一键导出Excel
    • 直接给出生成效果
    • Empty,这个很关键
    • controller层
    • EasyExcel类的多种使用方式
  • 二、导入Excel生成List<>数据
    • controller层,简单写法
    • 监听器写法(观察者模式),稍微麻烦
  • 其他
    • 如果要使类中的某个字段不导出
    • 导入的时候,大家要注意 @ExcelProperty 上的属性的优先级
  • 参考文档

一、简单一键导出Excel

直接给出生成效果

  • 作者本人项目Demo源码

在这里插入图片描述
在这里插入图片描述

Empty,这个很关键

  • 因为是通过empty上的 @ExcelProperty注解生成表头的,excel中的数据也需要使用这个类导入
package com.ljj.empty;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @Author lijunyun
 * @Date 2022/10/26 10:20
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class StudentEmpty {

    @ExcelProperty(index = 0,value = "学生id")
    private String id;
    @ExcelProperty(index = 1,value = "姓名")
    private String name;
    @ExcelProperty(index = 2,value = "年龄")
    private Integer age;

}

controller层

  • 用的是 alibaba 的工具类,按照这个import就能导入适当的依赖了,大家在maven自行导入。
package com.ljj.controller;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.ljj.empty.StudentEmpty;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.util.LinkedList;
import java.util.List;

/**
 * @Author lijunyun
 * @Date 2022/10/11 17:25
 */
@RequestMapping("/test")
@RestController
public class TestController {


    @GetMapping("")
    public String test01() {
        return "test01,端口9001";
    }

    @GetMapping("/ExportExcel")
    public void ExportExcel(HttpServletResponse response) {

        OutputStream outputStream = null;
        try{
            List<StudentEmpty> data=new LinkedList<StudentEmpty>();
            data.add(new StudentEmpty("1","张三",18));
            data.add(new StudentEmpty("2","小明",19));
            outputStream =response.getOutputStream();
            response.setHeader("Content-disposition","attachment;filename=tableStructureInfo_"+".xlsx");
            ExcelWriter excelWriter= EasyExcel.write(outputStream).build();
            WriteSheet writeSheet=EasyExcel.writerSheet(0,"表结构").head(StudentEmpty.class).build();
            excelWriter.write(data,writeSheet);
            excelWriter.finish();
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            if (outputStream !=null){
                try {
                    outputStream.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
        }

    }

}

EasyExcel类的多种使用方式

  • 快速生成Excel,这里举多种方式
EasyExcel.write(outputStream).head(StudentEmpty.class).sheet(1,"表结构1").doWrite(data);	
EasyExcel.write(outputStream,StudentEmpty.class).sheet(2,"表结构2").doWrite(data);
  • 快速生成Excel,一个Excel生成多个表
WriteSheet writeSheet=EasyExcel.writerSheet(1,"表1").head(StudentEmpty.class).build();
WriteSheet writeSheet01=EasyExcel.writerSheet(2,"表2").head(StudentEmpty.class).build();
EasyExcel.write(outputStream).head(StudentEmpty.class).build().write(data,writeSheet).write(data,writeSheet01).finish();

二、导入Excel生成List<>数据

controller层,简单写法

    /**
     * 导入用户信息
     * @param file
     * @throws IOException
     */
    @PostMapping("/excelImport")
    public void excelImport(MultipartFile file) throws IOException {
        //调用方法实现读取
        List<StudentEmpty> lists=EasyExcel.read(file.getInputStream()).head(StudentEmpty.class).sheet().doReadSync();
    }

监听器写法(观察者模式),稍微麻烦

  • 观察者,数据处理在这个类中执行
package com.ljj.other;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.ljj.empty.StudentEmpty;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import com.alibaba.fastjson.JSON;


import java.util.ArrayList;
import java.util.List;

/**
 * @Author lijunyun
 * @Date 2022/10/26 13:09
 */

@Slf4j
@Service
public class ExcelItemListener extends AnalysisEventListener<StudentEmpty> {

    /**
     * 批处理阈值
     */
    private static final int BATCH_COUNT = 5;
    List<StudentEmpty> list = new ArrayList<StudentEmpty>(BATCH_COUNT);

    @Override
    public void invoke(StudentEmpty excelItem, AnalysisContext analysisContext) {
        log.info("解析到一条数据:{}", JSON.toJSONString(excelItem));
        list.add(excelItem);
        if (list.size() >= BATCH_COUNT) {
            importItemInfo(list);
            list.clear();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        importItemInfo(list);
        log.info("所有数据解析完成!");
    }


    public void importItemInfo(List<StudentEmpty> infoList) {
        //导入操作---新增公司和项目数据
    }
}
  • controller 层,不做excel的数据处理
    /**
     * 导入用户信息
     * @param file
     * @throws IOException
     */
    @PostMapping("/excelImport")
    public void excelImport(MultipartFile file) throws IOException {
        //调用方法实现读取
		EasyExcel.read(file.getInputStream(),StudentEmpty.class,new ExcelItemListener()).sheet().doRead();
}

其他

如果要使类中的某个字段不导出

  • 在类头上加@ExcelIgnoreUnannotated 注解即可,这个注解的意思是:忽略不加@ExcelProperty 的字段。这样即可控制需要的字段了

导入的时候,大家要注意 @ExcelProperty 上的属性的优先级

  • @ExcelProperty(index = 2,value = “学生id”) 这个来说,index才是有用的,easy并不会再去比较学生id,因为index的优先级大于easy的优先级。@ExcelProperty(value = “学生id”) 才会去比较文件头。

参考文档

*阿里出品Excel工具EasyExcel使用小结
*ExcelProperty导出忽略某个字段不导出

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/8798.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态拼接 merge 语句

【问题】 Hello everyone, I have one query, would be great if anyone can help me out on this. In SQL, I have two tables with same column names. Want to query if there is any difference in the column values and if yes will update the values(in the first ta…

LEADTOOLS 入门教程: 使用 AWS Lambda 转换文档 - C# .NET Core

LEADTOOLS 是一个综合工具包的集合&#xff0c;用于将识别、文档、医疗、成像和多媒体技术整合到桌面、服务器、平板电脑、网络和移动解决方案中&#xff0c;是一项企业级文档自动化解决方案&#xff0c;有捕捉&#xff0c;OCR&#xff0c;OMR&#xff0c;表单识别和处理&#…

SSM框架真没那么难,这份阿里大佬的进阶实战笔记真给讲透了!

SSM框架&#xff1a; SSM框架是spring MVC &#xff0c;spring和mybatis框架的整合&#xff0c;是标准的MVC模式&#xff0c;将整个系统划分为表现层&#xff0c;controller层&#xff0c;service层&#xff0c;DAO层四层 使用spring MVC负责请求的转发和视图管理 spring实现…

Docker学习笔记

1.docker比vm快的原因: docker有着比虚拟机更少的抽象层,不需要实现硬件资源的虚拟化运行,运行在docker上的程序使用的都是物理机的资源. dicker利用的是宿主机的内核,不需要加载操作系统的os内核. 2.docker帮助文档docker help 具体到某一个命令是使用 docker run --help即可…

【JMeter】Jmeter分布式压测教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、原理二、环境搭建2.1 环境准备2.2 slave机器配置2.3 master机器配置三、脚本及执行3.1 参数化问题3.2 GUI启动测试3.3 命令行启动测试总结一、原理 Jmeter分布式…

【深入理解Kotlin协程】CoroutineScope.launch源码追踪扒皮

lifecycleScope、viewModelScope、GlobalScope、MainScope的上下文 协程最重要的就是协程上下文对象&#xff0c;因为通过上下文可以获取到协程相关的任何东西(Job、Dispatcher、Interceptor、Name、ExceptionHandler)&#xff0c;所以有必要了解清楚常用的协程作用域对象中cor…

asp.net+sqlserver汽车4s店销售网站系统c#项目

数据项 管理员信息表&#xff5b;用户编号&#xff0c;用户名称&#xff0c;用户密码&#xff5d; 新闻信息表&#xff5b;编号&#xff0c;标题&#xff0c;内容&#xff0c;添加时间&#xff5d; 汽车信息表&#xff5b;编号&#xff0c;汽车名称&#xff0c;汽车价格&#x…

制造业行业现状及智能生产管理系统一体化解决方案

前言&#xff1a; 《中国制造2025》作为我国实施制造强国战略第一个十年的行动纲领。它重点提出了坚持&#xff1a;创新驱动、质量为先、绿色发展、结构优化、人才为本的基本方针。坚持&#xff1a;市场主导、政策引导&#xff0c;立足当前、着眼长远&#xff0c;整体推进、重…

Selenium实现原理

Selenium 是目前主流的用于Web应用程序测试的工具&#xff0c;可以直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。 selenium的实现原理是这样的&#xff1a; 1.运行代码&#xff0c;启动浏览器后&#xff0c;webdriver会将浏览器绑定到特定端口&#xff0c;作为we…

[go学习笔记.第十五章.反射] 1.反射的基本介绍以及实践

一.反射的引入以及基本介绍 1.看两个问题 (1).对于结构体的序列化和反序列化&#xff0c;看一段代码 package mainimport("fmt" "encoding/josn" )type Monster struct {Name string json:"monsterName"Age int json:"monsterAge&quo…

deque容器(20221115)

1、基本概念 功能&#xff1a;双端数组&#xff0c;可以对头端进行插入删除元素 deque与vector的区别&#xff1a; vector对应头部的插入删除效率低&#xff0c;数据量越大&#xff0c;效率越低 deque对头部的插入删除速度比vector快 vector访问元素速度比deque快 deque内…

sanic 教程

sanic 教程 在Sanic的生命周期流程大致如下&#xff1a; http请求——Sanic解析request——匹配路由——请求中间件——视图函数——响应中间件——http响应 依赖库 sanic21.3.4 sanic-jwt1.7.0 sanic-openapi21.12.0 gunicorn20.1.0 PyMySQL1.0.2 aiomysql0.1.1 DBUtils1.3…

WPS(WSC)中M1 到M8 图解

背景 之前实习的时候就学了Wifi p2p相关的东西&#xff0c;当时找M1到M8的功能把我累惨了&#xff0c;找到的还全是千篇一律的东西&#xff0c;讲的不是很清楚&#xff08;当然原版出书的那个前辈肯定是懂的&#xff09;&#xff0c;但是对我等小白不友好&#xff0c;就萌生了这…

3.线性代数-矩阵

矩阵和Tensor1. Tensor2.矩阵3.线性代数正确打开方式3.1 行视图3.2 列视图4.线性相关和线性无关5. Span、基和子空间(Subspace)6.四个基本的子空间6.1 列空间6.2 零空间6.3 行空间6.4 左零空间6.5 四个基本子空间的关系7.可逆矩阵8.方阵的特征值与特征向量9.特征分解9.1一般矩阵…

【Pytorch with fastai】第 7 章 :训练SOTA的模型

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

Nginx优化方案

目录 一、Nginx返回错误页面 1、HTTP常见状态代码列表 二、Nginx状态页面 1、安装status模块 2、激活status 三、优化并发连接数 1、压力测试软件ab&#xff08;http-tools&#xff09; 2、优化并发连接数 2.1、修改nginx并发数 2.2、修改内核最大文件数量 四、Nginx…

吉莱斯皮随机模拟算法(SSA)(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

【K8S系列】第十讲:Knative 简介

目录 一、 Serverless介绍 二、Knative 介绍 2.1 Knative 的定位 2.2 Knative的组成 2.2.1 Build 构建系统 2.2.2 Serving&#xff1a;服务系统 2.2.3 Eventing&#xff1a;事件系统 补充&#xff1a; 三、总结&#xff1a; 一、 Serverless介绍 在讲Knative之前&a…

【毕业设计】机器视觉手势检测和识别系统 - python 深度学习

文章目录0 前言1 实现效果2 技术原理2.1 手部检测2.1.1 基于肤色空间的手势检测方法2.1.2 基于运动的手势检测方法2.1.3 基于边缘的手势检测方法2.1.4 基于模板的手势检测方法2.1.5 基于机器学习的手势检测方法3 手部识别3.1 SSD网络3.2 数据集3.3 最终改进的网络结构4 最后0 前…

线程池源码解析 2.工作原理与内部结构

线程池源码解析—工作原理与内部结构 工作原理 概述 线程池是线程的池子&#xff0c;本质上是通过单个线程执行多个并发任务&#xff0c;使得尽量少的创建线程&#xff0c;减少开销。在线程池内部&#xff0c;是没有区分核心线程和非核心线程的&#xff0c;是通过 Set 集合的…