在表格开发中,如何选择适合自己的处理工具?

表格,开发,如何,选择,适合,自己,处理,工具 · 浏览次数 : 0

小编点评

**EasyExcel 与 GcExcel 的比较** | 特征 | EasyExcel | GcExcel | |---|---|---| | API 设计初衷 | 高性能、高效的读取和写入 | 高性能的读取和写入 | | 优化目标 | 高并发量、内存占用低 | 高性能和高效 | | 核心理念 | 流式读取和事件驱动 | Excel 工作簿、工作表和区域 | | API 风格 | 灵活、可扩展 | 与 Excel 配合,高度兼容 | | 适用场景 | 高并发量和内存有限的场景 | 高性能和高效的场景 | | 示例用途 | 数据分析、报表制作 | 数据处理、公式计算 | **结论** EasyExcel 和 GcExcel 是两种出色的 Excel 处理库,根据不同的需求选择合适的产品。EasyExcel 更适合高并发量和内存要求高的场景,而 GcExcel 更适合性能和高效的场景。

正文

引言

GcExcel和EasyExcel都是卓越的高性能Excel处理库。GcExcel是由葡萄城公司开发,可用于Java和.Net平台;而EasyExcel是阿里巴巴开发的基于Java的开源Excel处理库。 在本文中,我们将对GcExcel和EasyExcel进行比较,帮助读者在实际场景中做出明智选择。

EasyExcel与GcExcel的区别

每个产品背后都有其设计初衷,EasyExcel的主要目标是解决POI在读写Excel文件时遇到的一些问题,例如内存占用过大、经常出现OOM(内存溢出)错误以及性能不够优越,无法轻松处理大型文件的限制。因此,EasyExcel旨在提供更高效、更稳定的Excel读写解决方案,以满足处理大文件时的需求。

与EasyExcel不同,GcExcel的API设计初衷独具特色。EasyExcel注重于快速、简便地读写Excel文件,而GcExcel则更加专注于提升读写性能、公式计算性能以及高级Excel功能的支持,如图表、透视表、数据校验、条件格式等等。

GcExcel在超越Excel功能的基础上,积极投入于提升性能,并为开发人员提供丰富多样的高级Excel功能。无论是数据分析、报表制作还是复杂公式运算,GcExcel都以出色的性能和功能展现了其独特的价值。

EasyExcel与GcExcel的应用场景

由于解决问题的差异,这两个组件库都具备极高的性能,但它们将性能优势应用于不同的场景中。

对于EasyExcel而言,Excel更像是数据的承载方式。当用户需要处理高并发量且对内存要求较高时,EasyExcel展现出更适合的性能表现。

然而,Excel经过微软多年的发展,衍生出许多不同的应用场景,如公式计算、数据填报、打印报送等。在这些场景中,通常需要组件库能够覆盖足够多的Excel功能。因此,在这些情况下,GcExcel更为适用。

例如,基金、保险、财税等行业通常需要进行Excel公式计算。通过使用GcExcel,可以实现服务端自动化公式计算的解决方案。

另外,对于计量检测、实验室管理等领域,对导出功能需求较高。通过GcExcel可以实现自动化导出PDF以及定时报送等功能。

同时,葡萄城还提供了纯前端Excel组件库产品SpreadJS。如果场景需要前后端协作进行Excel处理,选择GcExcel显然更加合适。

总之,根据不同的需求场景,选择合适的组件库能够充分发挥其性能优势,提供更好的Excel处理解决方案。

EasyExcel与GcExcel的API设计风格

EasyExcel的API采用流式读写和事件驱动的方式,这种设计理念使得在操作Excel时,性能和内存之间的平衡可达到极致。同时,其标注式的设计理念将代码逻辑与Excel文件解耦,使开发人员只需要更好地思考模型的设计,而不必担心繁琐的Excel操作。综上所述,EasyExcel的API提供了高性能、高效率的Excel操作解决方案,让您能够更加专注于业务逻辑的实现。

// 摘自EasyExcel官方文档

 // 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
 @Slf4j
 public class DemoDataListener implements ReadListener<DemoData> {

   /**
   * 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收
   */
   private static final int BATCH_COUNT = 100;
   /**
   * 缓存的数据
   */
   private List<DemoData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
   /**
   * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
   */
   private DemoDAO demoDAO;

   public DemoDataListener() {
     // 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
     demoDAO = new DemoDAO();
   }

   /**
   * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
   *
   * @param demoDAO
   */
   public DemoDataListener(DemoDAO demoDAO) {
     this.demoDAO = demoDAO;
   }

   /**
   \* 这个每一条数据解析都会来调用
   *
   * @param data  one row value. Is is same as {@link AnalysisContext#readRowHolder()}
   * @param context
   */
   @Override
   public void invoke(DemoData data, AnalysisContext context) {
     log.info("解析到一条数据:{}", JSON.toJSONString(data));
     cachedDataList.add(data);
     // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
     if (cachedDataList.size() >= BATCH_COUNT) {
       saveData();
       // 存储完成清理 list
       cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
     }
   }

   /**
   * 所有数据解析完成了 都会被调用
   *
   * @param context
   */
   @Override
   public void doAfterAllAnalysed(AnalysisContext context) {
     // 这里也要保存数据,确保最后遗留的数据也存储到数据库
     saveData();
     log.info("所有数据解析完成!");
   }

   /**
   * 加上存储数据库
   */
   private void saveData() {
     log.info("{}条数据,开始存储数据库!", cachedDataList.size());
     demoDAO.save(cachedDataList);
     log.info("存储数据库成功!");
   }
 }

