java EasyExcel 的使用

2023-11-09

java 中 excel 的写入和导出使用的是 阿里巴巴的 EasyExcel

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.2.1</version>
        </dependency>

生成Excel

首先根据要生成的表格的 字段创建相应的实体类
可以在 ExcelProperty 中设置value(表头字段名) index(这个是读取时使用的列的序号, 从0开始)
@DateTimeFormat() 用来设置表中的日期显示格式 @NumberFormat(“#.##%”) 用来设置数字的显示格式

package com.huang.testrenren.excel;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import lombok.Data;

import java.util.Date;
@Data
public class StudentMode {
    @ExcelProperty(value = "学生id",index = 0)
    private Integer id;

    @ExcelProperty(value = "学生姓名",index = 1)
    private String name;

    @ExcelProperty(value = "学生性别",index = 2)
    private String sex;

    //这里是 alibaba 的 DateTimeFormat  生成表格时的日期格式
    @DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")
    @ExcelProperty(value = "创建日期",index = 3)
    private Date createTime;


    /**
     * 我想写到excel 用百分比表示
    @NumberFormat("#.##%")
    @ExcelProperty(value = "数字标题")
    private Double doubleData;
   */

}

创建一批数据, 后面的代码中就不写了

        //创建一批数据
        ArrayList<StudentMode> stu = new ArrayList<>();
        for (int i=0;i<10;i++){
            StudentMode studentMode = new StudentMode();
            studentMode.setId(i);
            studentMode.setName("huang"+i);
            studentMode.setSex("女"+i);
           	studentMode.setCreateTime(new Date());
            stu.add(studentMode);
        }

方法一 (这种方法适合数据量不大, 可以一次性写入数据的情况)

        String path = "D:/myWrite1.xlsx";  //写入xlsx 的文件
        EasyExcel.write(path,StudentMode.class).sheet("学生信息表").doWrite(stu);

方法二 (这种方法适合数量比较大,可以用来写入数据量比较多的情况)


try{
           ExcelWriter excelWriter = EasyExcel.write(path, StudentMode.class).build();
           WriteSheet sheet = EasyExcel.writerSheet("学生信息表").build();
			//就用上面的  ArrayList stu
           excelWriter.write(stu, sheet);
			//excelWriter 会自动 close
			//如果我们有很多数据写入的话, 在这里, 我们可以使用 循环		
            // 比如说从数据库中 查出分页的数据, 再写入表中
           	/**  下面是伪代码
				for(int page = 1;page<10;page++){
					pagestulist = ....
					excelWriter.write(pagestulist,sheet)
				}
			*/
       }catch (Exception e){
           System.out.printf(e.getMessage());
       }

通过模板写入数据

个人认为, 通过模板写入数据, 好像就是把模板的数据和新加的数据合起来写入了 excel 表中
首选去新建一个模板,然后, 再指定新的生成的 xlsx 文件的路径

   String demopath = "C:\\Users\\Administrator\\Desktop\\学生信息表.xlsx";   //模板文件的位置
        String filename = "D:/mywriteWithModel.xlsx";       //新生成的文件的位置
//就用上面的 ArrayList  stu 
  EasyExcel.write(filename, StudentMode.class).withTemplate(demopath).sheet().doWrite(stu);

在web 项目中写excel

有时候我们在 web 项目中, 会使用 下载表格成 excel 的功能

  @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(), DownloadData.class).sheet("模板").doWrite(data());
    }

如果我们下载excel时表单出错了, 可以这样返回 json 数据 , 主要要注意 catch 语句中的 response.reset

   @GetMapping("downloadFailedUsingJson")
    public void downloadFailedUsingJson(HttpServletResponse response) throws IOException {
        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
        try {
            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(), DownloadData.class).autoCloseStream(Boolean.FALSE).sheet("模板")
                .doWrite(data());
        } catch (Exception e) {
            // 重置response
            response.reset();
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            Map<String, String> map = MapUtils.newHashMap();
            map.put("status", "failure");
            map.put("message", "下载文件失败" + e.getMessage());
            response.getWriter().println(JSON.toJSONString(map));
        }
    }

读取excel

EasyExcel 的读取excel 主要是使用的监听器,读取时的操作逻程就是写在监听器的方法中

方法

创建一个相应的监听器,继承 ReadListener(T) 加上,表的实例对象, T
比如我们要读取上面的 生成出来的 excel 文件

