超大Excel文件读写

在进行超大Excel文件读写时,我们通常使用EasyExcel,EasyExcel采用逐行读取的解析模式,将每一行的解析结果以观察者的模式通知处理(AnalysisEventListener),所以比较适合数据体量较大的Excel文件解析。

下面对比一下对于超大Excel文件使用POI写入和使用EasyExcel的效率

使用POI写入:使用SXSSFWorkbook进行写入,通过设置SXXFWorkbook的构造参数,可以设置每次在内存中保持的行数,当达到这个值的时候,那么会把这些数据flush到磁盘上,这样就不会出现内存不够的情况。

写入100W条数据

public class Order {@ExcelProperty("订单编号")private String orderId; // 订单编号@ExcelProperty("支付金额")@NumberFormat("¥#,###")private Double payment; // 支付金额@ExcelProperty(value = "创建日期",converter = LocalDateTimeConverter.class)private LocalDateTime creationTime; // 创建时间public Order() {this.orderId = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddhhmmss"))+ UUID.randomUUID().toString().substring(0, 5);this.payment = Math.random() * 10000;this.creationTime = LocalDateTime.now();}public String getOrderId() {return orderId;}public void setOrderId(String orderId) {this.orderId = orderId;}public Double getPayment() {return payment;}public void setPayment(Double payment) {this.payment = payment;}public LocalDateTime getCreationTime() {return creationTime;}public void setCreationTime(LocalDateTime creationTime) {this.creationTime = creationTime;}@Overridepublic String toString() {return "Order [orderId=" + orderId + ", payment=" + payment + ", creationTime=" + creationTime + "]";}
}
public class test1 {public static void main(String[] args) {try (Workbook workbook = new SXSSFWorkbook(100);FileOutputStream fos = new FileOutputStream("E:\\test\\temp.xlsx")) {long start = System.currentTimeMillis();data();workbook.write(fos);long end = System.currentTimeMillis();System.out.println("执行程序耗时:"+(end-start)+"ms");} catch (IOException e) {e.printStackTrace();}}// 创建100w条订单数据private static List<Order> data() {List<Order> list = new ArrayList<Order>();for (int i = 0; i < 1000000; i++) {list.add(new Order());}return list;}}

执行程序耗时:6589ms

使用EasyExcel

//实体订单类

public class Order {@ExcelProperty("订单编号")private String orderId; // 订单编号@ExcelProperty("支付金额")@NumberFormat("¥#,###")private Double payment; // 支付金额@ExcelProperty(value = "创建日期",converter = LocalDateTimeConverter.class)private LocalDateTime creationTime; // 创建时间public Order() {this.orderId = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddhhmmss"))+ UUID.randomUUID().toString().substring(0, 5);this.payment = Math.random() * 10000;this.creationTime = LocalDateTime.now();}public String getOrderId() {return orderId;}public void setOrderId(String orderId) {this.orderId = orderId;}public Double getPayment() {return payment;}public void setPayment(Double payment) {this.payment = payment;}public LocalDateTime getCreationTime() {return creationTime;}public void setCreationTime(LocalDateTime creationTime) {this.creationTime = creationTime;}@Overridepublic String toString() {return "Order [orderId=" + orderId + ", payment=" + payment + ", creationTime=" + creationTime + "]";}
}

//Converter转换类(兼容LocalDateTime日期时间类)

public class LocalDateTimeConverter implements Converter<LocalDateTime> {@Overridepublic Class<LocalDateTime> supportJavaTypeKey() {return LocalDateTime.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}@Overridepublic LocalDateTime convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) {return LocalDateTime.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));}@Overridepublic CellData<String> convertToExcelData(LocalDateTime value, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) {return new CellData<>(value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));}}

写入100w条数据

public class Demo01 {public static void main(String[] args) {long start = System.currentTimeMillis();// 写入10wEasyExcel.write("E:\\a\\easy.xlsx", Order.class).sheet("订单列表").doWrite(data());long end = System.currentTimeMillis();System.out.println("执行程序耗时:" + (end - start) + "ms");}// 创建100w条订单数据private static List<Order> data() {List<Order> list = new ArrayList<Order>();for (int i = 0; i < 1000000; i++) {list.add(new Order());}return list;}}

执行程序耗时:30956ms

感谢阅读,如果对您有帮助请留下您的点赞和关注!

超大Excel文件读写 :使用SXSSFWorkbook和EasyExcel方式对比相关推荐

  1. java中 Excel文件解析及超大Excel文件读写

    本文主要对Excel中数据的解析和生成进行总结 前言 在应用程序的开发过程中,我们经常要用到Excel进行数据的导入或导出.所以,在通过Java语言实现此类需求时,通常会对Excel文件进行解析或生成 ...

