【java学习】EasyExcel的简单使用

这篇具有很好参考价值的文章主要介绍了【java学习】EasyExcel的简单使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

EasyExcel类是一套基于Java的开源Excel解析工具类,相较于传统的框架如Apache poi、jxl等更加快速、简洁,还可以解决大文件内存溢出问题,即能让使用者在不用考虑性能、内存的等因素的情况下,快速完成Excel的读(导入)、写(导出)等功能。

版本支持:
2+版本支持Java7&Java6
3+版本支持Java8

这里使用的EasyExcel版本为3.1.1,JDK版本为1.8.0_161,同时辅助使用lombok和fastjson以简化代码或转化为Jason数据。
Maven依赖配置:

<dependencies>
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>easyexcel</artifactId>
		<version>3.1.1</version>
	</dependency>
	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>		//非必要
		<version>1.16.10</version>
	</dependency>
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>fastjson</artifactId>	//非必要
		<version>1.2.47</version>
	</dependency>
</dependencies>

Excel读

样例内容:
easyexcel,java,java,学习

1.实体类

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TextReadObject {

    @ExcelProperty(index = 0)
    private Integer studentId;

    @ExcelProperty(index = 1)
    private String studentName;

    @ExcelProperty(index = 2)
    private String institute;

    @ExcelProperty(index = 3)
    private Integer level_11;

    @ExcelProperty(index = 4)
    private Integer level_12;

    @ExcelProperty(index = 5)
    private Integer level_21;

    @ExcelProperty(index = 6)
    private Integer level_22;
}

其中注解@ExcelProperty可包含两个参数index和value,在简单表头(即表头只占用一行)中以下两条注解基本等价

@ExcelProperty(index = 0)
@ExcelProperty(value = “学号”)

而在复杂表头(即本例)中,需要使用index表示。
另外需要注意的是加入表头名字出现重复,会导致只有一个字段读取到数据,此外在读取操作时不建议index和value同时使用。综上所述,在已知excel表头内容的情况下使用参数index。

2.读监听器与测试类

四个监听器,这里使用前两个

名称 说明
AnalysisEventListener < T > 分析事件侦听器:接收解析的每条数据的返回。
SyncReadListener 同步读取侦听器。
AbstractIgnoreExceptionReadListener 抽象忽略异常读取侦听器。
ModelBuildEventListener 模型构建事件侦听器。

AnalysisEventListener < T >
所有已实现的接口:Listener、ReadListener
直接已知子类:SyncReadListener

返回值类型 方法 说明
boolean hasNext 验证是否有另一条数据,可以通过返回 false 来停止读取。
void invokeHead 分析第一行时触发调用函数。
void invokeHeadMap 以map的形式放回表头,覆盖当前方法以接收表头数据
void onException 任何一个监听器进行错误报告时,所有监听器都会收到此方法
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.Map;
import java.util.List;
import lombok.AllArgsConstructor;

@AllArgsConstructor
public class DemoDataListener extends AnalysisEventListener<TextReadObject> {
    private List<TextReadObject> dataList;
    //读取表头的内容
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        System.out.println("表头->"+headMap);
    }
    //一行一行读取excel中的内容
    @Override
    public void invoke(TextReadObject data, AnalysisContext context) {
        dataList.add(data);
    }
    //读取完成之后执行的方法
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {}
}

读取Excel的测试类:

import com.alibaba.excel.EasyExcel;
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.List;

public class ExcelImport {
	public static void simpleRead() {
        String fileName = "F:\\rdtext.xls";
        List<TextReadObject> dataList = new ArrayList<>();
        //每次会读取100条数据然后返回过来,直接调用使用数据就行
        EasyExcel.read(fileName, TextReadObject.class, new DemoDataListener(dataList))
                .sheet(0)//读取第一个sheet
                .headRowNumber(3) //跳过前三行表头内容,假如是简单表头则这句可省略
                .doRead();
        //若需要实现读取全部sheet,可以使用.doReadAll()代替.sheet(0).doRead()

        for (TextReadObject dl : dataList) {
            System.out.println(JSON.toJSONString(dl));
        }
	}
	public static void main(String[] args) { simpleRead(); }
}

