基于Poi的自编导入工具类--4.2版更新记录

【Unity】入门学习笔记180524——API(18)——Transform类功能注解 1、关于localScale和lossyScale的功能注解使用不当往往会使得GameObject对象产生错误的变形①当GameObject对象A为GameObject对象B的父物体时,父物体A的各个分量放缩值x、y、z的大小应保持1:1:1的比例,否则当子物体B的Rotation值比例不为1:1:1时,B物体将会发生变形。②设GameObject对象A为B的父物体,当A物体各个分量的放缩值保持1... 阅读详情

前情回顾:https://blog.youkuaiyun.com/weixin_44718708/article/details/121683066

目录

一、提要

二、场景需求

三、新增功能说明

1. @DynamicRank

2. 重复性检测

         3. @Transform

四、优化说明

1. @ExcelNumberFormat

2. 起始标志

3. 提示信息列序号

五、GitHub地址


一、提要

GetExcelUtil4.2导入工具随实际工作应用场景需求变化更新优化的一次记录:

1. 增加@DynamicRank注解功能,支持获取动态表头及对应栏位。目前仅支持动态表头在固定表头之后的情况。

2. 增加支持重复性检测。

3. 增加@Transform注解功能,支持字段值的转换。

4. 优化:
     (1)注解数值格式(@ExcelNumberFormat)时,字段遇空值自动转化0
     (2)设置起始标志的情况下,校准位置改为以标题栏为准(取数据行前推一行)
     (3)异常信息提示的数字列序号校准为对应字母序号

二、场景需求

我们第四版工具仅支持实体类接收数据。

如图,A-I是固定栏位,后面红框里面的日期是根据实际到料信息编写的到料日期和到料数量,非固定栏位。

A-I列的数据可以定义相应个数、类型实体类字段进行获取,I列之后的动态栏位无法在同一个实体类内部定义获取。按原有4.1版本,直接使用List<String>获取动态表头,再根据动态表头List的长度使用List<Double>遍历获取表头对应列下的数据,在根据顺序将固定列数据、动态表头数据和表头列下数据组装起来即可。

按前面4.1版本的方法,代码量有点多,而且产生了二次遍历。于是新增了4.2版本,增加了获取动态栏位功能。

三、新增功能说明

1. @DynamicRank

/**
 * excel取值时,获取动态表头及本行(/列)对应表头栏位
 * 1. 注解作用于List类型字段
 * 2. titleRank表示表头所在行(/列),必填(横向表格代表行序,纵向表格表示列序)
 * 3. 从当前一直获取到最后一个表头及对应数据栏位
 * 4. 作用于实体类的最后一个字段,该字段后的其他字段将不会赋值
 * 5. enableDuplicateCheck复性检查:
 *      (1)依赖于实体类的equals方法的实现
 *      (2)会一定程度影响取值效率(看数据量),非必要不开启
 */
@Target(value = ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface DynamicRank {
    int titleRank();
    boolean enableDuplicateCheck() default false;
}

@DynamicRank注解用于获取固定栏位之后的动态栏位,兼容横向和纵向表格。该注解作用于实体类中List类型的字段上,使用该注解的字段将认为是实体类的最后一个赋值字段。为确保成功获取动态栏位的值,务必保证用于取值的字段类型为List<DTO>。

@DynamicRank包含两个参数,titleRank和enableDuplicateCheck:

(1)titleRank为数字类型,表示表头所在栏(行/列,数字序号)。被@DynamicRank注解的字段将默认获取动态表头加表头对应栏位值,需要正确提供表头所在栏。被注解List<DTO>中DTO通常只包含两个字段,表头和栏位值。在给该DTO内字段赋值时,将忽略@DynamicRank注解。

(2)enableDuplicateCheck为boolean类型,表示是否开启数据重复性检测。值为true时,如果当前获取的DTO数据与其余已获取的DTO重复时,将抛出DataDuplicationException异常。判断重复规则将在后面说明。

接收Excel数据实体:

@Data
public class Test1DTO {
    ... ...
    @DynamicRank(titleRank = 2, enableDuplicateCheck = true)
    private List<Test2DTO> dataList;
    ... ...
}

接收动态栏位实体:

@Data
public class Test2DTO {
    @ExcelDateFormat(message = "日期格式必须为yyyy/MM/dd!")
    private String arriveDate;

    @ExcelNumberFormat(format = "#", message = "数量必须为正整数!")
    private Integer arriveQty;

    // 根据业务需要自定义equals
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof Test2DTO) {
            Test2DTO another = (Test2DTO) obj;
            return this.arriveDate.equals(another.getArriveDate());
        }
        return false;
    }
}

