EasyExcel详解-写Excel

news2025/2/26 7:32:46

一、注解

使用注解很简单,只要在对应的实体类上面加上注解即可。

ExcelProperty

用于匹配excel和实体类的匹配,参数如下:

名称

默认值

描述

value

用于匹配excel中的头,必须全匹配,如果有多行头,会匹配最后一行头

order

Integer.MAX_VALUE

优先级高于value,会根据order的顺序来匹配实体和excel中数据的顺序

index

-1

优先级高于value和order,会根据index直接指定到excel中具体的哪一列

converter

自动选择

指定当前字段用什么转换器,默认会自动选择。写的情况下只要实现com.alibaba.excel.converters.Converter#convertToExcelData(com.alibaba.excel.converters.WriteConverterContext<T>) 方法即可

ExcelIgnore

默认所有字段都会和excel去匹配,加了这个注解会忽略该字段

ExcelIgnoreUnannotated

默认不管加不加ExcelProperty的注解的所有字段都会参与读写,加了ExcelIgnoreUnannotated注解以后,不加ExcelProperty注解的字段就不会参与

DateTimeFormat

日期转换,用String去接收excel日期格式的数据会调用这个注解,参数如下:

名称

默认值

描述

value

参照java.text.SimpleDateFormat书写即可

use1904windowing

自动选择

excel中时间是存储1900年起的一个双精度浮点数,但是有时候默认开始日期是1904,所以设置这个值改成默认1904年开始

NumberFormat

数字转换,用String去接收excel数字格式的数据会调用这个注解。

名称

默认值

描述

value

参照java.text.DecimalFormat书写即可

roundingMode

RoundingMode.HALF_UP

格式化的时候设置舍入模式

二、参数

概念介绍

  • WriteWorkbook 可以理解成一个excel

  • WriteSheet 理解成一个excel里面的一个表单

  • WriteTable 一个表单里面如果有多个实际用的表格,则可以用WriteTable

通用参数

WriteWorkbook,WriteSheet ,WriteTable都会有的参数,如果为空,默认使用上级。

名称

默认值

描述

converter

默认加载了很多转换器,这里可以加入不支持的字段

writeHandler

写的处理器。可以实现WorkbookWriteHandler,SheetWriteHandler,RowWriteHandler,CellWriteHandler,在写入excel的不同阶段会调用

relativeHeadRowIndex

0

写入到excel和上面空开几行

head

与clazz二选一。读取文件头对应的列表,会根据列表匹配数据,建议使用class

clazz

与head二选一。读取文件的头对应的class,也可以使用注解。如果两个都不指定,则会读取全部数据

autoTrim

true

会对头、读取数据等进行自动trim

use1904windowing

false

excel中时间是存储1900年起的一个双精度浮点数,但是有时候默认开始日期是1904,所以设置这个值改成默认1904年开始

useScientificFormat

false

数字转文本的时候在较大的数值的是否是否采用科学计数法

needHead

true

是否需要写入头到excel

useDefaultStyle

true

是否使用默认的样式

automaticMergeHead

true

自动合并头,头中相同的字段上下左右都会去尝试匹配

excludeColumnIndexes

需要排除对象中的index的数据

excludeColumnFieldNames

需要排除对象中的字段的数据

includeColumnIndexes

只要导出对象中的index的数据

includeColumnFieldNames

只要导出对象中的字段的数据

WriteWorkbook

提示

设置方法如下,找不到参数的看下通用参数里面是否存在。

 EasyExcel.write(fileName, DemoData.class)
            // 在 write 方法之后, 在 sheet方法之前都是设置WriteWorkbook的参数
            .sheet("模板")
            .doWrite(() -> {
                // 分页查询数据
                return data();
            });

名称

默认值

描述

excelType

当前excel的类型,支持XLS、XLSX、CSV

outputStream

与file二选一。写入文件的流

file

与outputStream二选一。写入的文件

templateInputStream

模板的文件流

templateFile

模板文件

charset

Charset#defaultCharset

只有csv文件有用,写入文件的时候使用的编码

autoCloseStream

true

自动关闭写入的流。

password

读取文件的密码

inMemory

false

是否在内存处理,默认会生成临时文件以节约内存。内存模式效率会更好,但是容易OOM

writeExcelOnException

false

写入过程中抛出异常了,是否尝试把数据写入到excel

WriteSheet

提示

设置方法如下,找不到参数的看下通用参数里面是否存在。

 EasyExcel.write(fileName, DemoData.class)
            .sheet("模板")
             // 在 sheet 方法之后, 在 doWrite方法之前都是设置WriteSheet的参数
            .doWrite(() -> {
                // 分页查询数据
                return data();
            });

名称

默认值

描述

sheetNo

0

需要写入的编码

sheetName

需要些的Sheet名称,默认同sheetNo

WriteTable

提示

设置方法如下,找不到参数的看下通用参数里面是否存在。

        EasyExcel.write(fileName, DemoData.class)
            .sheet("模板")
            .table()
            // 在 table 方法之后, 在 doWrite方法之前都是设置WriteTable的参数
            .doWrite(() -> {
                // 分页查询数据
                return data();
            });

