EasyExcel导出

news2025/1/19 23:04:24

1.简介

        官网:EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel

2.案例

2.1 实现的效果

        效果图如下:

2.2 实现步骤

        三种情景,主要是表头和数据有区别,简列实现步骤如下:

2.3 具体实现

2.3.1 前置-依赖导入

        <!-- easyExcel -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.3.2</version>
        </dependency>

        <!-- POI导入导出 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.1.2</version>
        </dependency>

2.3.2 简单列表导出excel文件

        1.创建实体如下:
@Data
public class Order {

    /** 订单ID*/
    @ExcelProperty("订单ID")
    private String orderId;

    /** 总价*/
    @ExcelProperty("总价")
    private BigDecimal totalFee;

    /** 创建时间*/
    @ExcelProperty("创建时间")
    private Date createTime;

    /** 商品名称*/
    @ExcelProperty("商品名称")
    private String goodsName;

    /** 商品件数*/
    @ExcelProperty("商品件数")
    private int num;

}
        2.controller写导出方法,这个是最简单的导出
    @GetMapping("/exportSimpleExcel")
    public void exportSimpleExcel(HttpServletResponse response) throws Exception{
        // 设置response头信息-文件名使用当前时间
        setHeader(response);
        // 获取excel数据
        List<Order> data = generateOrders();
        // 导出数据
        exportExcel(response,data);
    }


    private void setHeader(HttpServletResponse response) {
        response.reset();
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-disposition", "attachment; filename=" + System.currentTimeMillis() + ".xls");
    }

    private List<Order> generateOrders() {
        ArrayList<Order> orders = new ArrayList<>(10);
        for (int i = 0; i < 10; i++) {
            Order order = new Order();
            order.setOrderId(System.nanoTime() + "");
            order.setGoodsName("商品" + i);
            order.setTotalFee(BigDecimal.ONE);
            order.setCreateTime(new Date());
            order.setNum(5);
            orders.add(order);
        }
        return orders;
    }

    private void exportExcel(HttpServletResponse response, List<Order> data) throws Exception{
        EasyExcel.write(response.getOutputStream(), Order.class).sheet("订单").doWrite(data);
    }

然后在浏览器输入我们的地址就下载下来了,实现效果就不再沾图了。