SyncReadListener:
所有已实现的接口:Listener、ReadListener
直接已知父类:AnalysisEventListener < T >

返回值类型 方法 说明
void doAfterAllAnalysed 如果有什么操作在全部分析结束后执行
List < Object > getList
void invoke 当分析一行触发器调用函数
void setList (List < Object > list)
此处将监听器写到测试类内部
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.SyncReadListener;
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class ExcelImportSync {
    public static void simpleRead() {
        String fileName = "F:\\text.xls";
        final List dataList = new ArrayList();
        EasyExcel.read(fileName, TextReadObject.class, new SyncReadListener() {
            @Override
            public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
                System.out.println("表头->"+headMap);
            }
            @Override
            public void invoke(Object object, AnalysisContext context) {
                dataList.add(object);
            }
        }).sheet(0).headRowNumber(3).doRead();
        for (Object o : dataList) {
            TextReadObject TOB = (TextReadObject) o;
            System.out.println(JSON.toJSONString(TOB));
        }
    }
    public static void main(String[] args) { simpleRead(); }
}

相较于AnalysisEventListener < T >,SyncReadListener更加适合对多种实体类实施相同操作的情况,在定义监听器时没有指定具体的实体类。

3.输出结果

二者输出结果一样:
easyexcel,java,java,学习

Excel写

1.实体类

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@ColumnWidth(15) //列宽,最大值为255
@HeadRowHeight(16) //表头行高
@ContentRowHeight(16) //数据行高
public class TextWriteObject {
    //复杂表头自动合并相同的内容
    @ExcelProperty(index = 0, value = {"学号", "学号", "学号"})
    private Integer studentId;

    @ExcelProperty(index = 1, value = {"姓名", "姓名", "姓名"})
    private String studentName;

    @ColumnWidth(25)//单独设置列宽
    @ExcelProperty(index = 2, value = {"学院", "学院", "学院"})
    private String institute;
    //复杂表头嵌套
    @ExcelProperty(index = 3, value = {"成绩", "第一学年", "第一学期"})
    private Integer level_11;

    @ExcelProperty(index = 4, value = {"成绩", "第一学年", "第二学期"})
    private Integer level_12;

    @ExcelProperty(index = 5, value = {"成绩", "第二学年", "第一学期"})
    private Integer level_21;

    @ExcelProperty(index = 6, value = {"成绩", "第二学年", "第二学期"})
    private Integer level_22;
}

此时在注解@ExcelProperty中可以同时使用参数index和value,用于同时指定位置和内容。

其他未使用注解:
@ContentStyle用于设置内容格式

