EasyExcel简单Demo
-
- EasyExcel
- 依赖引入
- 创建监听类
- 与excel相对应的DTO
- 调用读取
- 读取xlsx格式
EasyExcel
官网地址:https://easyexcel.opensource.alibaba.com/ EasyExcel是一个基于Java简单,省内存读写Excel开源项目。支持读写百M,尽可能节省内存。Excel。 github地址:https://github.com/alibaba/easyexcel。
依赖引入
<!-- easyExcel --> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.1.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel-core</artifactId> <version>3.1.1</version> </dependency>
创建监听类
import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.read.listener.ReadListener; import com.alibaba.excel.util.ListUtils; import com.alibaba.fastjson.JSON; import com.longi.gsepro.dto.CellDataReadDemoData; import lombok.extern.slf4j.Slf4j;
import java
.util
.List
;
/** * 读取头 * * @author yzh */ @Slf4j
public
class
CellDataDemoHeadDataListener
implements
ReadListener
<CellDataReadDemoData
>
{
/** * 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收 */
private
static final int
BATCH_COUNT
=
5
;
private List
<CellDataReadDemoData
> cachedDataList
= ListUtils
.
newArrayListWithExpectedSize
(
BATCH_COUNT
)
; @Override
public
void
invoke
(
CellDataReadDemoData data, AnalysisContext context
)
{
log
.
info
(
"解析到一条数据:{}"
,
JSON
.
toJSONString
(data
)
)
; cachedDataList
.
add
(data
)
;
if
(cachedDataList
.
size
(
)
>=
BATCH_COUNT
)
{
saveData
(
)
; cachedDataList
= ListUtils
.
newArrayListWithExpectedSize
(
BATCH_COUNT
)
;
}
} @Override
public
void
doAfterAllAnalysed
(
AnalysisContext context
)
{
saveData
(
)
; log
.
info
(
"所有数据解析完成!"
)
;
}
/** * 加上存储数据库 */
private
void
saveData
(
)
{
log
.
info
(
"{}条数据,开始存储数据库!"
, cachedDataList
.
size
(
)
)
; log
.
info
(
"存储数据库成功!"
)
;
}
}
与excel相对应的DTO
import com.alibaba.excel.metadata.data.CellData;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
/** * 基础数据类.这里的排序和excel里面的排序一致 * * @author Jiaju Zhuang **/
@Getter
@Setter
@EqualsAndHashCode
public class CellDataReadDemoData {
private CellData<String> string;
// 这里注意 虽然是日期 但是 类型 存储的是number 因为excel 存储的就是number
private CellData<Date> date;
private CellData<Double> doubleData;
// 这里并不一定能完美的获取 有些公式是依赖性的 可能会读不到 这个问题后续会修复
private CellData<String> formulaValue;
}
调用读取
@Operation(description = "读取测试")
@GetMapping("/read/excel")
public void readTest(){
String fileName = "D:\\test\\cellDataDemo.xlsx";
System.out.println("执行");
// 这里 需要指定读用哪个class去读,然后读取第一个sheet
// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
EasyExcel.read(fileName, CellDataReadDemoData.class, new CellDataDemoHeadDataListener()).sheet().doRead();
}
读取xlsx格式
[1]: https://easyexcel.opensource.alibaba.com/docs/current/