2. 重复性检测

4.1版本的取值方法是这样的:

 4.2版本是这样的:

 对比可以发现4.2版本增加了一个boolean类型参数:

 特别注意:

(1)重复性检测的规则是依赖于取值DTO的equals方法实现,使用时应当根据自己的业务需要,在取值DTO中重写equals方法。不然在enableDuplicateCheck为true时,将会调用父类Object的equals方法(比较对象地址),业务逻辑上的数据重复将无法检测出。

(2)在数据量足够大的情况下,开启重复性检测会增加开销。重复性检测功能是将当前获取到的数据与前面已经成功获取到的数据List遍历比对,重复时抛DataDuplicationException异常。假如获取的数据有100万,当前获取到第100万条数据,则需要重新遍历前面已取得的99.9999万条数据。所以对数据重复性要求不高,并且导入数据量大的业务不建议开启。当然,当对数据重复性要求高的话,数据遍历开销就是必要开销了。

加了一个默认不进行重复性检测的方法:

根据业务需要,对equals方法的重写(@Override是可以省略的,但建议保留,规范,防止拼写错误):

@Data
public class Test1DTO {
    @NotNull(message = "A不能为空!")
    private String a;
    @NotNull(message = "B不能为空!")
    private String b;
    @NotNull(message = "C不能为空!")
    private String c;
    @NotNull(message = "D不能为空!")
    private String d;
    @NotNull(message = "E不能为空!")
    private String e;
    @NotNull(message = "F不能为空!")
    private String f;
    @ValueLimit(limit = {"value1", "value2"}, message = "G只能为value1、value2")
    @Transform(expressions = {"value1 -> 1", "value2 -> 2"})
    private Integer g;
    private String h;
    private Integer i;
    @DynamicRank(titleRank = 2, enableDuplicateCheck = true)
    private List<Test2DTO> dataList;

    // 根据业务需要自定义equals
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof Test1DTO) {
            Test1DTO another = (Test1DTO) obj;
            return this.a.equals(another.getA())
                    && this.b.equals(another.getB())
                    && this.c.equals(another.getC())
                    && this.d.equals(another.getD())
                    && this.e.equals(another.getE())
                    && this.f.equals(another.getF())
                    && this.g.equals(another.getG());
        }
        return false;
    }
}

 补充一点,由图可以看出,4.2版本将方法中的栏位数量参数cellNum拿掉了,取值个数以实体类字段数为准,所以在定DTO字段时,需明确需要获取的栏位。

3. @Transform

为满足栏位获取的值转换的需求,4.2版本新增了@Transform注解功能:

/**
 * excel取值时,指定值变化成另一个值
 * 表达式:a->b
 */
