【EasyExcel】后台开发如何利用EasyExcel优雅的操作Excel

论阿里easyexcel导出Excel的优雅性,会否超乎您的预期呢? 我们直奔主题:阿里easyexcel导出Excel文件的优雅性有哪些具体表现? 准备工作之引入Jar依赖: Gradle: // https://mvnrepository.com/artifact/com.alibaba/easyexcel compile group: 'com.alibaba', name: 'easyexcel', version: '1.0.2' Maven: ... 阅读详情

引言

EasyExcel是当前性能最佳的Excel导出工具,本篇少侠将带领大家一起在后台开发中优雅的使用EasyExcel。

优雅的读取Excel

后台接口读取文档通常使用MultipartFile类型,通过该类型可以构造出InputStream流。
利用EasyExcel读取Excel需要先构造一个监听器,暖男露飞已经帮你们准备好啦:

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;

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

/**
 * @author Carson
 * @date 2020/6/4 21:26
 */
public class ExcelReaderListener<T> extends AnalysisEventListener<T> {
    /**
     * 返回的数据集
     */
    private List<T> list = new ArrayList<>(1 << 6);

    /**
     * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
     */
    public ExcelReaderListener() {
    }

    /**
     * 这个每一条数据解析都会来调用
     *
     * @param data    数据
     * @param context Excel读取上下文
     */
    @Override
    public void invoke(T data, AnalysisContext context) {
        System.out.printf("解析到一条数据:{%s}", JSON.toJSONString(data));
        System.out.println();
        list.add(data);
    }

    /**
     * 所有数据解析完成了 都会来调用
     *
     * @param context Excel读取上下文
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
    }

    public List<T> getList() {
        return list;
    }

    public void setList(List<T> list) {
        this.list = list;
    }
}

创建好监听器之后,就需要手动写一个工具类,专门用于读取Excel的,少侠这里准备了两种读取方式:

import com.alibaba.excel.EasyExcel;

import java.io.InputStream;
import java.util.List;

/**
 * @author Carson
 * @date 2020/6/4 21:31
 */
public class ExcelReaderUtil<T> {
    private Class<T> clazz;

    public ExcelReaderUtil(Class<T> clazz) {
        this.clazz = clazz;
    }

    public List<T> readByStream(InputStream inputStream) {
        ExcelReaderListener<T> readerListener = new ExcelReaderListener<>();
        EasyExcel.read(inputStream, clazz, readerListener).sheet().doRead();
        return readerListener.getList();
    }

    public List<T> readByPath(String fileName) {
        ExcelReaderListener<T> readerListener = new ExcelReaderListener<>();
        EasyExcel.read(fileName, clazz, readerListener).sheet().doRead();
        return readerListener.getList();
    }
}

备注:少侠这里的代码用的都是泛型,觉得不想细看的可以直接复制过去使用。

基本读取工具类已经实现完成,然后就是模板类的创建啦,什么是模板类呢,就是根据每个Excel表头有不同的参数表示的类,每个参数用@ExcelProperty注解修饰,注解的括号里的内容就是Excel里的表头。

@Data
public class GoodsReaderModel {
    @ExcelProperty("商品SKU")
    public Long skuId;

    @ExcelProperty("活动开始时间")
    public String startTime;

    @ExcelProperty("活动结束时间")
    public String finishTime;
}

然后在接口里进行读取:

