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

本文介绍了如何使用最新版本的aliyun镜像仓库更新Maven依赖,并详细展示了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.14</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.ExcelTitleBind;
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填充到单元格的内容
    @ExcelTitleBind(title = "时间", importPattern = "([0-9]{4})年", exportFormat = "$0年")
    private Integer w1;
    // 根据正则截取季度的数值,exportPriority是导出的顺序默认值是0,目的是与相同的title进行拼串,得到导出完整的单元格信息。
    // 在本次案例中目的是为了拼串成  $0年$1季,其中的$0被字段w1的值替换,$1被字段w2的值替换
    @ExcelTitleBind(title = "时间", importPattern = "([1-4]{1})季", exportFormat = "第$1季", exportPriority = 1)
    private Integer w2;
    // 下面的exportSplit是导出功能需要用到的
    @ExcelTitleBind(title = "地区", width = 2, exportSplit = ",", exportFormat = "$0,$1")
    private String w3;
    // 默认的异常消息就是格式不正确,如果在导入过程中出现不合法数据例如类型转换,单元格为空,会抛异常消息,提示你哪一行数据有问题
    @ExcelTitleBind(title = "违约主体家数", exception = "格式不正确")
    private Integer w4;
    // 单位用size进行设置,例如表格上标注的单位是亿,这里的size就是下面的值。如果单位是%则填入字符串0.01即可以此类推
    @ExcelTitleBind(title = "合计违约规模",size = "100000000")
    private BigDecimal w5;
    @ExcelTitleBind(title = "风险性质", exception = "自定义的异常消息内容")
    private String w6;
    // nullable表示该字段是否为空,默认值是false。设置为true的情况下单元格内容如果为空这个字段的值就是null
    // 默认是不允许空的,故不设置为true的情况下,单元格内容为空则会抛异常并且提示第几行出错
    @ExcelTitleBind(title = "风险品种",nullable = true)
    private String w7;
    @ExcelTitleBind(title = "区域偿债统筹管理能力")
    private String w8;
    @ExcelTitleBind(title = "区域内私募可转债历史信用记录")
    private String w9;
    @ExcelTitleBind(title = "还款可协调性")
    private String w10;
    @ExcelTitleBind(title = "业务合作可协调性")
    private String w12;
    @ExcelTitleBind(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项目运行编写号的测试用例即可。
高亮显示的测试用例代码

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诗水人间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值