Excel导入导出框架 excel-import-export 的使用说明文档。

- 日理万妓 2022-10-18 01:35 311阅读 0赞

maven的仓库地址:excel-import-export

选择一个最新版本(前面几个版本功能不是最新的,可能被替换)

源码地址:github仓库源码地址

码云地址:https://gitee.com/gnnu/excel-import-export


使用方式

第一步:引入依赖

将仓库地址设置为新的aliyun镜仓,与dependencies标签同级,将本项目的仓库地址设置为新版本的ali镜像仓库。
亦可以全局修改settings.xml中的mirrors将url修改为新的地址:https://maven.aliyun.com/repository/central

  1. <repositories>
  2. <repository>
  3. <id>alimaven</id>
  4. <name>aliyun maven</name>
  5. <url>https://maven.aliyun.com/repository/central</url>
  6. </repository>
  7. </repositories>

引入依赖:

  1. <dependency>
  2. <groupId>top.yumbo.excel</groupId>
  3. <artifactId>excel-import-export</artifactId>
  4. <version>1.3.3</version>
  5. </dependency>

第二步:在类上加上注解

1、导入excel

以下面的表格为例:
在这里插入图片描述
数据量:79w条数据,42M的excel文件,实际上文件大小是 42706kb。
实际测试中导入耗时:71秒,实际转换耗时39秒。
中间因为读取excel文件到内存中耗时了32秒左右。

  1. forkJoin读转换耗时39486毫秒
  2. 数据量797288条,导入总耗时71649毫秒

以上面的截图中的表格为例,表头占据了4行,第5行是数据行

一、首先加入注解信息,内容如下进行模仿

  1. import lombok.Data;
  2. import top.yumbo.excel.annotation.ExcelCellBind;
  3. import top.yumbo.excel.annotation.ExcelTableHeader;
  4. import java.math.BigDecimal;
  5. /** * @author jinhua * @date 2021/5/20 14:18 */
  6. @Data
  7. // 表头占4行,将height设置为4
  8. @ExcelTableHeader(height = 4, tableName = "区域季度数据")
  9. public class ExportForQuarter{
  10. /** * 年份,为了避免暴露一些隐秘消息故字段都采用了w命名,防止泄露机密。不影响结果 */
  11. // 根据正则截取单元格内容关于年份的值。其中exportFormat是导出excel填充到单元格的内容
  12. @ExcelCellBind(title = "时间", importPattern = "([0-9]{4})年", exportFormat = "$0年")
  13. private Integer w1;
  14. // 根据正则截取季度的数值,exportPriority是导出的顺序默认值是0,目的是与相同的title进行拼串,得到导出完整的单元格信息。
  15. // 在本次案例中目的是为了拼串成 $0年$1季,其中的$0被字段w1的值替换,$1被字段w2的值替换
  16. @ExcelCellBind(title = "时间", importPattern = "([1-4]{1})季", exportFormat = "第$1季", exportPriority = 1)
  17. private Integer w2;
  18. // 下面的exportSplit是导出功能需要用到的
  19. @ExcelCellBind(title = "地区", width = 2, exportSplit = ",", exportFormat = "$0,$1")
  20. private String w3;
  21. // 默认的异常消息就是格式不正确,如果在导入过程中出现不合法数据例如类型转换,单元格为空,会抛异常消息,提示你哪一行数据有问题
  22. @ExcelCellBind(title = "违约主体家数", exception = "格式不正确")
  23. private Integer w4;
  24. // 单位用size进行设置,例如表格上标注的单位是亿,这里的size就是下面的值。如果单位是%则填入字符串0.01即可以此类推
  25. @ExcelCellBind(title = "合计违约规模",size = "100000000")
  26. private BigDecimal w5;
  27. @ExcelCellBind(title = "风险性质", exception = "自定义的异常消息内容")
  28. private String w6;
  29. // nullable表示该字段是否为空,默认值是false。设置为true的情况下单元格内容如果为空这个字段的值就是null
  30. // 默认是不允许空的,故不设置为true的情况下,单元格内容为空则会抛异常并且提示第几行出错
  31. @ExcelCellBind(title = "风险品种",nullable = true)
  32. private String w7;
  33. @ExcelCellBind(title = "区域偿债统筹管理能力")
  34. private String w8;
  35. @ExcelCellBind(title = "区域内私募可转债历史信用记录")
  36. private String w9;
  37. @ExcelCellBind(title = "还款可协调性")
  38. private String w10;
  39. @ExcelCellBind(title = "业务合作可协调性")
  40. private String w12;
  41. @ExcelCellBind(title = "系统部署情况")
  42. private String w13;
  43. }

二、调用工具类进行导入
可以传入excel文件的输入流、workbook、sheet等,然后将上述注解类XXXX.class传入即可,返回值就是一个List
例如:

  1. // excel文件的地址
  2. String areaQuarter = "src/test/java/top/yumbo/test/excel/2_big.xlsx";
  3. // 后面的30000是用于控制并发的任务粒度(forkjoin框架)
  4. List<ExportForQuarter> quarterList =ExcelImportExportUtils
  5. .importExcelForXlsx(new FileInputStream(areaQuarter), ExportForQuarter.class,30000);

执行完成即可得到导入的List集合

2、导出Excel

2.1 原样式导出:

同样以上面的表格为例

  1. FileOutputStream fos = new FileOutputStream("D:/季度数据-原样式导出.xlsx");
  2. // 进行导出
  3. ExcelImportExportUtils.exportExcel(quarterList, fos, 3000);

导出的结果如下

在这里插入图片描述

2.2 高亮行导出:

按照第一季度的显示黄色、第二季度显示玫瑰色、第三季度显示天蓝色、第四季度显示灰色

在这里插入图片描述

性能测试篇

excel-import-export 性能测试

谈谈easyExcel没有实现的功能

一、导出功能设计中:没有实现一个字段需要拆分成多个单元格的功能

举个例子,有一个实体字段有一个地区信息,内容是 XX市XX区/县,通过多级字典得到这个信息。
为了方便我将其通过逗号隔开也就是XX市,XX区,然后我需要将其分别填入地区下面的,市州区县两个单元格。EasyExcel没有实现我的需求,作为扩展我还新增了格式化输出,可以在待填入内容前后填充一些辅助信息。

二、导入功能设计中:①没有考虑某个字段内容是多个单元格的合并,也就是逆过程。②此外还要考虑字段内容是单元格部分内容。③没有考虑单位换算问题

②的案例:有字段 年,季度。这两个字段的数据来自同一个单元格内容 时间,例如有一个数据2020年第4季度
③的案例:例如合计违约规模单位是亿,在我设计的这个框架中会自行换算单位和类型转换。

在设计导入的过程中,想到过用字典在对单元格内容进行映射,但是声明式注解没法注入除基本类型和String以及枚举以为的对象,本还想注入一个HashMap,然后取出单元格内容,然后通过字典进行转换,再存入字段,奈何实现不了,这种映射可能就得根据数据库中的字典进行更新了。


如果想要看源码以及体验功能,可以clone项目运行编写号的测试用例即可。
高亮显示的测试用例代码

发表评论

表情:
评论列表 (有 0 条评论,311人围观)

还没有评论,来说两句吧...

相关阅读

    相关 EXCEL导入导出

        操作EXCEL一般分两种,其一就是用类似连接数据库的方式,将EXCEL文件当作小型数据库操作,这种方式我想大多数程序员都很喜欢;另一种就是用Microsoft.Offi