名称

默认值

描述

tableNo

0

需要写入的编码

三、开发说明

1、最简单的写

excel示例

最简单的写的对象

@Getter
@Setter
@EqualsAndHashCode
public class DemoData {
    @ExcelProperty("字符串标题")
    private String string;
    @ExcelProperty("日期标题")
    private Date date;
    @ExcelProperty("数字标题")
    private Double doubleData;
    /**
     * 忽略这个字段
     */
    @ExcelIgnore
    private String ignore;
}

代码

    /**
     * 最简单的写
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link DemoData}
     * <p>
     * 2. 直接写即可
     */
    @Test
    public void simpleWrite() {
        // 注意 simpleWrite在数据量不大的情况下可以使用(5000以内,具体也要看实际情况),数据量大参照 重复多次写入

        // 写法1 JDK8+
        // since: 3.0.0-beta1
        String fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        // 如果这里想使用03 则 传入excelType参数即可
        EasyExcel.write(fileName, DemoData.class)
            .sheet("模板")
            .doWrite(() -> {
                // 分页查询数据
                return data();
            });

        // 写法2
        fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        // 如果这里想使用03 则 传入excelType参数即可
        EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());

        // 写法3
        fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
        // 这里 需要指定写用哪个class去写
        try (ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build()) {
            WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
            excelWriter.write(data(), writeSheet);
        }
    }

2、根据参数只导出指定列

excel示例

代码

    /**
     * 根据参数只导出指定列
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link DemoData}
     * <p>
     * 2. 根据自己或者排除自己需要的列
     * <p>
     * 3. 直接写即可
     *
     * @since 2.1.1
     */
    @Test
    public void excludeOrIncludeWrite() {
        String fileName = TestFileUtil.getPath() + "excludeOrIncludeWrite" + System.currentTimeMillis() + ".xlsx";
        // 这里需要注意 在使用ExcelProperty注解的使用,如果想不空列则需要加入order字段,而不是index,order会忽略空列,然后继续往后,而index,不会忽略空列,在第几列就是第几列。

        // 根据用户传入字段 假设我们要忽略 date
        Set<String> excludeColumnFiledNames = new HashSet<String>();
        excludeColumnFiledNames.add("date");
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        EasyExcel.write(fileName, DemoData.class).excludeColumnFiledNames(excludeColumnFiledNames).sheet("模板")
            .doWrite(data());

        fileName = TestFileUtil.getPath() + "excludeOrIncludeWrite" + System.currentTimeMillis() + ".xlsx";
        // 根据用户传入字段 假设我们只要导出 date
        Set<String> includeColumnFiledNames = new HashSet<String>();
        includeColumnFiledNames.add("date");
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        EasyExcel.write(fileName, DemoData.class).includeColumnFiledNames(includeColumnFiledNames).sheet("模板")
            .doWrite(data());
    }

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

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

相关文章

硬件系统工程师宝典(6)-----如何减小信号串扰?

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。 上篇我们说到描述信号传输的过程的需要做好阻抗匹配&#xff0c;以减小信号的反射。今天我们来看看传输线之间的噪声干扰&#xff0c;那就是信号的…

rdma rocev2报文格式总结

格式如下&#xff1a; wireshark抓包&#xff0c;soft-roce(基于rocev2实现的)格式如下&#xff1a; 其实这里看着有点奇怪&#xff0c;ICRC是跟在Payload头后面的&#xff0c;不知道为什么抓包看到的却是在BTH头后面的&#xff0c;还有就是看不到FCS?? 其中BTH头的格式有…

极兔一面:Dockerfile如何优化?注意:千万不要只说减少层数

说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;面试题是一个非常、非常高频的交流话题。 最近&#xff0c;有小伙伴面试极兔时&#xff0c;遇到一个面试题&#xff1a; 如果优化 Dockerfile&#xff1f; 小伙伴没有回答好&#xff0c;只是提到了减少镜像层数。…

01背包问题 AcWing(JAVA)

有 N件物品和一个容量是 V的背包。每件物品只能使用一次。 第 i件物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出最大价值。 输入格式 第一行两个整数&#xff0c;N&#xff…

数据结构与算法(一):概述

数据结构学了有一年左右的时间了&#xff0c;但是一直没有详细地总结一下&#xff0c;现在回想起来&#xff0c;感觉有些内容忘记了。所以接下来一段时间我将重新归纳总结一下&#xff0c;算是温故而知新了。 一、数据结构 1、定义 数据结构是计算机存储、组织数据的方式。在…

excel学习笔记-导入外部文件,报错,数值格式变换,日期格式的转化,求和快捷键,冻结窗格

这里写目录标题一、导入外部文件1.导入csv文件2.导入txt文件3.修改txt内容&#xff0c;需要刷新才能看见更改二、报错三、数值格式变换四、日期格式的转化五、ALT &#xff0c;求和快捷键六、冻结窗格一、导入外部文件 1.导入csv文件 2.导入txt文件 3.修改txt内容&#xff0c;…

