本文旨在解决使用Easy-POI导入复杂表头(导出)时,遇上的EXCEL文件中的字段无法正常映射到Bean的问题,官方的示例和其他的CSDN文章基本上没有很详细的教程,于是自己写一个

这是需要导入的表结构:

这是结构中需要在ImportParams中声明的术语:

在导入的时候,必须通过ImportParams params = new ImportParams()对象设置表的基本结构,如果有标题,就要params.setTitleRows(1)设置忽略的行,标题占1行就设置1,占n行就设置n,这个很容易

需要特别注意的是headRows,这里需要设置的是表头行的行数,默认情况下为1,但如果使用的是复杂表头,则表头占的行数就不是1了,比如示例中的表头一样,b分组下有c和d,e分组下也有c和d(严格上来说是b分组下只有c,e分组下也只有c,下面我会说原因),表头显然占了2行(别纠结a字段貌似只占了一行!实际肯定是要以最大为主。而且最左边列的数字也能看出占了2行,以最左边的数字为准就行了!),最后params.setHeadRows(2)搞定!

然后Excel的数据导入就能正确解析了,看看解析成什么样子?


下面要讲解Bean的解析了,要让Excel正确生成Bean,显然Excel上是没法下功夫的,因为Excel都是客户给的需求,已经是硬性规定了,只能在Bean上下功夫,来看看Bean是怎样的

这是第一版的Bean

这里有人会问我为什么不给d属性和g属性加groupName属性吗?这里我有必要加吗?groupName属性的作用就是把Bean中的c变成b_c,e_c,使之上面的titleMap的字段相对应,上面的d字段并没有被解析成b_d,e_d,加了反而映射不上。因为easypoi认为,虽然b字段占了1,2两列,但他在归属上任然只算列数1,所以解析的时候只会处理同为列数1的c字段并合并为b_c,列数2的d字段已经是独立的字段了,并不会处理成b_d,e字段也是同理。然后看看结果如何。。。


看看Bean中解析出的属性有没有问题

原理:


大致过程如下:
遍历真实数据行备用;
遍历Excel中解析出的字段集合titleMap并获得对应的列数与字段名 ------> 根据集合中的字段名称获取Bean中解析出的ExcelImportEntity对象 ------> 拿出ExcelImportEntity对象中早以准备好的set方法对象,然后new出来的bean,依据titleMap中的列数和真实数据行获取的真实数据--------->填充Bean的其中一个属性

也就是说,案例中Bean的属性G会通过ExcelImportEntity中的setG方法重复设置2次,由于属性G对应的d字段是最后一个字段,属性G也是@Excel中name为d的最后一个属性(这点可以保证,因为生成ExcelImportEntity集合的excelParams也是通过循环的方式,所以不会出现4个ExcelImportEntity对象中setG方法的对象被setD方法覆盖),所以覆盖到最后,值总是对的

分析完原因之后,解决的方案很简单,通过fixIndex解决@Excel中name重名问题:

看看加完以后bean的属性集合变成什么样。。。

bean的映射集中原来缺失的d属性的映射集多了一个FIXED_2


接下来就容易多了,只要读取要字段开头为“FIX_”开头的Bean属性映射集,直接获取列数,通过列数(titleMap中的key)获取对应的真实数据即可,不需在通过Excel中的列名(titleMap中的value)获取,完成!

深入

这个更复杂的表现在应该会了吧

先在导入参数中设置好标题行数和表头行数,上表中标题占了1行,表头占了3行

然后配置好Bean类中的注解,需要注意一下,像f属性所映射的c字段这种有多个复杂表头匹配的项x2和b字段同时重合,直接a字段_b字段_…就行

最后结果:

如果复杂表头下的子字段名称都是不一样的怎么办?那更简单,连fixIndex都可以省略了。
如果需要单独一个实体类映射复杂表头直接@ExcelEntity就行,毕竟举例中出现字段名相同的情况才是最难的情况,其他的都是简单情况