2.3.3 复杂列表导出

        1.controller代码如下:
    @GetMapping("/exportComplexHeadExcel")
    public void exportComplexHeadExcel(HttpServletResponse response) throws Exception{
        // 设置response头信息-文件名使用当前时间
        setHeader(response);
        // 获取excel数据
        List<Order> data = generateOrders();
        // 导出数据
        exportComplexHeadExcel(response,data);
    }


    private void exportComplexHeadExcel(HttpServletResponse response, List<Order> data) throws Exception{
        EasyExcel.write(response.getOutputStream()).sheet("订单").head(getHeadData()).doWrite(data);
    }

    private List<List<String>> getHeadData() {
        List<List<String>> heads = new ArrayList<>();
        // 第一层循环行数的循环
        for (int column = 0; column < 5; column++) {
            List<String> columnData = new ArrayList<>();
            heads.add(columnData);
            // 表头第一列数据
            if(column==0){
                addFirstColumnData(columnData);
                continue;
            }
            // 表头第二列数据
            if(column==1){
                addSecondColumnData(columnData);
                continue;
            }
            // 表头第三列数据
            if(column==2){
                addThreeColumnData(columnData);
                continue;
            }
            // 表头第四列数据
            if(column==3){
                addFourColumnData(columnData);
            }
            // 表头第五列数据
            if(column==4){
                addFivelumnData(columnData);
            }
        }
        return heads;
    }

    private void addFivelumnData(List<String> lineData) {
        for (int lineNum = 0; lineNum < 3; lineNum++) {
            if(lineNum == 0){
                lineData.add("订单信息汇总");
                continue;
            }
            if(lineNum == 1){
                lineData.add("2023年12月26");
                continue;
            }
            lineData.add("商品件数");
        }
    }

    private void addFourColumnData(List<String> lineData) {
        for (int lineNum = 0; lineNum < 3; lineNum++) {
            if(lineNum == 0){
                lineData.add("订单信息汇总");
                continue;
            }
            if(lineNum == 1){
                lineData.add("");
                continue;
            }
            if(lineNum == 2){
                lineData.add("商品名称");
            }
        }
    }

    private void addThreeColumnData(List<String> lineData) {
        for (int lineNum = 0; lineNum < 3; lineNum++) {
            if(lineNum == 0){
                lineData.add("订单信息汇总");
                continue;
            }
            if(lineNum == 1){
                lineData.add("");
                continue;
            }
            if(lineNum == 2){
                lineData.add("创建时间");
            }
        }
    }

    private void addSecondColumnData(List<String> lineData) {
        for (int lineNum = 0; lineNum < 3; lineNum++) {
            if(lineNum == 0){
                lineData.add("订单信息汇总");
                continue;
            }
            if(lineNum == 1){
                lineData.add("");
                continue;
            }
            if(lineNum == 2){
                lineData.add("总价");
            }
        }
    }

    private void addFirstColumnData(List<String> lineData) {
        for (int lineNum = 0; lineNum < 3; lineNum++) {
            if(lineNum == 0){
                lineData.add("订单信息汇总");
                continue;
            }
            if(lineNum == 1){
                lineData.add("荆州公司");
                continue;
            }
            if(lineNum == 2){
                lineData.add("订单ID");
            }
        }
    }

        2.表头分析

        代码可以通过,head需要传的数据是List<List<String>>数据结构的数据,这个外层的List是column,这个里边的是line数据。分清楚这个,那么其他的就和简单列表是一样的了。

2.3.4 含图片导出

        1.实体增加图片字段
@Data
public class Order {

    /** 订单ID*/
    @ExcelProperty("订单ID")
    private String orderId;

    /** 总价*/
    @ExcelProperty("总价")
    private BigDecimal totalFee;

    /** 创建时间*/
    @ExcelProperty("创建时间")
    private Date createTime;

    /** 商品名称*/
    @ExcelProperty("商品名称")
    private String goodsName;

    /** 商品件数*/
    @ExcelProperty("商品件数")
    private int num;

    /** 商品图片*/
    @ExcelProperty("商品图片")
    private File img;
}
        2.controller代码
    @GetMapping("/exportContailImgExcel")
    public void exportContailImgExcel(HttpServletResponse response) throws Exception{
        // 设置response头信息-文件名使用当前时间
        setHeader(response);
        // 获取excel数据
        List<Order> data = generateOrders();
        // 添加图片
        addImg(data);
        // 导出数据
        exportContailImgExcel(response,data);
    }

    private void setHeader(HttpServletResponse response) {
        response.reset();
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-disposition", "attachment; filename=" + System.currentTimeMillis() + ".xls");
    }

    private List<Order> generateOrders() {
        ArrayList<Order> orders = new ArrayList<>(10);
        for (int i = 0; i < 10; i++) {
            Order order = new Order();
            order.setOrderId(System.nanoTime() + "");
            order.setGoodsName("商品" + i);
            order.setTotalFee(BigDecimal.ONE);
            order.setCreateTime(new Date());
            order.setNum(5);
            orders.add(order);
        }
        return orders;
    }

    private void addImg(List<Order> data) throws Exception{
        for (int i = 0; i < data.size(); i++) {
            Order order = data.get(i);
            order.setImg(new File("D:\\img\\shanzi.png"));
        }
    }

    private void exportContailImgExcel(HttpServletResponse response, List<Order> data) throws Exception{
        EasyExcel.write(response.getOutputStream(), Order.class).sheet("订单").doWrite(data);
    }

本次导出使用了本地图片,官网还支持其他的方式,大家可以看看官网。

先分享到这,有问题欢迎提问。

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

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

相关文章

探究element-ui 2.15.8中<el-input>的keydown事件无效问题

