Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
qq_879456671
easyexcel
提交
1752a50b
E
easyexcel
项目概览
qq_879456671
/
easyexcel
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
E
easyexcel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
1752a50b
编写于
9月 17, 2021
作者:
庄家钜
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
新增jdk8 案例
上级
f679cb45
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
120 addition
and
16 deletion
+120
-16
src/main/java/com/alibaba/excel/read/listener/PageReadListener.java
...ava/com/alibaba/excel/read/listener/PageReadListener.java
+47
-0
src/test/java/com/alibaba/easyexcel/test/demo/read/DemoDataListener.java
...om/alibaba/easyexcel/test/demo/read/DemoDataListener.java
+10
-8
src/test/java/com/alibaba/easyexcel/test/demo/read/ReadTest.java
...t/java/com/alibaba/easyexcel/test/demo/read/ReadTest.java
+63
-8
未找到文件。
src/main/java/com/alibaba/excel/read/listener/PageReadListener.java
0 → 100644
浏览文件 @
1752a50b
package
com.alibaba.excel.read.listener
;
import
java.util.List
;
import
java.util.function.Consumer
;
import
com.alibaba.excel.context.AnalysisContext
;
import
com.alibaba.excel.util.ListUtils
;
/**
* page read listener
*
* @author Jiaju Zhuang
*/
public
class
PageReadListener
<
T
>
implements
ReadListener
<
T
>
{
/**
* Single handle the amount of data
*/
public
static
final
int
BATCH_COUNT
=
3000
;
/**
* Temporary storage of data
*/
private
List
<
T
>
cachedData
=
ListUtils
.
newArrayListWithExpectedSize
(
BATCH_COUNT
);
/**
* consumer
*/
private
final
Consumer
<
List
<
T
>>
consumer
;
public
PageReadListener
(
Consumer
<
List
<
T
>>
consumer
)
{
this
.
consumer
=
consumer
;
}
@Override
public
void
invoke
(
T
data
,
AnalysisContext
context
)
{
cachedData
.
add
(
data
);
if
(
cachedData
.
size
()
>=
BATCH_COUNT
)
{
consumer
.
accept
(
cachedData
);
// 存储完成清理 list
cachedData
=
ListUtils
.
newArrayListWithExpectedSize
(
BATCH_COUNT
);
}
}
@Override
public
void
doAfterAllAnalysed
(
AnalysisContext
context
)
{
consumer
.
accept
(
cachedData
);
}
}
src/test/java/com/alibaba/easyexcel/test/demo/read/DemoDataListener.java
浏览文件 @
1752a50b
...
...
@@ -3,13 +3,13 @@ package com.alibaba.easyexcel.test.demo.read;
import
java.util.ArrayList
;
import
java.util.List
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
com.alibaba.excel.context.AnalysisContext
;
import
com.alibaba.excel.event.AnalysisEventListener
;
import
com.alibaba.fastjson.JSON
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
/**
* 模板的读取类
*
...
...
@@ -21,8 +21,11 @@ public class DemoDataListener extends AnalysisEventListener<DemoData> {
/**
* 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
*/
private
static
final
int
BATCH_COUNT
=
5
;
List
<
DemoData
>
list
=
new
ArrayList
<
DemoData
>();
private
static
final
int
BATCH_COUNT
=
3000
;
/**
* 缓存的数据
*/
private
List
<
DemoData
>
list
=
new
ArrayList
<>(
BATCH_COUNT
);
/**
* 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
*/
...
...
@@ -45,8 +48,7 @@ public class DemoDataListener extends AnalysisEventListener<DemoData> {
/**
* 这个每一条数据解析都会来调用
*
* @param data
* one row value. Is is same as {@link AnalysisContext#readRowHolder()}
* @param data one row value. Is is same as {@link AnalysisContext#readRowHolder()}
* @param context
*/
@Override
...
...
@@ -57,7 +59,7 @@ public class DemoDataListener extends AnalysisEventListener<DemoData> {
if
(
list
.
size
()
>=
BATCH_COUNT
)
{
saveData
();
// 存储完成清理 list
list
.
clear
(
);
list
=
new
ArrayList
<>(
BATCH_COUNT
);
}
}
...
...
src/test/java/com/alibaba/easyexcel/test/demo/read/ReadTest.java
浏览文件 @
1752a50b
package
com.alibaba.easyexcel.test.demo.read
;
import
java.io.File
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Map
;
import
org.junit.Ignore
;
import
org.junit.Test
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
com.alibaba.easyexcel.test.util.TestFileUtil
;
import
com.alibaba.excel.EasyExcel
;
import
com.alibaba.excel.ExcelReader
;
import
com.alibaba.excel.annotation.ExcelProperty
;
import
com.alibaba.excel.annotation.format.DateTimeFormat
;
import
com.alibaba.excel.annotation.format.NumberFormat
;
import
com.alibaba.excel.context.AnalysisContext
;
import
com.alibaba.excel.converters.DefaultConverterLoader
;
import
com.alibaba.excel.enums.CellExtraTypeEnum
;
import
com.alibaba.excel.read.listener.PageReadListener
;
import
com.alibaba.excel.read.listener.ReadListener
;
import
com.alibaba.excel.read.metadata.ReadSheet
;
import
com.alibaba.fastjson.JSON
;
import
org.junit.Ignore
;
import
org.junit.Test
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
/**
* 读的常见写法
*
...
...
@@ -41,18 +45,69 @@ public class ReadTest {
*/
@Test
public
void
simpleRead
()
{
// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
// 写法1:
// 写法1:JDK8+ ,不用额外写一个ReadListener
String
fileName
=
TestFileUtil
.
getPath
()
+
"demo"
+
File
.
separator
+
"demo.xlsx"
;
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
EasyExcel
.
read
(
fileName
,
DemoData
.
class
,
new
DemoDataListener
()).
sheet
().
doRead
();
// 这里每次会读取3000条数据 然后返回过来 直接调用使用数据就行
EasyExcel
.
read
(
fileName
,
DemoData
.
class
,
new
PageReadListener
<
DemoData
>(
dataList
->
{
for
(
DemoData
demoData
:
dataList
)
{
LOGGER
.
info
(
"读取到一条数据{}"
,
JSON
.
toJSONString
(
demoData
));
}
})).
sheet
().
doRead
();
// 写法2:
// 匿名内部类 不用额外写一个ReadListener
fileName
=
TestFileUtil
.
getPath
()
+
"demo"
+
File
.
separator
+
"demo.xlsx"
;
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
EasyExcel
.
read
(
fileName
,
DemoData
.
class
,
new
ReadListener
<
DemoData
>()
{
/**
* 单次缓存的数据量
*/
public
static
final
int
BATCH_COUNT
=
3000
;
/**
*临时存储
*/
private
List
<
DemoData
>
cachedData
=
new
ArrayList
<>(
BATCH_COUNT
);
@Override
public
void
invoke
(
DemoData
data
,
AnalysisContext
context
)
{
cachedData
.
add
(
data
);
if
(
cachedData
.
size
()
>=
BATCH_COUNT
)
{
saveData
();
// 存储完成清理 list
cachedData
=
new
ArrayList
<>(
BATCH_COUNT
);
}
}
@Override
public
void
doAfterAllAnalysed
(
AnalysisContext
context
)
{
saveData
();
}
/**
* 加上存储数据库
*/
private
void
saveData
()
{
LOGGER
.
info
(
"{}条数据,开始存储数据库!"
,
cachedData
.
size
());
LOGGER
.
info
(
"存储数据库成功!"
);
}
}).
sheet
().
doRead
();
// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
// 写法3:
fileName
=
TestFileUtil
.
getPath
()
+
"demo"
+
File
.
separator
+
"demo.xlsx"
;
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
EasyExcel
.
read
(
fileName
,
DemoData
.
class
,
new
DemoDataListener
()).
sheet
().
doRead
();
// 写法4:
fileName
=
TestFileUtil
.
getPath
()
+
"demo"
+
File
.
separator
+
"demo.xlsx"
;
// 一个文件一个reader
ExcelReader
excelReader
=
null
;
try
{
excelReader
=
EasyExcel
.
read
(
fileName
,
DemoData
.
class
,
new
DemoDataListener
()).
build
();
// 构建一个sheet 这里可以指定名字或者no
ReadSheet
readSheet
=
EasyExcel
.
readSheet
(
0
).
build
();
// 读取一个sheet
excelReader
.
read
(
readSheet
);
}
finally
{
if
(
excelReader
!=
null
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录