Excel导入导出框架 excel-import-export 的使用说明文档。
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
<repositories>
<repository>
<id>alimaven</id>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/central</url>
</repository>
</repositories>
引入依赖:
<dependency>
<groupId>top.yumbo.excel</groupId>
<artifactId>excel-import-export</artifactId>
<version>1.3.3</version>
</dependency>
第二步:在类上加上注解
1、导入excel
以下面的表格为例:
数据量:79w条数据,42M的excel文件,实际上文件大小是 42706kb。
实际测试中导入耗时:71秒,实际转换耗时39秒。
中间因为读取excel文件到内存中耗时了32秒左右。
forkJoin读转换耗时39486毫秒
数据量797288条,导入总耗时71649毫秒
以上面的截图中的表格为例,表头占据了4行,第5行是数据行
一、首先加入注解信息,内容如下进行模仿
import lombok.Data;
import top.yumbo.excel.annotation.ExcelCellBind;
import top.yumbo.excel.annotation.ExcelTableHeader;
import java.math.BigDecimal;
/** * @author jinhua * @date 2021/5/20 14:18 */
@Data
// 表头占4行,将height设置为4
@ExcelTableHeader(height = 4, tableName = "区域季度数据")
public class ExportForQuarter{
/** * 年份,为了避免暴露一些隐秘消息故字段都采用了w命名,防止泄露机密。不影响结果 */
// 根据正则截取单元格内容关于年份的值。其中exportFormat是导出excel填充到单元格的内容
@ExcelCellBind(title = "时间", importPattern = "([0-9]{4})年", exportFormat = "$0年")
private Integer w1;
// 根据正则截取季度的数值,exportPriority是导出的顺序默认值是0,目的是与相同的title进行拼串,得到导出完整的单元格信息。
// 在本次案例中目的是为了拼串成 $0年$1季,其中的$0被字段w1的值替换,$1被字段w2的值替换
@ExcelCellBind(title = "时间", importPattern = "([1-4]{1})季", exportFormat = "第$1季", exportPriority = 1)
private Integer w2;
// 下面的exportSplit是导出功能需要用到的
@ExcelCellBind(title = "地区", width = 2, exportSplit = ",", exportFormat = "$0,$1")
private String w3;
// 默认的异常消息就是格式不正确,如果在导入过程中出现不合法数据例如类型转换,单元格为空,会抛异常消息,提示你哪一行数据有问题
@ExcelCellBind(title = "违约主体家数", exception = "格式不正确")
private Integer w4;
// 单位用size进行设置,例如表格上标注的单位是亿,这里的size就是下面的值。如果单位是%则填入字符串0.01即可以此类推
@ExcelCellBind(title = "合计违约规模",size = "100000000")
private BigDecimal w5;
@ExcelCellBind(title = "风险性质", exception = "自定义的异常消息内容")
private String w6;
// nullable表示该字段是否为空,默认值是false。设置为true的情况下单元格内容如果为空这个字段的值就是null
// 默认是不允许空的,故不设置为true的情况下,单元格内容为空则会抛异常并且提示第几行出错
@ExcelCellBind(title = "风险品种",nullable = true)
private String w7;
@ExcelCellBind(title = "区域偿债统筹管理能力")
private String w8;
@ExcelCellBind(title = "区域内私募可转债历史信用记录")
private String w9;
@ExcelCellBind(title = "还款可协调性")
private String w10;
@ExcelCellBind(title = "业务合作可协调性")
private String w12;
@ExcelCellBind(title = "系统部署情况")
private String w13;
}
二、调用工具类进行导入
可以传入excel文件的输入流、workbook、sheet等,然后将上述注解类XXXX.class传入即可,返回值就是一个List
例如:
// excel文件的地址
String areaQuarter = "src/test/java/top/yumbo/test/excel/2_big.xlsx";
// 后面的30000是用于控制并发的任务粒度(forkjoin框架)
List<ExportForQuarter> quarterList =ExcelImportExportUtils
.importExcelForXlsx(new FileInputStream(areaQuarter), ExportForQuarter.class,30000);
执行完成即可得到导入的List集合
2、导出Excel
2.1 原样式导出:
同样以上面的表格为例
FileOutputStream fos = new FileOutputStream("D:/季度数据-原样式导出.xlsx");
// 进行导出
ExcelImportExportUtils.exportExcel(quarterList, fos, 3000);
导出的结果如下
2.2 高亮行导出:
按照第一季度的显示黄色
、第二季度显示玫瑰色
、第三季度显示天蓝色
、第四季度显示灰色
性能测试篇
excel-import-export 性能测试
谈谈easyExcel没有实现的功能
一、导出功能设计中:没有实现一个字段需要拆分成多个单元格的功能
举个例子,有一个实体字段有一个地区信息,内容是 XX市XX区/县,通过多级字典得到这个信息。
为了方便我将其通过逗号隔开也就是XX市,XX区
,然后我需要将其分别填入地区下面的,市州
、区县
两个单元格。EasyExcel没有实现我的需求,作为扩展我还新增了格式化输出,可以在待填入内容前后填充一些辅助信息。
二、导入功能设计中:①没有考虑某个字段内容是多个单元格的合并,也就是逆过程。②此外还要考虑字段内容是单元格部分内容。③没有考虑单位换算问题
②的案例:有字段 年,季度。这两个字段的数据来自同一个单元格内容 时间
,例如有一个数据2020年第4季度
。
③的案例:例如合计违约规模单位是亿
,在我设计的这个框架中会自行换算单位和类型转换。
在设计导入的过程中,想到过用字典在对单元格内容进行映射,但是声明式注解没法注入除基本类型和String以及枚举以为的对象,本还想注入一个HashMap,然后取出单元格内容,然后通过字典进行转换,再存入字段,奈何实现不了,这种映射可能就得根据数据库中的字典进行更新了。
如果想要看源码以及体验功能,可以clone项目运行编写号的测试用例即可。
高亮显示的测试用例代码
还没有评论,来说两句吧...