高效读取百万级数据

上一篇介绍的高效写文件之后,最近抽时间研究了下Excel文件的读取。概括来讲,poi读取excel有两种方式:用户模式和事件模式

然而很多业务场景中的读取Excel仍然采用用户模式,但是这种模式需要创建大量对象,对大文件的支持非常不友好,非常容易OOM。但是对于事件模式而言,往往需要自己实现listener,并且需要根据自己需要解析不同的event,所以用起来比较复杂。

基于此,EasyExcel封装了常用的Excel格式文档的事件解析,并且提供了接口供开发小哥扩展定制化,实现让你解析Excel不再费神的目的。

Talk is cheap, show me the code.

使用姿势

pom

    <groupId>com.github.Dorae132</groupId>
<artifactId>easyutil.easyexcel</artifactId>
<version>1.1.0</version>

普通姿势

看看下边的姿势,是不是觉得只需要关心业务逻辑了

ExcelUtils.excelRead(ExcelProperties.produceReadProperties("C:\\Users\\Dorae\\Desktop\\ttt\\",
"append_0745704108fa42ffb656aef983229955.xlsx"), new IRowConsumer<String>() {
@Override
public void consume(List<String> row) {
System.out.println(row);
count.incrementAndGet();
try {
TimeUnit.MICROSECONDS.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, new IReadDoneCallBack<Void>() {
@Override
public Void call() {
System.out.println(
"end, count: " + count.get() + "\ntime: " + (System.currentTimeMillis() - start));
return null;
}
}, 3, true);

定制姿势

什么?你想定制context,添加handler?请看下边!你只需要实现一个Abstract03RecordHandler然后regist到context(关注ExcelVersionEnums中的factory)就可以了。

public static void excelRead(IHandlerContext context, IRowConsumer rowConsumer, IReadDoneCallBack callBack,
int threadCount, boolean syncCurrentThread) throws Exception {
// synchronized main thread
CyclicBarrier cyclicBarrier = null;
threadCount = syncCurrentThread ? ++threadCount : threadCount;
if (callBack != null) {
cyclicBarrier = new CyclicBarrier(threadCount, () -> {
callBack.call();
});
} else {
cyclicBarrier = new CyclicBarrier(threadCount);
}
for (int i = 0; i < threadCount; i++) {
THREADPOOL.execute(new ConsumeRowThread(context, rowConsumer, cyclicBarrier));
}
context.process();
if (syncCurrentThread) {
cyclicBarrier.await();
}
}

框架结构

如图,为整个EasyExcel的结构,其中(如果了解过设计模式,或者读过相关源码,应该会很容易理解):

  1. 绿色为可扩展接口,
  2. 上半部分为写文件部分,下办部分为读文件。

总结

至此,EasyExcel的基本功能算是晚上了,欢迎各路大神提Issue过来。

最新文章

  1. 【四】搭建Markdown的编辑器
  2. ubuntu下配置vpn
  3. 解决SVN Upgrade working copy问题
  4. Web Essentials之HTML和CSS操作技巧
  5. CSS两列高度自适应,右边自适应
  6. zookeeper + LevelDB + ActiveMQ实现消息队列高可用
  7. poj3280Cheapest Palindrome(记忆化)
  8. 关于openoffice英文乱码的问题
  9. 模块化的JavaScript开发的优势在哪里
  10. Android图片与旋转
  11. [转] 面向对象原则之GOF是招式,九大原则才是精髓
  12. 【1414软工助教】团队作业5——测试与发布(Alpha版本) 得分榜
  13. 自己写的一个tomcat发布脚本
  14. 20155306 2006-2007-2 《Java程序设计》第3周学习总结
  15. OPPO A3在哪里打开usb调试模式的详细教程
  16. Spring 使用AOP——xml配置
  17. windows生成当前目录树
  18. layui 弹窗的iframe 父子界面相互传值
  19. Android Netty Server
  20. c# 连等的写法都做了什么?

热门文章

  1. java Class.getResource和ClassLoader.getResource
  2. 297 Serialize and Deserialize Binary Tree 二叉树的序列化与反序列化
  3. js作用域、异步——学习笔记
  4. duilib入门问题集
  5. [转] Redis在windows下安装过程
  6. 常用css属性总结
  7. Python之字符串的特性及常用方法
  8. idea_复制包名类名
  9. Linux常用命令——帮助命令
  10. Linux kernel-汇编基础