第一步, 创建 StudentMode 的类, 这个已经创建过了

第二步, 创建 ReadListener<StudentMode>

package com.huang.testrenren.excel;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.read.listener.ReadListener;

import java.util.Map;

public class StudentModeReadListener implements ReadListener<StudentMode> {

    @Override
    public void invokeHead(Map<Integer, ReadCellData<?>> headMap, AnalysisContext context) {
    //这个方法可以得到表头的信息
       // System.out.println(headMap.get(0).getStringValue());
      //  Set<Integer> integers = headMap.keySet();
        
       // for (Integer integer : integers) {
       //     String stringValue = headMap.get(integer).getStringValue();
      //      System.out.println(stringValue);
	//}

        System.out.println("***"+headMap);
    }

    @Override
    public void invoke(StudentMode studentMode, AnalysisContext analysisContext) {
    	//这个方法可以得到表中的数据信息
    	//逻辑方法可以写在这里面, 比如对数据的处理, 或者把数据 存入数据库
        System.out.println("****"+studentMode);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
		//这里是最后执行的方法, 可以用来关闭 资源句柄什么的
    }
}

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

java EasyExcel 的使用 的相关文章

  • 如何使用postman调用REST API进行azure文件存储?

    我想通过postman调用azure的文件存储相关的REST API 以下是我提出请求的方式 我正在请求列出文件存储帐户中的所有共享 如下所述 https learn microsoft com en us rest api storage
  • 在 Windows 7 中,不从命令行强制终止 JVM

    我在 JVM 中运行了 Cobertura 仪器化 jar 当我在运行应用程序的 Windows 控制台中按 Ctrl C 时 JVM 结束并Cobertura 结果已成功刷新到 cobertura ser 文件 但我需要使用命令 工具 不
  • android-透明RelativeLayout

    我想要制作一个具有可绘制渐变作为背景的活动 并将在其背景顶部显示 4 个面板 相对布局 现在我想让 4 个面板透明 例如 50 以便也可以看到渐变背景 我搜索了谷歌 但我发现只能通过活动而不是布局来做到这一点 如何做我想做的事 您可以创建一
  • spring boot框架下如何过滤tomcat产生的访问日志

    我们使用spring boot框架 通过嵌入式tomcat生成访问日志 访问日志的格式如下 server tomcat access log enabled true server tomcat access log pattern h l
  • 将json URL导入到java并使用jackson库解析它

    我正在尝试读取 java 中的 json 链接并解析它 以便我可以将它用于其他事务 但问题是我收到错误 我真的不知道该如何处理它们 这是代码 package weather data import weather data import c
  • 在 Java 和 C 中在运行时调用名为“string”的方法

    我们如何调用名称为的方法string在运行时 谁能告诉我如何在 Java 和 C 中做到这一点 在java中可以通过反射api来完成 看一下Class getMethod String methodName Class parameterT
  • 将图像缩略图上传到服务器,而不上传整个图像

    据我所知 我在这里问的是不可能的 但我想无论如何我都会问 以防我遗漏了什么 假设您想让用户上传 JPG 图像 并且这些图像被缩放为较小的图标 并且原始图像始终被丢弃并且不再需要 有没有什么方法可以在大多数现代浏览器中普遍使用 让用户选择硬盘
  • com.google.gwt.dev.jjs.InternalCompilerException:访问期间出现意外错误

    我在使用版本 2 6 0 编译 gwt 应用程序时遇到以下错误 最初我用 gwt 版本 2 6 1 的 maven 编译它 然后尝试通过版本 2 6 0 的 eclipse 编译它 跟版本兼容有关系吗 com google gwt dev
  • SwingWorker 在 Unsafe.park() 处挂起

    我有一个SwingWorker与后台服务器通信 然后更新JFrame 我正在调试我的应用程序并注意到即使在SwingWorker完成了它的工作 它的线程仍然存在 它挂在Unsafe park java lang Object 这是一个本机方
  • 为什么我无法解开根节点并反序列化对象数组?

    为什么我无法通过展开根节点来反序列化对象数组 import java io IOException import java util Arrays import java util List import org codehaus jack
  • 在java中将jpeg/png转换为像素数组

    如何将包含 jpeg 或 png 的字符串转换为像素数组 最好是一维 理想情况下使用java内置的类 原来你需要公共文件上传 http commons apache org fileupload 看着那 这用户指南 http commons
  • 使用 java.nio.file.Paths 接口时缺少方案(IllegalArgumentException)

    这是一个非常简单的java问题 我在 Linux 系统上使用 Java 8 和 eclipse kepler 我一直在尝试尝试NIO 2 我的代码是 package lucasTest import java io IOException
  • Hibernate3:自引用对象

    需要一些帮助来了解如何执行此操作 我将在文件系统上运行递归 查找 并且希望将信息保留在单个数据库表中 具有自引用的层次结构 这是我想要填充的数据库表结构 目录对象表 id int NOT NULL name varchar 255 NOT
  • 如何在 apache poi 中找到包含图片的单元格

    我尝试在 xls 文档中循环图像 我写下一个代码 HSSFPatriarch patriarch sheet getDrawingPatriarch if patriarch null Loop through the objects fo
  • 将 Class 对象转换为字节

    如果我有一个Class http java sun com j2se 1 5 0 docs api java lang Class html在运行时实例 我可以获得它的 byte 表示形式吗 我感兴趣的字节将在类文件格式 http java
  • Java 通用问题

    下面的代码可以编译 但如果我取消注释行 它不会编译 我很困惑为什么 HashMap 确实扩展了 AbstractMap 并且声明映射的第一行可以正常编译 import java util AbstractMap import java ut
  • 使用 colt java lib 时出现“矩阵太大”异常

    我正在使用 cern colt matrix lib 进行稀疏矩阵计算 但似乎我一直遇到此错误 线程 main 中的异常 java lang IllegalArgumentException 矩阵太大 我认为这是因为构造函数在 nrows
  • Hive NVL 不适用于列的日期类型 - NullpointerException

    我正在使用 HDFS 上的 MapR Hive 发行版并面临以下问题 如果表的列类型是 日期 类型 则NVL https cwiki apache org confluence display Hive LanguageManual UDF
  • 我可以从同一个 jar 文件执行两个不同的类吗?

    我有一个项目 在一个包中我制作了服务器 在第二个包中我制作了客户端 它运行良好 我想创建一个 Jar 文件 是否可以使用同一个 jar 文件分别运行客户端和服务器 我使用了只有一个 main 的 jar 文件 当我运行 jar 文件时 它会
  • 如何获取 EC2 实例的 CloudWatch 指标数据

    我想获取我的 EC2 实例的 Cloudmetrics 数据 以便我可以使用这些数据绘制图表并将其显示在我的 Android 设备上 我怎么做 有相同的示例程序或教程吗 提前致谢 这就是我正在做的 private static void f