参数 说明
dataFormat 日期格式
hidden 设置单元格使用此样式隐藏
locked 设置单元格使用此样式锁定
quotePrefix 在单元格前面增加`符号,数字或公式将以字符串形式展示
horizontalAlignment 设置是否水平居中
wrapped 设置文本是否应换行。将此标志设置为true通过在多行上显示使单元格中的所有内容可见
verticalAlignment 设置是否垂直居中
rotation 设置单元格中文本旋转角度。03版本的Excel旋转角度区间为-90°~90°,07版本的Excel旋转角度区间为0°-180°
indent 设置单元格中缩进文本的空格数
borderLeft 设置左边框的样式
borderRight 设置右边框样式
borderTop 设置上边框样式
borderBottom 设置下边框样式
leftBorderColor 设置左边框颜色
rightBorderColor 设置右边框颜色
topBorderColor 设置上边框颜色
bottomBorderColor 设置下边框颜色
fillPatternType 设置填充类型
fillBackgroundColor 设置背景色
fillForegroundColor 设置前景色
shrinkToFit 设置自动单元格自动大小

@ContentFontStyle用于设置单元格内容字体格式

参数 说明
fontName 字体名称
fontHeightInPoints 字体高度
italic 是否斜体
strikeout 是否设置删除水平线
color 字体颜色
typeOffset 偏移量
underline 下划线
bold 是否加粗
charset 编码格式

@HeadFontStyle用于定制标题字体格式

参数 说明
fontName 设置字体名称
fontHeightInPoints 设置字体高度
italic 设置字体是否斜体
strikeout 是否设置删除线
color 设置字体颜色
typeOffset 设置偏移量
underline 设置下划线
charset 设置字体编码
bold 设置字体是否加粗

@ExcelIgnore不将该字段转换成Excel

@ExcelIgnoreUnannotated没有注解的字段都不转换

2.写入Excel的测试类

import com.alibaba.excel.EasyExcel;
import java.util.ArrayList;
import java.util.List;

public class ExcelExport {
    public static void simpleWrite(){
        String fileName = "F:\\wttext.xls";
        List<TextWriteObject> dataList = new ArrayList<>();
        dataList.add(new TextWriteObject(2022101, "张三",
                "生命科学院", 653, 602, 683, 707));
        dataList.add(new TextWriteObject(2022102, "李四",
                "生命科学院", 568, 596, 611, 632));
        dataList.add(new TextWriteObject(2022103, "王五",
                "生命科学院", 606, 673, 624, 653));
        dataList.add(new TextWriteObject(2022201, "赵六",
                "语言文学院", 710, 722, 686, 703));
        EasyExcel.write(fileName, TextWriteObject.class)
                .sheet(0)
                .doWrite(dataList);
    }
    public static void main(String[] args) { simpleWrite(); }
}

3.输出结果

easyexcel,java,java,学习

填充Excel

填充功能可以事先在Excel中设计好格式和排版,再在后台将需要导出的数据传入fill方法完成最终Excel文件。

1.Excel模板

easyexcel,java,java,学习
此模板允许多条填充,以第一列为例,若为{studentId}则仅允许单条填充。
如果本来就有 {} ,用转义\{\}代替。

2.测试类

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import java.util.ArrayList;
import java.util.List;

public class ExcelFill {
    public static void simpleFill(){
        List dataList = new ArrayList();
        dataList.add(new TextWriteObject(2022101, "张三",
                "生命科学院", 653, 602, 683, 707));
        dataList.add(new TextWriteObject(2022102, "李四",
                "生命科学院", 568, 596, 611, 632));
        dataList.add(new TextWriteObject(2022103, "王五",
                "生命科学院", 606, 673, 624, 653));
        dataList.add(new TextWriteObject(2022201, "赵六",
                "语言文学院", 710, 722, 686, 703));

        String writeFile = "F:\\filltext.xls";
        String templateFile = "F:\\template.xls";
        ExcelWriterBuilder writerBuilder = EasyExcel
                .write(writeFile, TextReadObject.class)
                .withTemplate(templateFile);
        WriteSheet writeSheet = writerBuilder.sheet().build();
        ExcelWriter excelWriter = writerBuilder.build();
        //在填充玩多结果数据后,要强制换行,不然后续的单结果数据会发生覆盖现象
        FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();
        excelWriter.fill(dataList, fillConfig, writeSheet);
        excelWriter.finish();//调用finish方法,关闭文件流
    }
    public static void main(String[] args) { simpleFill(); }
}

3.输出结果

easyexcel,java,java,学习

更详细的内容请参考官方文档:
https://easyexcel.opensource.alibaba.com/docs/current/文章来源地址https://www.toymoban.com/news/detail-566141.html

到了这里,关于【java学习】EasyExcel的简单使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用EasyExcel实现excel导出,支持百万大数据量导出-----超简单

    通过设置sheet数量,完成分批导出,每个sheet存100万数据,每次查询插入20万数据,避免超时,内存溢出等问题,可以根据服务器配置调整参数设置。 1.引入依赖 2.创建对应的实体类 @ExcelProperty设置的就是导出的列名,还可以设置排序等等 3.核心导出代码 4.配置类 至此就完成导

    2024年02月11日
    浏览(45)
  • Java 使用 easyexcel 读取 excel 文件

    easyexcel 官网:EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 1. 引入依赖并给出示例 excel     2. 两种读取的方式         (1)确定表头:建立对象,和表头形成映射。(这里以此为例)         (2)不确定表头:每一行映射为 MapString, Object。 3. 先创建 excel 中表头对应

    2024年02月12日
    浏览(38)
  • EasyExcel入门小demo,简单理解EasyExcel

    一、什么是EasyExcel EasyExcel是阿里巴巴开源的一个excel处理框架, 以使用简单、节省内存著称 。该项目实现了列表数据的导入,分页列表导出,支持自定义格式,支持模版以及模板和列表的混合导出,小巧、简易、高性能。 二、使用 1.pom.xml  2.实体类(需要写入excel的类) 

    2023年04月22日
    浏览(19)
  • Java——使用EasyExcel导出动态列的Excel

    多多点赞,会变好看! 多多留言,会变有钱! 有些时候列表的列可能是动态的,需要根据动态表头导出Excel文件,这时候可以使用下面的方法解决: 静态列导出代码:

    2024年02月15日
    浏览(34)
  • java实现excel的导出之使用easyExcel

    在我们的项目需求中,经常会遇到导出的需求,其中excel的导出最为常见。生成Excel比较有名的框架有Apache poi,jxl等,但他们都存在一个严重的问题就是非常的耗内存,如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc. EasyExcel是阿里巴巴

    2024年02月15日
    浏览(29)
  • Java 使用 EasyExcel 实现导入导出(新手篇教程)

    官网镇楼↓,觉得我写的不好的同学可以去官网看哦 EasyExcel 示例: 如上一个简易 Excel 表格,表头占了两行,且第三列开始才为有效数据,那么我们应该如何导入? 建造实体类 首先无论是导入还是导出,都需要先建对应的实体类  如图所示,因为我的示例 Excel 一共需要读

    2024年04月17日
    浏览(28)
  • 记录java使用EasyExcel进行单元格内换行操作

    1、首先是在需要换行的地方将 n   或者 rn 替换为 String.valueOf((char)10)  ,有时候不替换好像也能用 2、第一步完成后可能导出的内容还是无法换行,需要双击单元格才会换行, 在导出的java实体类上加入注解 @ContentStyle( horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignmen

    2023年04月08日
    浏览(32)
  • EasyExcel简单实例

    导入easyExcel依赖,注意版本: 源表: 1. 编写实体类 可以使用 @ExcelProperty 指定数据封装为实体类对象的规则,后面可以跟index 和 列名(二选一); 若不加注解则按照默认封装规则: ①根据 Excel 列与实体类属性的顺序②根据 Excel 列的单元格式与对象字段类型匹配。 2. 监听器

    2024年01月24日
    浏览(34)
  • EasyExcel的简单导出

    EasyExcel的简单导出 Controller层代码 Service处理代码 SysColExcelDto.java类 这是使用easyExcel提供的注解来标记字段填充行数,这种情况适用于自动生成,如果是填充excel(doFill方式)可以不用ExcelProperty注解标识,但是需要在模板中标记数据填充位置 模板标记数据填充位置标记如下,

    2024年02月15日
    浏览(30)
  • EasyExcel入门(最简单的读)

    官网:EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel (alibaba.com) 因为暂时项目没有用到,所以不急,知道了这个技术。就想着学着用一下!   先看官方文档给的用法和解释!!!   自己准备一个Excel表格。 官方提供了4种写法 写法一: 点击PageReadListener查看源码:  默认

    2024年02月09日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包