一、问题描述 今天看到一个问题&#xff0c;在用Vue2element-ui 2.15.8开发时&#xff0c;使用input组件绑定keydown事件没有任何效果。 <template><div id"app"><el-input v-model"content" placeholder"请输入" keydown&quo…

代码随想录算法训练营day1|704.二分查找、27.移除元素

第一章 数组 part01 今日任务 数组理论基础&#xff0c;704. 二分查找&#xff0c;27. 移除元素 详细布置 数组理论基础 文章链接&#xff1a;代码随想录 题目建议&#xff1a; 了解一下数组基础&#xff0c;以及数组的内存空间地址&#xff0c;数组也没那么简单。 704. 二…

记edusrc一处信息泄露登录统一平台

本文由掌控安全学院 - sbhglqy 投稿 目录 前言 测试思路 免费领取安全学习资料包&#xff01;​ 前言 我们都知道像大学之类的各种平台的登录账号基本上是学号&#xff0c;初始登录密码基本上是学生身份证的后6位再拼接上一些带有学校缩写的英文字母。所以我们在找漏洞的时…

HarmonyOS4.0开发应用(四)【ArkUI状态管理】

ArkUI状态管理 分为以下四个: StateProp和LinkProvide和ConsumeObserved和ObjectLink State 相当于vue中data()内定义的属性变量&#xff0c;相当于react中useState()的使用,即绑定在视图上的响应式变量&#xff0c;可动态更新~ Tip: 标记的变量必须初始化&#xff0c;不可为空…

手把手带你开发Cesium三维场景【3D智慧城市警情预警】

&#x1f4e2; 鸿蒙专栏&#xff1a;想学鸿蒙的&#xff0c;冲 &#x1f4e2; C语言专栏&#xff1a;想学C语言的&#xff0c;冲 &#x1f4e2; VUE专栏&#xff1a;想学VUE的&#xff0c;冲这里 &#x1f4e2; CSS专栏&#xff1a;想学CSS的&#xff0c;冲这里 &#x1f4…

LabVIEW利用视觉引导机开发器人精准抓取

LabVIEW利用视觉引导机开发器人精准抓取 本项目利用单目视觉技术指导多关节机器人精确抓取三维物体的技术。通过改进传统的相机标定方法&#xff0c;结合LabVIEW平台的Vision Development和Vision Builder forAutomated Inspection组件&#xff0c;优化了摄像系统的标定过程&a…

使用机器学习进行语法错误检测/纠正

francescofranco_39234 一、说明 一般的学习&#xff0c;特别是深度学习&#xff0c;促进了自然语言处理。各种模型使人们能够执行机器翻译、文本摘要和情感分析——仅举几个用例。今天&#xff0c;我们将研究另一个流行的用途&#xff1a;我们将使用Gramformer构建一个用于机器…

传统船检已经过时?AR智慧船检来助力!!

想象一下&#xff0c;在茫茫大海中&#xff0c;一艘巨型货轮正缓缓驶过。船上的工程师戴着一副先进的AR眼镜&#xff0c;他们不再需要反复翻阅厚重的手册&#xff0c;一切所需信息都实时显示在眼前。这不是科幻电影的场景&#xff0c;而是智慧船检技术带来的现实变革。那么问题…

VMware之FTP的简介以及搭建计算机端口的介绍

目录 一.FTP的简介 1.1 FTP的作用 二.FTP的搭建 2.1 建立组和用户 2.2 添加角色和功能 2.3 用户绑定组 2.4 配置FTP服务器 2.5 授权 2.5 连接测试 三.计算机端口介绍 3.1 端口分类&#xff1a; 3.2 常见的计算机端口及其用途&#xff1a; 四.附图-思维…

C语言使用蔡勒公式判断日期的星期

引言 在日常编程中&#xff0c;处理日期和时间是一个常见的任务。而了解一个特定日期是星期几&#xff0c;是许多应用程序中的一个基本需求。本篇博客将深入解析一个用于计算星期的 C 语言函数。 代码概览 这个函数使用了蔡勒公式来实现&#xff0c;蔡勒公式&#xff08;Zel…