如何使用Easy-POI导入复杂表头的Excel报表(含源码级分析)相关推荐

  1. @Import注解:导入配置类的四种方式源码解析

    微信搜索:码农StayUp 主页地址:https://gozhuyinglong.github.io 源码分享:https://github.com/gozhuyinglong/blog-demos ...

  2. 利用POI生成带表头的Excel

    1.关于Excel版本的一点了解 在项目工作中主要使用两个版本,03版文件名以".xls"结尾,最大处理行数为65536,07版文件名以".xlsx"结尾,最大 ...

  3. Python爬虫高德地图全国各个城市POI并导出表格(PyCharm )结尾含源码地址

    声明:本文仅做技术交流,请勿用于商业用途! 可爬取高德地图上各个城市公司.餐饮.医院.商家等信息并导出Excel,效果如图 1.前期准备 1.1 下载安装python并配置环境 这里推荐篇博客很详细: ...

  4. Java-Excel导入导出通用实现Demo(附源码Git地址)

    说明:本工具适用大部分导入导出场景,花点时间搞懂怎么用了之后灰常方便,阅读本文前,建议下载源码后参考着阅读.源码地址:https://gitee.com/xwzhang1/excel-util.git ...

  5. POI 导入带公式的EXCEL 精度出问题

    用POI读EXCEL时,一定要用支持POI的函数.... poi只对excle中部分函数支持. 1.支持的函数: [ABS, ACOS, ACOSH, ADDRESS, AND, ASIN, ASIN ...

  6. easyexcel 动态列_easyexcel动态表头列导出SequenceDiagram 阅读源码事半功倍

    EasyExcel简介 Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢 ...

  7. 【飞秋】ASP.NET 之 常用类、方法的超级总结,并包含动态的EXCEL导入导出功能,奉上类库源码

    最近闲了,花点几天时间将项目中常用的一些类.方法做了一下总结,希望对大家有用. 实用类:UtilityClass 包含如下方法 判断对象是否为空或NULL,如果是空或NULL返回true,否则返回fa ...

  8. Easy poi导出科学计数法问题

    现象描述: easy poi导出有时候会导致excel表格中的数字过长变成科学计数法: 2.解决方式: 其实原因很简单,是因为导出的集合中有double类型或者int类型的数据,只要将其中的doubl ...

  9. POI实现Excel导入和导出(源码测试)

    简介: Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 注意: 1.HSSFworkbook对象导 ...

最新文章

  1. Shell的作用与分类
  2. Spring Cloud Config采用Git存储时两种常用的配置策略
  3. js中的几种跨域方法
  4. [密码学] 公钥密码基础与RSA
  5. PHP生成各种验证码和Ajax验证
  6. 跟本菜菜一起去体验Microsoft Windows Server Code Name Longhorn Server Core
  7. 用 Visual Studio Code 在 macOS 上创建首个 ASP.NET Core 应用程序
  8. Spring模块介绍
  9. 打造扛得住的MySQL数据库架构-第2章 什么影响了MySQL性能
  10. NPOI导出Excel示例
  11. 编程语言对比 字符串
  12. Mac Python IDLE中如何更改字体
  13. el-table对于超出长度限制的文本的处理(vue-cli)
  14. VMware虚拟机安装xp系统
  15. QSIP驱动W25Q256调试记录
  16. 阿里云搭建WordPress系统
  17. php webshell 过狗
  18. 解决 CodeLite 中文乱码的问题,并支持C++11特性
  19. TcaplusDB君 · 行业新闻汇编(一)
  20. WordPress绑定多个域名和禁止搜索引擎收录非主域名的方法

热门文章

  1. 如何修改 gitlab 的项目名称
  2. 统计系统技术方案-clickhouse
  3. STC单片机程序下载 STC-ISP软件 和 普中ISP软件 介绍以及使用,图文解释
  4. 【四足机器人那些事】足端轨迹规划(一)
  5. 德莱联盟 计算几何 线段相交
  6. 限制性立方样条(Restricted Cubic Spline)
  7. 有备无患——数据中心基础设施备品备件管理
  8. 80%中国男人不敢主动和女人搭讪
  9. 21. 查询表sc——查询平均成绩大于等于90分的学生学号和平均成绩
  10. 计算机毕业设计Java-超市会员积分管理系统-(源码+系统+mysql数据库+lw文档)