网站首页 > java教程 正文
一、前言
Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到几M,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便。
下面我们来简单学习一下EasyExcel的常用API。
二、关于常见类解析
- EasyExcel 入口类,用于构建开始各种操作
- ExcelReaderBuilder ExcelWriterBuilder 构建出一个 ReadWorkbook WriteWorkbook,可以理解成一个excel对象,一个excel只要构建一个
- ExcelReaderSheetBuilder ExcelWriterSheetBuilder 构建出一个 ReadSheet WriteSheet对象,可以理解成excel里面的一页,每一页都要构建一个
- ReadListener 在每一行读取完毕后都会调用ReadListener来处理数据
- WriteHandler 在每一个操作包括创建单元格、创建表格等都会调用WriteHandler来处理数据
- 所有配置都是继承的,Workbook的配置会被Sheet继承,所以在用EasyExcel设置参数的时候,在EasyExcel...sheet()方法之前作用域是整个sheet,之后针对单个sheet
三、读
(1)注解
- ExcelProperty 指定当前字段对应excel中的那一列。可以根据名字或者Index去匹配。当然也可以不写,默认第一个字段就是index=0,以此类推。千万注意,要么全部不写,要么全部用index,要么全部用名字去匹配。千万别三个混着用,除非你非常了解源代码中三个混着用怎么去排序的。
- ExcelIgnore 默认所有字段都会和excel去匹配,加了这个注解会忽略该字段
- DateTimeFormat 日期转换,用String去接收excel日期格式的数据会调用这个注解。里面的value参照java.text.SimpleDateFormat
- NumberFormat 数字转换,用String去接收excel数字格式的数据会调用这个注解。里面的value参照java.text.DecimalFormat
- ExcelIgnoreUnannotated 默认不加ExcelProperty 的注解的都会参与读写,加了不会参与
(2)参数
通用参数
ReadWorkbook,ReadSheet 都会有的参数,如果为空,默认使用上级。
- converter 转换器,默认加载了很多转换器。也可以自定义。
- readListener 监听器,在读取数据的过程中会不断的调用监听器。
- headRowNumber 需要读的表格有几行头数据。默认有一行头,也就是认为第二行开始起为数据。
- head 与clazz二选一。读取文件头对应的列表,会根据列表匹配数据,建议使用class。
- clazz 与head二选一。读取文件的头对应的class,也可以使用注解。如果两个都不指定,则会读取全部数据。
- autoTrim 字符串、表头等数据自动trim
- password 读的时候是否需要使用密码
ReadWorkbook(理解成excel对象)参数
- excelType 当前excel的类型 默认会自动判断
- inputStream 与file二选一。读取文件的流,如果接收到的是流就只用,不用流建议使用file参数。因为使用了inputStream easyexcel会帮忙创建临时文件,最终还是file
- file 与inputStream二选一。读取文件的文件。
- autoCloseStream 自动关闭流。
- readCache 默认小于5M用 内存,超过5M会使用 EhCache,这里不建议使用这个参数。
- useDefaultListener @since 2.1.4 默认会加入ModelBuildEventListener 来帮忙转换成传入class的对象,设置成false后将不会协助转换对象,自定义的监听器会接收到Map<Integer,CellData>对象,如果还想继续接听到class对象,请调用readListener方法,加入自定义的beforeListener、 ModelBuildEventListener、 自定义的afterListener即可。
ReadSheet(就是excel的一个Sheet)参数
- sheetNo 需要读取Sheet的编码,建议使用这个来指定读取哪个Sheet
- sheetName 根据名字去匹配Sheet,excel 2003不支持根据名字去匹配
四、写
(1)注解
- ExcelProperty index 指定写到第几列,默认根据成员变量排序。value指定写入的名称,默认成员变量的名字,多个value可以参照快速开始中的复杂头
- ExcelIgnore 默认所有字段都会写入excel,这个注解会忽略这个字段
- DateTimeFormat 日期转换,将Date写到excel会调用这个注解。里面的value参照java.text.SimpleDateFormat
- NumberFormat 数字转换,用Number写excel会调用这个注解。里面的value参照java.text.DecimalFormat
- ExcelIgnoreUnannotated 默认不加ExcelProperty 的注解的都会参与读写,加了不会参与
(2)参数
通用参数
WriteWorkbook,WriteSheet ,WriteTable都会有的参数,如果为空,默认使用上级。
- converter 转换器,默认加载了很多转换器。也可以自定义。
- writeHandler 写的处理器。可以实现WorkbookWriteHandler,SheetWriteHandler,RowWriteHandler,CellWriteHandler,在写入excel的不同阶段会调用
- relativeHeadRowIndex 距离多少行后开始。也就是开头空几行
- needHead 是否导出头
- head 与clazz二选一。写入文件的头列表,建议使用class。
- clazz 与head二选一。写入文件的头对应的class,也可以使用注解。
- autoTrim 字符串、表头等数据自动trim
WriteWorkbook(理解成excel对象)参数
- excelType 当前excel的类型 默认xlsx
- outputStream 与file二选一。写入文件的流
- file 与outputStream二选一。写入的文件
- templateInputStream 模板的文件流
- templateFile 模板文件
- autoCloseStream 自动关闭流。
- password 写的时候是否需要使用密码
- useDefaultStyle 写的时候是否是使用默认头
WriteSheet(就是excel的一个Sheet)参数
- sheetNo 需要写入的编码。默认0
- sheetName 需要些的Sheet名称,默认同sheetNo
WriteTable(就把excel的一个Sheet,一块区域看一个table)参数
- tableNo 需要写入的编码。默认0
五、参考地址
https://www.yuque.com/easyexcel/doc/api
猜你喜欢
- 2024-10-08 「开源」阿里出品,可避免OOM的java处理Excel工具包
- 2024-10-08 使用Java实现Excel数据采集及后台统计功能
- 2024-10-08 java百万千万级别excel导出问题(导出慢和Out Of Memory内存溢出)
- 2024-10-08 利用阿里EasyExcel实现Excel读写(阿里云表格识别)
- 2024-10-08 java轻松玩转Excel之EasyExcel(java excelutil)
- 2024-10-08 「开源资讯」MyExcel 3.8.1 版本发布,Excel等多项功能的工具包
- 2024-10-08 Java 复制Excel单元格区域(java复制粘贴)
- 2024-10-08 三层-使用NPOI读取Excel文件的数据 183
- 2024-10-08 每天一个入坑小技巧:通过poi、poi-ooxml框架读取不同格式excel
- 2024-10-08 用BxScript读取Excel(读取blob字段)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)