    @RequestMapping(value = "/import", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
    @ApiOperation(value = "导入商品信息", httpMethod = "POST", notes = "导入商品信息")
    @ResponseBody
    public List<GoodsReaderModel > importGoodsFromExcel(@RequestParam("excel") MultipartFile multipartFile, HttpServletRequest request) {
        if (multipartFile == null) {
            LOGGER.info("输入的Excel信息为空");
            return null;
        }
        ExcelReaderUtil<GoodsReaderModel> excelReader = new ExcelReaderUtil<>(GoodsReaderModel.class);
        List<GoodsReaderModel> modelList = Lists.newArrayList();
        try {
            InputStream inputStream = multipartFile.getInputStream();
            modelList = excelReader.readByStream(inputStream);
        } catch (IOException e) {
            LOGGER.info("对不起,未找到文件");
            return null;
        }
        //后续数据处理逻辑
    }

优雅的写入Excel

在接口中下载Excel同样也可以优雅,先附上通用格式处理类:

import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.handler.WriteHandler;
import com.alibaba.excel.write.metadata.WriteWorkbook;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.google.common.collect.Lists;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;

import javax.servlet.ServletOutputStream;
import java.util.List;

/**
 * @author Carson
 * @date 2020/6/5 19:39
 */
public class ExcelWriterUtil {

    public WriteWorkbook workbookGenerator(ServletOutputStream outputStream) {
        WriteWorkbook workbook = new WriteWorkbook();
        workbook.setOutputStream(outputStream);
        workbook.setExcelType(ExcelTypeEnum.XLSX);
        workbook.setNeedHead(true);

        // 头的策略
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        //设置表头左对齐
        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
        headWriteCellStyle.setBorderTop(BorderStyle.THIN);
        headWriteCellStyle.setBorderBottom(BorderStyle.THIN);
        headWriteCellStyle.setBorderLeft(BorderStyle.THIN);
        headWriteCellStyle.setBorderRight(BorderStyle.THIN);
        headWriteCellStyle.setFillBackgroundColor(IndexedColors.SKY_BLUE.getIndex());
        // 内容的策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        //设置内容靠左对齐
        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
        contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
        contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
        contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
        contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
        WriteFont writeFont = new WriteFont();
        writeFont.setFontName("宋体");
        contentWriteCellStyle.setWriteFont(writeFont);
        contentWriteCellStyle.setFillPatternType(FillPatternType.NO_FILL);
        contentWriteCellStyle.setFillBackgroundColor(IndexedColors.SKY_BLUE.getIndex());
        // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
        HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
        List<WriteHandler> customWriteHandlerList = Lists.newArrayList();
        customWriteHandlerList.add(horizontalCellStyleStrategy);
        workbook.setCustomWriteHandlerList(customWriteHandlerList);
        return workbook;
    }
}

然后在接口请求里就可以这么写了:

   @RequestMapping(value = "export", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})
    @ApiOperation(value = "数据导出", httpMethod = "GET", notes = "数据导出")
    @ResponseBody
    public void exportData() {
       
              //根据自己实际业务获取数据,注意每行数据是一个List
            List<List<String>> resList = Lists.newArrayList();

        try{
            ServletOutputStream outputStream = response.getOutputStream();
           
            WriteWorkbook workbook = new ExcelWriterUtil().workbookGenerator(outputStream);
    
            ExcelWriter writer = new ExcelWriter(workbook);
            String fileName = new String("data");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
            WriteSheet writeSheet = new WriteSheet();
            writeSheet.setSheetName("数据明细");
            writeSheet.setAutoTrim(true);

            writer.write(resList, writeSheet);
            writer.finish();
        } catch (IOException e) {
            LOGGER.error("导出数据异常", e);
        }
    }

优雅的小结

EasyExcel只是个工具类,个人感觉,比起线程池、消息队列等内容重要性低很多,但是开发中能熟练使用也是真香。个人感觉这是我们用过最好用、效率最高的Excel工具类。少侠曾经做过测试,EasyExcel导出百万条 数据只需要60秒左右(目前Excel最多容纳104万条数据),而传统的POI技术则需要数小时,并且内存优化很差,大对象不能及时回收,很容易造成JVM的FULL GC。

点点关注,不会迷路

Ollama部署本地大模型详细教程 创建ModelfilePARAMETER num_gpu 50 # GPU 层卸载比例(0~100)场景是否推荐本地开发/测试 Agent✅ 强烈推荐内部知识库问答(RAG)✅ 推荐(配合 Pgvector)生产环境高并发服务⚠️ 谨慎(建议评估 vLLM / Triton)需要 Function Calling 的 Agent❌ 不推荐(改用 DashScope API)🔑核心价值Ollama 是“本地大模型的 Docker”——让开源模型像容器一样 easy to run。 阅读详情

相关推荐

阿里云一键登录Java后端实战:5分钟搞定号码认证服务集成(附完整代码)

本文详细介绍了如何在Java后端项目中快速集成阿里云号码认证服务(PNVS),实现高效、安全的一键登录功能。文章从核心架构、安全机制解析入手,提供了完整的Maven依赖配置、服务端环境准备、核心业务逻辑实现(包括Token验证、用户处理、异常降级)以及生产环境下的性能优化、监控与部署方案,并附有可直接使用的完整代码示例。

p1q2r的博客 845

使用新版本EasyExcel优雅的导入和导出Excel文件

一、需求描述 最近系统后台有个关于使用Excel文件导出数据的需求,首先想到了POI和阿里的EasyExcel。经过技术选型和结合具体场景,最终决定使用EasyExcel。 使用过程中,遇到了一些问题,然后去查找资料,发现大多数资料都比较老旧,都是使用1.x或者一些beta版本,没办法就自己去亲自去查阅资料,为了方便后续使用,在此记录一下,也和大家分享一下,如何优雅的使用EasyExcel导入和导...

Evan's Blog ٩(๑❛ᴗ❛๑)۶ 1万+

一种导弹追踪算法的MATLAB仿真实现

以下是一个用于模拟机动变轨导弹和防空导弹追踪过程的 MATLAB 代码,同时会提供 3D 效果展示。你可以运行这段代码,从而观察机动变轨导弹和防空导弹的速度与位置变化。

SmartGridequation的博客 933

EasyExcel

easyexcel学习记录

ArchieSean 6412

YOLOv11 改进 - C2PSA | C2PSA融合Mask Attention掩码注意力,可学习掩码矩阵破解低分辨率特征提取难题 | 2025 预印

本文提出了用于低分辨率图像分割的MaskAttn - UNet框架,并将其核心的掩码注意力机制集成到YOLOv11中。传统U - Net类模型难以捕捉全局关联,Transformer类模型计算量大,而掩码注意力机制通过可学习的掩码,让模型选择性关注重要区域,融合了卷积的局部效率和注意力的全局视野。其工作流程包括特征适配、掩码生成、定向注意力计算和特征融合。我们将掩码注意力机制代码集成到YOLOv11中。

魔改工程师的博客 403

文本分析-使用jieba库进行中文分词和去除停用词(附案例实战)

本文将手把手教会你使用jieba库进行中文分词和去除停用词,这是学会文本分析的必经之路!

m0_64336780的博客 4万+

优雅的使用easyexcel一行代码导出和读取excel

俗话说的好,前人栽树后人乘凉。但是后人也不能忘了栽树人, 注明出处,向阿里开源大佬致敬 https://github.com/alibaba/easyexcel JAVA解析Excel工具easyexcel Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,...

小码哥 5510

深度学习实战87-高中数学自适应测试系统研究与应用研发,前后台页面设计

大家好,我是微学AI ,今天给大家介绍一下深度学习实战87-高中数学自适应测试系统研究与应用研发,前后台页面设计。高中数学自适应测试系统旨在通过精准评估学生能力,用最少的题目发现其薄弱环节,并提供定制化的学习计划,帮助学生快速提升成绩。同时,系统结合了AI大模型实现自动判卷、生成报告,减轻教师负担,并支持个性化作业布置,使教学更加高效。学生可以清晰了解自身学习状态,教师也能获得精准的学生画像,实现差异化教学。

微学AI的博客 444

easyexcel 设置列宽以及内容居中,表头居中问题

ContentStyle(horizontalAlignment = HorizontalAlignment.CENTER)//内容居中。@HeadStyle(horizontalAlignment = HorizontalAlignment.CENTER)//表头居中。@ApiModelProperty(value = "产品名称")@ExcelProperty(value = "数据产品")@ColumnWidth(25)//设置列宽。

weixin_45205875的博客 2253

人像美肤 人体美型 CVPR 2022 ABPN

人像美肤 CVPR 2022 ABPN

jacke121的专栏 841

硬件工程师笔记——三极管Multisim电路仿真实验汇总

NPN型三极管:由N型半导体、P型半导体和N型半导体组成,即NPN结构。 PNP型三极管:由P型半导体、N型半导体和P型半导体组成,即PNP结构。 三极管的工作原理基于电流的控制和放大,其核心是基区对电流的控制作用。 将三极管等效为两个串联的二极管进行等效分析

XU157303764的博客 2635

EasyExcel的使用--写

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。 今天根据官网(www.yuque.com/easyexcel/doc/read)指导,试了一个简单的写入例子,如下。 1.创建一个写入实体: @Data //以下注解设置列宽行高 @ContentRowHeight(10) @HeadRowHeight(20) @ColumnWidth(25) //以下注解设置样式,可以放到字段属性上。 // 头背景设置成红色 IndexedColors.RED.getIndex()

程序员日志 3112

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Spring Boot 集成 EasyExcel 3.x 优雅实现Excel导入导出

EasyExcel 是一个基于 Java 的、快速、简洁、解决大文件内存溢出的 Excel 处理工具。它能让你在不用考虑性能、内存的等因素的情况下,快速完成 Excel 的读、写等功能。在EasyExcel中,以面向对象思想来实现导入导出,无论是导入数据还是导出数据都可以想象成具体某个对象的集合,所以为了实现导出用户信息功能,首先创建一个用户对象UserDO/*** 用户信息*@ExcelProperty("用户编号") @ColumnWidth(20) private Long id;

欲变世界,先变其身 4万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

EasyExcel:让Excel操作变得简单优雅

EasyExcel是阿里巴巴开源的一个基于Java的Excel处理工具,它重写了POI对Excel的解析,能够原本一个3M的Excel用POI sax解析依然需要100M左右内存,改用EasyExcel可以降低到几M,并且再大的Excel也不会出现内存溢出的情况。// 自定义样式写入.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 自适应列宽。

weixin_73735141的博客 1151

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

EasyExcel优雅的读写Excel

EasyExcel入门教程前言EasyExcel是什么?EasyExcel读Excel1. 简单读取EasyExcel写Excel最简单的写参考资料 前言 作为Java后端开发,日常工作中或多或少有遇到读取 Excel 信息到 DB、将DB信息写入到Excel。在传统的解决方案中无非是:POI 、JXL。但这两个框架或多或少存在些缺陷: 内存问题: 通常情况下,我们都是使用POI 的userMo...

迪卡蛙的成长日记 2154

如何优雅地实现 Excel 文件导出功能?(阿里出品的 EasyExcel,安利一波)

EasyExcel 前言 导出是后台管理系统的常用功能,当数据量特别大的时候会内存溢出和卡顿页面,曾经自己封装过一个导出,POI百万级大数据量EXCEL导出 采用了分批查询数据来避免内存溢出和使用SXSSFWorkbook方式缓存数据到文件上以解决下载大文件EXCEL卡死页面的问题。不过一是存在封装不太友好使用不方便的问题,二是这些poi的操作方式仍然存在内存占用过大的问题,三是存在空循环和整除...

Mr_chen的博客 8696

Java使用poi/easyexcel操作excel

前言 在工作的开发过过程中,我们总会遇到将数据导出到excel的需求,下面会讲解当今比较流行的两个工具实现使用Java操作excel 1:poi 2:easyexcel POI介绍 使用poi会相对比较原生,相较于easyExcel比较复杂 针对上图的基本功能的 1 2,workbook的实现类有三个接口。其中SXSSFWorkbook操作excel07版XSSF的升级,速度比XSSF更快。具体下面有写 POI实战-写的操作: 都入相关依赖 <!--xls 03--> &lt

qq_41934680的博客 1402

easyexcel导入_论阿里easyexcel导出Excel的优雅性,会否超乎您的预期呢?

我们直奔主题:阿里easyexcel导出Excel文件的优雅性有哪些具体表现?请往下看!准备工作之引入Jar依赖:Gradle:// https://mvnrepository.com/artifact/com.alibaba/easyexcelcompile group: 'com.alibaba', name: 'easyexcel', version: '1.0.2'Maven: com.a...

weixin_39615219的博客 120

EasyExcel 轻松灵活读取Excel内容

写在前面 Java 后端程序员应该会遇到读取 Excel 信息到 DB 等相关需求,脑海中可能突然间想起 Apache POI 这个技术解决方案,但是当 Excel 的数据量非常大的时候,你也许发现,POI 是将整个 Excel 的内容全部读出来放入到内存中,所以内存消耗非常严重,如果同时进行包含大数据量的 Excel 读操作,很容易造成内存溢出问题 但 EasyExcel 的出现很好的解决了 P...

日拱一兵 8261

优雅地实现 Excel 文件导出功能之easyexcel

简介 Java解析、生成Excel比较有名的框架有Apache poi、jxl,我们使用它们的时候只需要根据自己的业务逻辑,然后再通过百度进行一系列的操作。就能进行拼接和完成自己的需求,但是这个框架的使用会让自己的代码看着十分的。。。。 。 就是不够 优雅 下面就展示一下阿里家的easyexcel:快速、简单避免OOM的java处理Excel工具; 开始 首先引入依赖 <dependency> <groupId>com.alibaba</groupI

weixin_42419325的博客 707

c#后台如何导出excel到本地_惊了!如何通过阿里 EasyExcel 7 行代码, 优雅地实现 Excel 文件导出功能?...

目录一、前言二、Apache poi、jxl 的缺陷三、阿里出品的 EasyExcel,安利一波四、EasyExcel 解决了什么五、快速上手六、特殊场景支持七、Web 下载示例代码八、需要注意的点九、总结一、前言关于导出 Excel 文件,可以说是大多数服务中都需要集成的功能。那么,要如何优雅快速地(偷懒地)去实现这个功能呢?你可能第一想法是:这还不简单?用 Apache 开源框架 p...

weixin_39860946的博客 1059

AI助力Excel数据处理:EASYEXCEL自动化开发指南

数据校验是重点难点,AI帮我快速生成了基于注解的校验框架。传统方式需要手动对照Excel表头写Java类字段,现在只需要把Excel样本文件上传到AI工具,它就能自动识别表头字段和数据类型,生成带注解的Java实体类代码。比如在实现校验规则时,不仅生成了基础代码,还自动添加了国际化的错误提示配置。,它的AI对话功能能快速理解需求生成可用代码,内置的Spring Boot模板和EASYEXCEL集成让项目搭建特别顺畅。最终生成的报告包含错误行号、错误类型和修正建议,直接输出为新的Excel文件,非常实用。

AgatePanther34的博客 816

SpringBoot集成EasyExcel 3.x:高效实现Excel数据的优雅导入与导出

EasyExcel 是一个基于 Java 的、快速、简洁、解决大文件内存溢出的 Excel 处理工具。它能让你在不用考虑性能、内存的等因素的情况下,快速完成 Excel 的读、写等功能。

Yaml4的博客 8295

EasyExcel 优雅实现 Excel 导入导出

EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。

weixin_40381772的博客 3747

EasyExcel:如何用16MB内存处理百万行Excel数据?

在Java开发中,Excel处理一直是性能的痛点。传统的Apache POI在处理大文件时常常导致内存溢出,而EasyExcel通过创新的内存优化设计,彻底改变了这一局面。这个由阿里巴巴开源的Java Excel处理工具,不仅解决了大文件内存溢出的问题,更将性能提升到了新的高度。 ## 🚀 核心理念:为什么EasyExcel与众不同? EasyExcel的核心设计哲学是**流式处理**和**

gitblog_00625的博客 1059

my-tv 电视直播软件:安装即看的零配置方案

my-tv 是一款装上就能看的安卓电视直播软件。它适合想把电视盒当普通电视用的家庭,和只用遥控器操作的人;不适合对付费内容或特定地方台有硬性要求的用户。 ## 📺 my-tv 能做什么:安装即播与遥控器操作 - 安装即播:装上 APK 就能看央视、卫视等频道,不注册账号,不配播放源。 - 遥控器操作:换台、选台、菜单全靠传统电视遥控器按键,无需触屏。 - 兼容范围广:支持 Android 4

gitblog_00033的博客 616
上一篇: Java并发编程(六):volatile原理详解
下一篇: Java并发编程(七):深入浅出队列同步器AQS原理及面试要点
少侠露飞
博客等级 码龄9年 214粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值