@Target(value = ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Transform {
    String[] expressions();
}

使用说明:

(1)注解参数expressions的表达式格式为“a -> b”,a为要进行转变的值,b是转化后的值,两者以箭头“->”隔开。表达式意思为当字段值为a时,自动转化为b。

(2)可以搭配@ValueLimit注解使用,@ValueLimit限制值的范围,@Transform指定范围内值的转变。这种搭配的场景有:某物料有两种状态,“在库”、“出库”,分别使用数字1、2表示。后面@Transform的使用示例就是该类例子。

@Transform的使用示例:

@Data
public class Test1DTO {
    ... ...
    @ValueLimit(limit = {"value1", "value2"}, message = "G只能为value1、value2")
    @Transform(expressions = {"value1 -> 1", "value2 -> 2"})
    private Integer g;
    ... ...
}

四、优化说明

1. @ExcelNumberFormat

@ExcelNumberFormat原先遇空值时抛出异常,改为遇到空的情况直接赋值0,优化用户体验。

2. 起始标志

起始标志读取位置从数据起始栏改为表头栏(读取数据起始栏),防止用户往模板插入数据时覆盖起始标志。

原先:

4.2版本:

 标志说明:

1. 起始标志的作用是防止用户修改了模板格式后进行数据导入,如修改表头栏位置(例:模板表头行是4,用户修改模板格式后变成1),数据栏位与预期偏离而导致数据读取不完整(2-4行数据获取不到)或多读无关数据,而用户无从感知。加入起始标志后起始行与预期不对应时将抛出IllegalArgumentException异常停止操作,项目中将截获异常后摘取提示信息告知用户,保证数据的正确性。

2. 结束标志与起始标志作用类似,以结束标志做数据终点,防止用户在数据结束后插入了不可见的无关数据影响数据读取准确性(比如设置为白色的字体)。但这种情况比较少见,工具类中已经做出了遇到空行终止数据读取返回结果的处理(包括全空格行),所以结束标志比较少用到。

*3. 多说一句,工具类可以获取sheet名,有需求的话,可以将模板的sheet名设置一个特定的名字,在业务层判断获取的sheet名是否与预期的名字一致,以此判断用户是否使用了给定的模板进行数据上传。

3. 提示信息列序号

原本提示信息类似下面:

文件工作表1第2行第55列:日期格式不正确!

以数字提示列序,实际到Excel文档中,寻找第55列有点不友好,现将所有与列序有关的提示,序号对应到Excel中的字母列序。如下:

文件工作表1第2行第BC列:日期格式不正确!

五、GitHub地址

https://github.com/BadGuy-Darren/MyExcelImportTool.git/4.2/

未打包成jar依赖包,打包教程网上有,很简单的。

最新版本POI-5.2.0操作Excel本地导入库配置过程记录 最新版本POI-5.2.0操作Excel本地配置 阅读详情

相关推荐

POI 4.1.0读取excel报错解决方案记录

POI 4.1.0读取excel报错解决方案记录 这两天再写一个小程序需要读取大型excel文件,根据网上的方法简单编写代码后报如下错误: NoClassDefFoundError: org/apache/commons/collections/IteratorUtils 仔细阅读报错信息,这是由于需要用到commons-collections4,但没有导入版本4以上的包。 解决方法:如果已经...

lynn339353的博客 2945

JAVA项目中使用POI(版本4.2.1) 解决报错 java.lang.NoClassDefFoundError: org/apache/poi/POIXMLDocumentPart

一、前言 最近在做Word转Html时遇到了使用POI的4.2.1版本时报错: 二、原因解析 经过对比发现4.2.1版本比旧版本多了ooxml包,导致找不到POIXMLDocumentPart,所以这里的解决方案有两个: 1.可以在项目中把旧版本的jar包源码修改后上传到maven仓库。 2.依旧使用4.2.1版本并把配套的jar包依赖一同升级。 本篇文章介绍第二种解决方法。 三、依赖包 依赖包中主要是xdocreport的版本一定要升级到2.0.2。 <dependency>

程序小白进阶之路 1万+

【UE4】【笔记】2、导入和导出

UE4学习笔记 导入和导出 讲解如何导入和导出3D数据,这些东西需要设置许多选项才能成功 静态网格体的导出 UE4能够识别.fbx的静态网格体和骨骼动画 FBX包含以下数据:带有基本材质数据的静态网格体数据、基本材质数据、基本骨骼数据、LOD数据等。 导出的时候应该勾选平滑组(Smoothing Groups)、三角部分(Triangulate)、保留边缘朝向(Preserve edge origintation) 如果导出的时候有动画,还应该在Animation选项卡组中选中Animation选项 骨

Triumph_Dynamic08 7076

Apache POI自动生成Word文档(带目录)

全称Apache POI,使用Java编写的免费开源的跨平台的Java API。是创建和维护操作各种符合 Office Open XML(OOXML)标准和微软的 OLE 2 复合文档格式(OLE2)的 Java API。用它可以使用 Java 读取和创建, 修改 MS Excel 文件. 而且, 还可以使用 Java 读取和创建 MS Word 和 MSPowerPoint 文件。Apache POI 提供 Java 操作 Excel 解决方案(适用于 Excel97-2008)。(1)

zhangyy130的专栏 7642

easypoi_4.2.0.zip

easypoi相关4.2.0jar,e

Contest 226 - C - Martial artist

from atcoder Problem Statement Time Limit: 2 sec / Memory Limit: 1024 MB Score :300300points Takahashi is a martial artist. There areNNmoves that a martial artist can learn, called Move11,22,\ldots…,NN. For each1 \leq i \leq N1≤i≤N, it takes...

m0_54674275的博客 1020

spring事务特性分析

spring事务特性 spring所有的事务管理策略类都继承自org.springframework.transaction.PlatformTransactionManager接口 public interface PlatformTransactionManager {     TransactionStatus getTransaction(TransactionDefini

Jeffrey's 专栏 2743

AUTOSAR R20-11标准下载!

这是公众号的第2篇推文,粉丝数49 Document Search Classic Platform Adaptive Platform Foundation 文档截图 以为会在明天的发布会之后才上线,没想到官网现在就悄悄放出来了。 中国由于网络问题,下载速度比较慢或者会中断。 “阅读原文”提供多种下载方式,可以在线浏览,可以集中下载也可单个文档下载。 如有增减我也会及时在公众号里通知大家,不过我觉得不会变动了。 整理不宜,好东西要分...

Adaptive_AUTOSAR的博客 1890

@Transient注解输出空间位置属性

 一、@Transient注解 1.serialization会忽略掉 Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。 为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient 2.不跟数据库表做映射 就是表中没有这个字段 @...

bitree1的博客 971

攻防世界 misc题GFSJ1129-【您看我还有机会吗?】

我们发现了隐藏内容,一开始我以为那个英文就是flag,提交后发现不对,然后我想只有一张图片然后图片上的隐写内容又不是flag,那必定还有什么文件被隐藏了,于是我们打开VMware并启动Ubuntu,使用binwalk分析一下有没有隐藏文件,我们要在Terminal中分析,如下。我们发现里面有一个flag.txt文件,我们尝试提取里面内容,但发现又要密码,我们想起了之前图片上的隐藏内容,我们将那段英文输入(包括空格和符号,在VMware中输入密码不会有显示,你看到的就像没输入一样),然后我们看到如下。

大数据专业,关注 AI 安全与数学建模。记录 Web 安全、对抗攻击、隐私保护等安全实践,以及从经典模型到智能方法的建模思考。用数学思维理解 AI,用 AI 方法反哺安全与建模。 1095

modbus

从机地址 功能码 起始地址高位 起始地址低位 数量高位 数量低位 字节数 0001H高位 0001H低位 0002H高位 0002H低位 CRC高位 CRC低位。每个输入寄存器的长度为2个字节。其中,CDH对应线圈0013H到001AH的内容,01H对应线圈001B到001CH的内容,未使用位用0填充。从机地址 功能码 起始地址高位 起始地址低位 寄存器数量高位 寄存器数量低位 CRC高位 CRC低位。从机地址 功能码 起始地址高位 起始地址低位 寄存器数量高位 寄存器数量低位 CRC高位 CRC低位。

lunhuicnm的博客 9750

Apache POI 实现报表导入和导出

1、POI概述 在企业级应用开发中,Excel报表是一种最常见的报表需求。Excel报表开发一般分为两种形式: 基于Excel报表批量上传数据 通过Java代码生成Excel报表 Java中常见的用来操作Excel的方式一般有2种:JXL和POI JXL只能对Excel进行操作,属于比较老的框架,它只支持到Excel 95-2000的版本。现在已经停止更新和维护。 POI是Apache的...

P了个K 1052

深入解析YT8521S千兆以太网PHY芯片的设计与调试要点

本文深入解析了YT8521S千兆以太网PHY芯片的设计与调试要点。重点剖析了硬件设计中的电源方案、RGMII接口电平配置(尤其是1.8V电平方案)以及PCB布局布线等关键细节,并提供了从硬件检查、驱动配置到性能测试的完整调试流程,帮助工程师规避常见陷阱,实现稳定可靠的千兆网络连接。

weixin_29190573的博客 687

POI导入Excel将数据更新到数据库

前台layui html代码 <button class="layui-btn layui-btn-primary" id="uploadCredit" data-kercode="400002" style="display: none"><i class="layui-icon"></i>导入 </button> js代...

Sun_of_Rainy的博客 710

全桥LLC谐振变换器设计与双环控制策略详解

LLC谐振变换器作为高频开关电源的核心拓扑,通过谐振腔实现软开关特性,显著提升转换效率(可达96%以上)。其工作原理基于谐振电感、电容的协同作用,当开关频率接近谐振点时实现ZVS/ZCS。在工业电源、电动汽车充电等场景中,电压电流双环控制策略通过引入电流内环和竞争仲裁机制,有效改善动态响应(实测负载跳变时电压跌落减少60%)。数字控制实现时需注意ADC采样同步和PWM更新时序,而谐振参数测量与温升管理则是工程实践的关键。

weixin_29189987的博客 257

AUTOSAR SHE 密钥更新协议

依赖内存槽的使用用例,内存槽有不同的保护协议。M2是新的计数值C_ID‘,相应的标志位F_ID',0填充第一个块,以及新的密钥K_ID'的组合的CBC算法加密的消息。例如,我要更新一个MASTER_ECU_KEY, 那么参考上表,我需要知晓Non-volatile的MASTER_ECU_KEY (即授权密文为MASTER_ECU_KEY自己的密文).内存的更新协议分为两部分,第一部分是实际内存更新到发送一个秘密且真实的key到SHE,然后第二部分为验证,即提供给后台一个key更新成功的证据。

weixin_46481662的博客 3279

POI导入功能代码记录

Controller层方法 @PostMapping("uploadIntentionList") @ResponseBody @ApiOperation("导入文档") public String uploadIntentionFile(@RequestParam("file") MultipartFile file, @RequestParam String type) { ...

Everthing is coming 223

MFC Windows 程序设计[122]之树形下拉列表框(附源码)

MFC是微软公司提供的一个类库(class libraries),用以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。有很多初学MFC的小伙伴们都觉得MFC比较难学,看书吧,看了就忘了,网上的一些教程又是写的含糊不清,故而学习起来很吃力...... 故此,本专栏亲自研究,实践,由易到难,层层深入,将调试过程中所遭所遇进行详细讲解,注意事项进行一一列举,希望能够帮助到各位初学MFC的小伙伴,避免走弯路,费时费力。.........

hnjzfwy的博客 458

Poi-2:个人记录使用过程的问题

Poi-2:个人记录使用过程的问题 doc以及docx转html public static String docToHtml(String wPath) throws Exception String fpath=new GetFromFilePath().getNameFromPath(wPath); File path = new File(fpath); String imagePathStr = path.getAbsolutePath() + "

若惊鸿的博客 1389

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

10w 行级别数据的 Excel 导入,4 版完整优化记录,效果太明显了!

点击上方☝码猿技术专栏轻松关注!及时获取有趣有料的技术文章来源:https://www.cnblogs.com/keatsCoder/p/13217561.html需求说明项目中有一个...

码猿技术专栏 618

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

java POI word 更新目录接口

Java POI 更新 Word 文档目录的接口使用指南 在处理 Word 文档时,尤其是涉及到文档自动化处理与生成报告时,目录的更新是一个常见需求。Apache POI 是一个非常受欢迎的 Java 库,可以用来处理 Microsoft Office 文件格式,尤其是 Word 文档。本文将介绍如何使用 Java POI...

weixin_42366095的博客 1500

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

poi导入时报错问题记录

使用POI导入excel时用我的机器上的office2007编辑过的都不会报错,在别人机器上用office2010编辑过的有时报错,调试代码发现总是在Sheet sheet = book.getSheet(0); 这一句出问题.     我猜是jar包的原因,因为程序中用的jar比较老不支持office2010所以报错,开始认为是poi的jar比较老,替换了最新的还是不行,测试了几个jar后终于

李坤 大米时代 第五期 4246

【亲测免费】 poi-tl-ext: 扩展版POI工具包使用指南

`poi-tl-ext` 是一个基于 Apache POI 和 [poi-tl](https://github.com/Sayi/poi-tl) 的扩展项目,旨在简化 Word 文档操作中的数据填充过程。它引入了一系列增强特性,包括对表格和列表数据的灵活处理以及图表和目录自动生成的支持。 ### 功能亮点: - **数据类型自动化**: 直接在Word文档中设定数据类型,简化后台数据组装。 -...

gitblog_00936的博客 2064

poi从3.6 升级为新版本5.2.2,导致 原先的代码 报错,替换方案

版本升级,更新代码

weixin_43976226的博客 1万+

Poi导入Excel校验表头

我们在日常的开发过程中,poi导入数据要根据注解的列名和顺序进行识别,那么首先要校验模版的正确与否,即表头是否正确,然后才能开始数据和业务层面的校验,最近也是被这个东西烦的不行,解决后记录一下,一个是方便自己以后查看,也给其他兄弟分享下,节省时间,话不多说,直接上代码: 通过有序集合的比较,就可以得出表头是否正确的结论啦,分享就到这里,有需要的兄弟快去试试吧!......

默慊的博客 3639

4次迭代!10w行级别数据的Excel导入优化记录

点击上方好好学java,选择星标公众号重磅资讯、干货,第一时间送达 今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前...

好好学java 432
上一篇: 第二篇 spring security简单实现自动登录
下一篇: 菜单树结构处理优化--逻辑栈代替递归栈
大迪吃小迪
博客等级 码龄8年 38粉丝 25原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

大迪吃小迪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值