文件导入
# 文件导入
# .doReadSync() 和 .doRead() 有什么区别
在 EasyExcel 库中,doReadSync()
和 doRead()
两个方法都用于读取 Excel 数据,但是它们在处理方式和使用场景上有些不同。
doReadSync()
:这是一个同步读取方法,它会一次性将 Excel 文件中的所有数据读入内存。此方法必须等待整个读取过程结束后才会继续执行后面的代码。它返回一个包含所有数据的 List,每一行数据是一个对象。此方法适合用于 Excel 文件较小,内存足够,且需要立即处理全部数据的情况。doRead()
:这是一个异步读取方法,它通过注册的监听器(ReadListener
)一行一行地处理数据,不会将所有的数据一次性加载到内存中。它的结果是在处理过程中逐步产生的,可以在读取过程中就开始处理数据。它的使用场景可能包括处理较大的 Excel 文件,或者在接收到数据的同时进行处理以节省时间。
一般来说,如果你处理的 Excel 文件较大,或者你不需要一次处理所有的数据,那么使用 doRead()
可能是一个更好的选择。否则,如果你的 Excel 文件较小,并且你希望更简单地处理数据,那么 doReadSync()
可能更适合你。
# 源码分析
// ExcelReaderBuilder
public void doReadAll() {
try (ExcelReader excelReader = build()) {
excelReader.readAll();
}
}
/**
* Synchronous reads return results
*
* @return
*/
public <T> List<T> doReadAllSync() {
SyncReadListener syncReadListener = new SyncReadListener();
registerReadListener(syncReadListener);
try (ExcelReader excelReader = build()) {
excelReader.readAll();
excelReader.finish();
}
return (List<T>)syncReadListener.getList();
}
// ExcelReaderSheetBuilder
/**
* Sax read
*/
public void doRead() {
if (excelReader == null) {
throw new ExcelGenerateException("Must use 'EasyExcelFactory.read().sheet()' to call this method");
}
excelReader.read(build());
excelReader.finish();
}
/**
* Synchronous reads return results
*
* @return
*/
public <T> List<T> doReadSync() {
if (excelReader == null) {
throw new ExcelAnalysisException("Must use 'EasyExcelFactory.read().sheet()' to call this method");
}
SyncReadListener syncReadListener = new SyncReadListener();
registerReadListener(syncReadListener);
excelReader.read(build());
excelReader.finish();
return (List<T>)syncReadListener.getList();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# 学习参考
上次更新: 2024/9/25 11:16:13