随机推荐

  • vscode 运行和调试 javascript 代码

    安装node 安装vscode 扩展包 code runer 配置vs code下有关F5的操作的文件 参考地址
  • 【Zabbix实战之运维篇】Zabbix监控Docker容器配置方法

    Zabbix实战之运维篇 Zabbix监控Docker容器配置方法 一 检查Zabbix监控平台状态 1 检查Zabbix各组件容器状态 2 奸诈Zabbix server状态 二 下载监控模板 1 进入Zabbix官网下载页面 2 查看下
  • 微信小程序中识别html标签的方法

    rich text组件 在微信小程序中有一个组件rich text可以识别文本节点或是元素节点 具体入下 需要识别的数据放在data中 然后放在nodes属性中即可
  • 编写程序:5类员工有对应封装类,创建Employee数组,若干不同的Employee对象,并实现增删改查功能(《黑马程序员》P144编程题加强版)

    文章目录 Employee类 SalariedEmployee类 HourlyEmployee类 SalesEmployee类 BasePlusSalesEmployee类 Test类 实现增删改查 原题 1 Employee 这是所有员工
  • 【python】深入了解Selenium-PageObject

    1 PageObject 定义 Page Object 简称PO 模式 是Selenium实战中最为流行 并且是自动化测试中最为熟悉和推崇的一种设计模式 在设计自动化测试时 把页面元素和元素的操作方法按照页面抽象出来 分离成一定的对象 然后
  • Sophus使用记录

    sophus库是一个基于Eigen的C 李群李代数库 可以用来方便地进行李群李代数的运算 头文件 主要用到以下两个头文件 include
  • 基于水文规约SL651-2014的“定时报”解析

    一 概述 水文监测数据通信规约SL651 2014规定了水文监测系统中前端传感器与遥测终端以及中心站之间的数据通信协议 本文将以M21F系列RTU为例 详细描述符合SL651 2014数据通信规约标准的遥测站终端与中心站之间的 定时报 报文
  • Go开源库Excelize介绍,电子Excel表格操作强大的库

    Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库 基于 ECMA 376 ISO IEC 29500 国际标准 项目作者是续 日 现任阿里巴巴软件工程师 曾就职百度 奇虎360公司 前百度Go语言编程委员
  • 循环监测b站用户粉丝数、舰长数及增量 程序

    前言 开发语言 python 3 8 功能介绍 循环监测b站用户粉丝数 舰长数及增量 实时打印 并存入数据库中 使用说明 运行 双击运行 bat 输入用户UID 回车 再输入循环周期 回车 即可开始监测 ps 数据存储是sqlite 可以使
  • 如何处理地址不对齐指令?

    连续不断是处理器取指的另一个目标 如果处理器在每一个时钟周期都能取一条指令 就可以源源不断的为处理器提供后续指令流 而不会出现空闲的时钟周期 地址不对齐导致问题 不管是从指令缓存 还是从ITCM中取指令 若处理器遇到了一条地址不对齐的指令
  • H桥L298N两端输出电压不同的原因

    目录 1 问题的证明 2 L298N的原理 3 问题的解决 在做拉力车的时候 电机总是转速不同 起初以为是电机问题 但换成新电机后仍然存在这种问题 又怀疑是导线的问题 因为两电机的导线粗细不同 误以为PWM调速时会被影响 后来锁定问题 就是
  • Leetcode337:打家劫舍 III

    在上次打劫完一条街道之后和一圈房屋后 小偷又发现了一个新的可行窃的地区 这个地区只有一个入口 我们称之为 根 除了 根 之外 每栋房子有且只有一个 父 房子与之相连 一番侦察之后 聪明的小偷意识到 这个地方的所有房屋的排列类似于一棵二叉树
  • 2605. 从两个数字数组里生成最小数字

    文章目录 Tag 题目来源 题目解读 解题思路 方法一 枚举比较法 方法二 集合的位运算表示法 写在最后 Tag 贪心 位运算 数组 题目来源 2605 从两个数字数组里生成最小数字 题目解读 给定两个各自只包含数字 1 到 9 的两个数组
  • ImportError: No module named ‘seaborn‘

    在已经使用pip install seaborn 或者 conda install seaborn 之后 在虚拟环境下 启动jupyter 但是报出下面错误 1 需要去考虑一下你的内核是不是发生改变 或者建议重启一下内核 注意 一般情况之下
  • ​微众区块链×华南理工:连续四年深度合作,共育区块链+ESG复合型人才

    近日 在经历了六周的紧张学习后 来自华南理工大学软件学院的同学们完成了第四届 区块链实训课 的答辩 该实训课由微众区块链与华南理工大学共建 也是双方第四次合作的成果 令人耳目一新的是 本次实训课在往年成熟的课程体系之上 新增了一门叫做 开源
  • thinkphp 随笔——模型更新成功返回的数据

    thinkphp 随笔 模型更新成功返回的数据 先上图 这是我修改了一个表内的 value 字段 修改成功之后返回了这个字段的最新值 thinkphp 随笔 个人博客 http www sharekong xyz 欢迎访问
  • 关于《时间管理》

    01 为什么需要时间管理 我们 多数人不是富二代 也不是官二代 如何比得过白富美和高富帅 在万千的不公平中 还有这唯一公平的资源 时间 好好把你的时间加以管理 以弥补并创造出其他的资源 人的一生两个最大的财富是 你的才华和你的时间 才华越来
  • 机器学习——线性回归模型及python代码实现

    机器学习 公式推导与代码实践 鲁伟著读书笔记 在机器学习的学习过程中 相信大家首先要学习的就是线性模型 而线性模型中 线性回归 Linear Regression 是一种非常经典方法 现在我从线性回归的数学原理出发 手推数学公式 并结合py
  • winform相关问题收录

    一 WinForm 代码实现以管理员身份运行 from http www cnblogs com 08shiyan p 3267165 html MY http user qzone qq com 319636886 2 二 winfrom
  • java EasyExcel 的使用

    java 中 excel 的写入和导出使用的是 阿里巴巴的 EasyExcel