内网渗透(三十)之横向移动篇-利用远控工具向日葵横向移动

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

力扣sql简单篇练习(十六)

力扣sql简单篇练习(十六) 1 产品销售分析|| 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 SELECT p.product_id,sum(s.quantity) total_quantity FROM Product p INNER JOIN Sales s ON p.product_ids.product_id GROUP BY p.product_id1.3 运行截…

explain 每个列的含义

官网传送门&#xff1a;https://dev.mysql.com/doc/refman/5.7/en/explain-output.html 实例表 DROP TABLE IF EXISTS actor;CREATE TABLE actor (id int(11) NOT NULL,name varchar(45) DEFAULT NULL,update_time datetime DEFAULT NULL,PRIMARY KEY (id)) ENGINEInnoDB DEFA…

【Java项目】基于Java+MySQL+Tomcat+maven+Servlet的个人博客系统的完整分析

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【Java项目】 ✈️✈️本篇内容:个人博客系统前后端分离实现&#xff01; &#x1f680;&#x1f680;个人代码托管github&#xff1a;博客系统源码地址&#xff…

maven解决包冲突简单方式(插件maven helper | maven指令)

文章目录使用idea插件maven helper使用maven指令在Java开发中&#xff0c;常常会遇到不同jar包之间存在冲突的情况&#xff0c;这可能会导致编译错误、运行时异常等问题。 使用idea插件maven helper 在idea安装插件maven helper 安装重启完之后点击pom文件&#xff0c;有一个De…

元宇宙基础设施:WEB 3.0 chain33 优势分析

WEB 3.0 chain33 优势分析 一、与以太坊兼容&#xff08;优势&#xff1a;兼容及开发成本低百倍&#xff09; 使用 Solidity 开发智能合约并部署在 EVM 虚拟机上是目前以太坊生态主流的开发 模式&#xff0c;目前看来不兼容以太坊或不能与以太坊跨链都可能是不归路&#xff0c;…

AcWing语法基础课笔记 第一章 C++入门及简单的顺序结构

第一章 C入门及简单的顺序结构 编程是一种控制计算机的方式&#xff0c;和我们平时双击打开文件、关机、重启没有任何区别。 ———闫学灿 C中常用的变量类型 和所占字节大小 输出变量地址符&#xff1a; 软件环境 作业的评测与提交 在线练习地址&#xff1a;www.acwing.com …

数据库设计的基本步骤

分步设计法遵循自顶向下、逐步求精的原则&#xff0c;将数据库设计过程分解为若干相互独立又相互依存的阶段&#xff0c;每一阶段采用不同的技术与工具&#xff0c;解决不同的问题&#xff0c;从而将问题局部化&#xff0c;减少了局部问题对整体设计的影响。目前&#xff0c;此…

aws Distro for OpenTelemetry 可观测性workshop记录

参考资料 https://aws-otel.github.io/docs/introductionhttps://aws-otel.github.io/docs/introduction aws distro for opentelemetry 官方提供了不同语言不同使用场景下完善的使用实例和相关配置。 AWS Distro for OpenTelemetrics 由以下部分组成&#xff0c;用于向后端…

用户认证概述

文章目录一、用户身份认证1.1 单一服务器模式1.2 SSO&#xff08;Single Sign On&#xff09;模式1.3 Token模式二、JWT令牌2.1 JWT 令牌说明2.2 JWT令牌的组成2.3 JWT 问题和趋势2.4 JWT 测试一、用户身份认证 1.1 单一服务器模式 一般过程如下&#xff1a; 用户向服务器发送…

【编程基础之Python】5、安装Python第三方模块

【编程基础之Python】5、安装Python第三方模块安装Python第三方模块为什么需要安装第三方模块Python包管理器介绍pippip installpython -m pip installcondaconda install在Windows环境中安装Python模块安装numpy安装pandas安装matplotlib在Linux环境中安装Python模块在PyCharm…

线程的创建

1. 多线程常用函数 1.1 创建一条新线程pthread_create 对此函数使用注意以下几点&#xff1a; 线程例程指的是&#xff1a;如果线程创建成功&#xff0c;则该线程会立即执行的函数。POSIX线程库的所有API对返回值的处理原则一致&#xff1a;成功返回0&#xff0c;失败返回错误…

NLP实践——知识图谱问答模型FiD

NLP实践——知识图谱问答模型FiD0. 简介1. 模型结构2. 召回3. 问答4. 结合知识的问答0. 简介 好久没有更新了&#xff0c;今天介绍一个知识图谱问答&#xff08;KBQA&#xff09;模型&#xff0c;在此之前我一直在用huggingface的Pipeline中提供的QA模型&#xff0c;非常方便但…

低代码和零代码的有什么不同?如何区分?

低代码开发平台和零代码平台的区别是什么&#xff1f;一个例子就能讲清楚&#xff01; 周末你外出露营&#xff0c;在野外需要搭一个帐篷。有两种方法&#xff1a; 一种是最原始的搭帐篷方法&#xff0c;即有隔水布、外账、内账、营柱骨架等等......另一种是直接“封装好”的…