  2. EasyExcel实现对excel文件读写

    EasyExcel实现对excel文件读写 1.EasyExcel介绍 2.EasyExcel特点: 3.EasyExcel写操作 3.1 pom中引入xml相关依赖 3.2 创建实体类 3.3 实现 ...

  3. Java实现Excel文件读写

    目录 一.简介 二.maven依赖 三.工具类ExcelUtil 四.测试 4.1.EmployeeVo 4.2.写入数据到Excel 4.3.从Excel读取数据 结语 一.简介   HSSFWor ...

  4. python第三方库文件传输_Python第三方库在Excel文件读写中的应用

    Python第三方库在Excel文件读写中的应用 文/刘卫华1 史婷婷2 许学添1 [摘 要]摘 要 [期刊名称]<电子技术与软件工程> [年(卷),期]2019(000)016 [总页数 ...

  5. php原生读取excel文件夹,原生php实现excel文件读写的方法分析php技巧

    这篇文章主要介绍了原生php实现excel文件读写的方法,结合实例形式分析了采用原生php针对Excel进行读写操作的相关实现方法与操作注意事项,需要的朋友可以参考下 本文实例分析了原生php实现ex ...

  6. c语言从excal读取字符串,C语言操作EXCEL文件(读写)

    C语言操作EXCEL文件(读写) 本文主要介绍通过纯C语言进行EXCEL的读写操作:(修改时间2018.08.28,如果运行结果均是0,请看文章最后一节) C语言读操作 C语言写操作 在之前需要使用C ...

  7. Python学习笔记4——csv/excel文件读写保存

    工具包准备和设置检查 csv文件读写和保存 csv文件读写 csv文件保存 Excel工作表文件读写和保存 excel文件读写 excel文件保存 总结 附录代码 工具包准备和设置检查 相关工具包导入 ...

  8. 超大Excel文件读取(支持50w+)(三)

    超大Excel文件读取(支持50w+) 1 线上内存溢出问题演示 环境准备 准备一个大的excel文件(xlsx大小10M及以上) 将jvm的heap缩小到500m(JVM 参数 -Xmx500m)用 ...

  9. php 原生 excel,关于原生php实现excel文件读写的方法

    这篇文章主要介绍了原生php实现excel文件读写的方法,结合实例形式分析了采用原生php针对Excel进行读写操作的相关实现方法与操作注意事项,需要的朋友可以参考下 本文实例分析了原生php实现ex ...

最新文章

  1. Spring之AOP由浅入深
  2. SQL中的循环语句_类似FOR循环
  3. python进阶项目设计_推荐系统进阶:设计和构建推荐系统流程综述(1)
  4. STL常用的查找算法
  5. python中单行注释_Python中的单行、多行、中文注释方法
  6. 从Delegate.CreateDelegate看值类型的实例方法
  7. [vue] vue怎么缓存当前的组件?缓存后怎么更新?
  8. 华为机试——简单密码
  9. oracle百万级数据导入,用Perl从oracle导出百万级数据到excel
  10. Java Proxy 动态代理原理剖析
  11. Java sychronized关键字总结(二)
  12. 计算机基础知识精品课程,计算机应用基础精品课程课件第1课计算机基础知识第课计算机基础.PDF...
  13. 网页动态背景:随鼠标线条变动
  14. Win10 AMD平台无法开启SVM虚拟化
  15. 神仙打架!传言阿里 P10 赵海平被 P11 多隆判定 3.25 离职,如何评价阿里 P10 赵海平对王垠的面试?...
  16. 面部识别软件可以帮助女性找到看起来像他们的卵子捐赠者
  17. 【资料分享】迪文屏使用经验分享
  18. python win32gui+pynput 自动回复qq消息
  19. java 线性回归_java实现简单线性回归
  20. 【Unity编程】四元数(Quaternion)与欧拉角

热门文章

  1. 中富金石投教怎么样?让专业投资创造更多财富机会
  2. 三面阿里云计算,出门我就哭了!(Java研发岗,还原真实“被虐”场景)
  3. 记一次笔试遇到leetcode原题却没a出来的经历
  4. 附录H-2 技术预研报告
  5. js实现html图片翻页效果,原生JS实现图片翻书效果
  6. UED团队规范设计参考及建议
  7. PDF怎么编辑修改内容的免费方法
  8. 手机访问电脑的静态文件(html...)(anywhere)
  9. 大恒相机+VS开发+Qt 跑通示例工程
  10. python与redis数据库交互中zadd、zincrby的那些坑:(error) ERR value is not a valid float