GcExcel的API则以Excel为蓝本,采用工作簿(workbook)、工作表(worksheet)和区域(range)等概念,使整个组件库能够完美支持Excel的各种功能。如果您对Excel非常熟悉,那么使用GcExcel时会感到非常亲切和自然。

这两种设计方式就像解决不同场景的两个产品一样,它们都适合不同风格的开发人员。

对于那些追求极致技术的开发人员来说,EasyExcel的灵活性非常合适。而对于那些更注重快速解决业务需求、务实的开发人员来说,GcExcel提供了多样化的API选择,并且与Excel高度兼容,能够高效赋能于这种场景。

 Workbook wb = new Workbook();
 IWorksheet sheet1 = wb.getWorksheets().get(0);
 Object[][] values = (Object[][]) sheet1.getRange("A1:Z26").getValue();

最后

通过上述的对比,EasyExcel和GcExcel分别适用于不同的情况。

在选择时,您可以根据不同的维度思考,选择更适合自身场景的Excel处理库。

与在表格开发中,如何选择适合自己的处理工具?相似的内容:

在表格开发中,如何选择适合自己的处理工具?

引言 GcExcel和EasyExcel都是卓越的高性能Excel处理库。GcExcel是由葡萄城公司开发,可用于Java和.Net平台;而EasyExcel是阿里巴巴开发的基于Java的开源Excel处理库。 在本文中,我们将对GcExcel和EasyExcel进行比较,帮助读者在实际场景中做出明

如何实现Excel中的多级数据联动

> 摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:[葡萄城官网](https://www.grapecity.com.cn/),葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 ## 前言 在类Excel表格应用中,常用的需求场景是根据单元格之间的数据联动,例如选择某个

如何使用前端表格控件实现多数据源整合?

前言 作为表格产品的典型应用场景之一,几乎所有的行业都会存在类 Excel 报表开发这样的应用场景,而在这些应用场景中,经常会遇见下面的这些痛点: 报表数据往往来自多个不同的数据源,需要报表系统能够同时连接多个数据源,并融合不同的数据格式 实际的报表中需要对数据结果进行逻辑计算,例如销售的环比和同比

如何使用Java创建数据透视表并导出为PDF

摘要:本文由葡萄城技术团队原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 数据透视分析是一种强大的工具,可以帮助我们从大量数据中提取有用信息并进行深入分析。而在Java开发中,可以借助PivotTable,通过数据透视分析揭示数据中的隐藏

flutter系列之:做一个下载按钮的动画

[toc] # 简介 我们在app的开发过程中经常会用到一些表示进度类的动画效果,比如一个下载按钮,我们希望按钮能够动态显示下载的进度,这样可以给用户一些直观的印象,那么在flutter中一个下载按钮的动画应该如何制作呢? 一起来看看吧。 # 定义下载的状态 我们在真正开发下载按钮之前,首先定义几个

表单引擎字段类型该如何设计?

在软件行业的发展过程中,从业者对于开发效率和质量提升是一直在追随的一个目标。通过复用软件模块来实现这些目标通常是一种有效的手段,从头文件引入、面向对象的封装、动态库的引入、代码生成器类工具、低代码引擎等,随着行业技术发展能复用的层次也从底层的文件逐步到界面层面的复用。本文主要围绕在OA、低代码平台中

如何在浏览器中导入Excel表格插件(上)

本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言|问题背景 作为一名优秀的打工人,Excel是大家上班中必不可少的办公软件。随着互联网时代的到来,越来越多的公司开始使用各种B/S系统来处理表格数据文件。那么有没有

如何在浏览器中导入Excel表格插件(下)

本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 | 问题背景 作为一名优秀的打工人,Excel是大家上班中必不可少的办公软件。随着互联网时代的到来,越来越多的公司开始使用各种B/S系统来处理表格数据文件。那么有

驱动开发:内核解析PE结构节表

在笔者上一篇文章`《驱动开发:内核解析PE结构导出表》`介绍了如何解析内存导出表结构,本章将继续延申实现解析PE结构的PE头,PE节表等数据,总体而言内核中解析PE结构与应用层没什么不同,在上一篇文章中`LyShark`封装实现了`KernelMapFile()`内存映射函数,在之后的章节中这个函数会被多次用到,为了减少代码冗余,后期文章只列出重要部分,读者可以自行去前面的文章中寻找特定的片段。

驱动开发:PE导出函数与RVA转换

在笔者上篇文章`《驱动开发:内核扫描SSDT挂钩状态》`中简单介绍了如何扫描被挂钩的SSDT函数,并简单介绍了如何解析导出表,本章将继续延申PE导出表的解析,实现一系列灵活的解析如通过传入函数名解析出函数的RVA偏移,ID索引,Index下标等参数,并将其封装为可直接使用的函数,以在后期需要时可以被直接引用,同样为了节约篇幅本章中的`LoadKernelFile()`内存映射函数如需要使用请去前一