启明智显开源项目分享|基于Model 3c芯片的86中控面板ZX3D95CM20S-V11项目软硬件全开源

前言&#xff1a; 本文为4寸 480*480 RGB接口IPS全面触屏的86中控面板&#xff08;RT-ThreadLVGL&#xff09;软硬件开源干货内容&#xff0c;该项目是综合性非常强的RTOS系列项目&#xff01;项目主控芯片使用 Model 3c&#xff0c;整体实现了简化版本的86中控面板的功能需求…

EDA巨头千亿级收购案谈判中 | 百能云芯

近期传出消息&#xff0c;电子设计自动化&#xff08;EDA&#xff09;领域的巨头新思科技&#xff08;Synopsys&#xff09;已向计算机辅助工程&#xff08;CAE&#xff09;软件行业的领导者安世&#xff08;Ansys&#xff09;递交了一份收购要约。据悉&#xff0c;新思科技的报…

快速排序:高效分割与递归,排序领域的王者算法

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《数据结构&算法》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! &#x1f4cb; 前言 快速排序这个名词&#xff0c;快排之所以叫快排肯定是有点东西的。他在处理大规模数据集时表现及其…

处理urllib.request.urlopen报错UnicodeEncodeError:‘ascii‘

参考&#xff1a;[Python3填坑之旅]一urllib模块网页爬虫访问中文网址出错 目录 一、报错内容 二、报错截图 三、解决方法 四、实例代码 五、运行截图 六、其他UnicodeEncodeError: ascii codec 问题 一、报错内容 UnicodeEncodeError: ascii codec cant encode charac…

缓存和缓冲的区别

近期被这两个词汇困扰了&#xff0c;感觉有本质的区别&#xff0c;搜了一些资料&#xff0c;整理如下 计算机内部的几个部分图如下 缓存&#xff08;cache&#xff09; https://baike.baidu.com/item/%E7%BC%93%E5%AD%98 提到缓存&#xff08;cache&#xff09;&#xff0c;就…

【LeetCode-剑指offer】--3.比特位计数

3.比特位计数 class Solution {public int[] countBits(int n) {int[] bites new int[n 1];for(int i 0 ; i < n;i){bites[i] Count(i);}return bites;}public int Count(int x){int count 0;while(x > 0){x & (x - 1);count;}return count;} }

【SVN】Windows版合并提交bat文件+自定义菜单快捷键

【工具向】利用bat批处理打开TortoiseGit简化版本管理流程_tortoisegit bat-CSDN博客 start cmd /k "cd C:\YourBranchProj && svn cleanup && svn update && svn merge C:\YourTrunkProj -r 历史版本号:HEAD && svn commit -m "me…

项目接口性能优化方案

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;CSDN实力新星&#xff0c;后端开发两年经验&#xff0c;曾担任甲方技术代表。会点点Java相关技术栈、帆软报表、低代码平台快速开发。技术尚浅&#xff0c;闭关学习中 &#x1f60…

论文阅读《Restormer: Efficient Transformer for High-Resolution Image Restoration》

论文地址:https://openaccess.thecvf.com/content/CVPR2022/html/Zamir_Restormer_Efficient_Transformer_for_High-Resolution_Image_Restoration_CVPR_2022_paper.html 源码地址:https://github.com/swz30/Restormer 概述 图像恢复任务旨在从受到各种扰动(噪声、模糊、雨滴…

低延时视频技术的应用场景和挑战

编者按 无线网络对人们的生活产生了巨大的影响&#xff0c;而5G技术的引入将彻底改变我们与世界互联互通的方式。在5G时代&#xff0c;实现万物互联离不开低延时技术的应用。 LiveVideoStackCon 2023 深圳站邀请到秒点科技的CEO扶凯&#xff0c;为大家分享低延时技术在物联网、…