Comments (8)
en,是一个不错的场景。
你说的动态表头意思是标题上的数字会变对吧,从标题来看
如果你用的版本是 1.3.21
那么现在的做法也有很多种。
因为你要用javabean 去接这些单元格内容,所以不考虑后面还有 2023年...长度还不确定的情况,如果有这种情况,后续也可以做,这种情况就不能用javabean去接数据了。
基于版本1.3.21 可以有2种已经实现的做法。
实现一:
一种是固定index,给每一个字段都写死index,这样可以快速解决你现有的问题。
实现二:
上述截图中我讲了可以利用不重复的标题,利用相对位置来代替写死index的做法。
positionTitle="县(市)区、开发(度假)区"
再结合 offset=1
可以定位到 "2018年完成数_绝对值"
,这样可以绕开这个动态标题的问题
但基于之前的案例,我相信你更希望是类似于
"2018年完成数_绝对值"
, "2018年完成数_增速(%)"
的写法,对吧。但是问题是标题会变,不好通过注解的方式定位(我暂时的想法是通过允许你利用模糊标题,代替标题)。
title可以是 正则表达式,类似于:
@Data
@ExcelTableHeader(height = 2)
public class TempObj {
@ExcelTitleBind(title = ".*年完成数_绝对值")
private String w1_1;
@ExcelTitleBind(title = ".*年完成数_增速(%)")
private String w1_2;
@ExcelTitleBind(title = ".*年完成数_绝对值")
private String w2_1;
@ExcelTitleBind(title = ".*年完成数_增速(%)")
private String w2_2;
@ExcelTitleBind(title = ".*年完成数_绝对值")
private String w3_1;
@ExcelTitleBind(title = ".*年完成数_增速(%)")
private String w3_2;
@ExcelTitleBind(title = ".*年完成数_绝对值")
private String w4_1;
@ExcelTitleBind(title = ".*年完成数_增速(%)")
private String w4_2;
}
会在下一个版本1.3.22 中,当然暂时我也没想到更好的法子,暂时打算这么做,你如果有更好的想法的话,可以留言。
from excel-import-export.
二级表头也不一致
from excel-import-export.
1.3.22
支持了正则标题,可以模糊匹配
测试案例代码
正则模糊匹配标题
指定了sheetName 也就是第三个sheet中造了点数据进去
@Data
@ExcelTableHeader(height = 3, sheetName = "市属企业")
public class ImportRegularTitle {
@ExcelTitleBind(title = "市属企业")
private String w1;
@ExcelTitleBind(title = ".*年计划")
private String w2;
@ExcelTitleBind(title = ".*月完成情况")
private String w3;
@ExcelTitleBind(title = ".*年计划")
private String w4;
@ExcelTitleBind(title = ".*月$")
private String m1;
@ExcelTitleBind(title = ".*月$")
private String m2;
@ExcelTitleBind(title = ".*月$")
private String m3;
@ExcelTitleBind(title = ".*月$")
private String m4;
@ExcelTitleBind(title = ".*月$")
private String m5;
@ExcelTitleBind(title = ".*月$")
private String m6;
@ExcelTitleBind(title = ".*月$")
private String m7;
@ExcelTitleBind(title = ".*月$")
private String m8;
@ExcelTitleBind(title = ".*月$")
private String m9;
@ExcelTitleBind(title = ".*月$")
private String m10;
@ExcelTitleBind(title = ".*月$")
private String m11;
}
你截图中的对应的sheet是第一个sheet
因为字段太多,我只造了部分的字段和注解
@Data
@ExcelTableHeader(height = 4, sheetName = "县市区")
public class ImportRegularTitle_For_multiLevelTitle {
@ExcelTitleBind(title = "县(市)区、开发(度假)区")
private String A;
// 2018
@ExcelTitleBind(title = ".*年完成数$_绝对值")
private String B;
@ExcelTitleBind(title = ".*年完成数$_增速(%)")
private String C;
//2019
@ExcelTitleBind(title = ".*年完成数$_绝对值")
private String D;
@ExcelTitleBind(title = ".*年完成数$_增速(%)")
private String E;
//2020
@ExcelTitleBind(title = ".*年完成数$_绝对值")
private String F;
@ExcelTitleBind(title = ".*年完成数$_增速(%)")
private String G;
//2021
@ExcelTitleBind(title = ".*年完成数$_绝对值")
private String H;
@ExcelTitleBind(title = ".*年完成数$_增速(%)")
private String I;
@ExcelTitleBind(title = "各县市区人代会目标_绝对值")
private String J;
@ExcelTitleBind(title = "各县市区人代会目标_增速(%)")
private String K;
@ExcelTitleBind(title = ".*年预期目标$_绝对值")
private String L;
@ExcelTitleBind(title = ".*年预期目标$_增速(%)")
private String M;
@ExcelTitleBind(title = ".*年1-2月完成数$_绝对值")
private String N;
@ExcelTitleBind(title = ".*年1-2月完成数$_增速(%)")
private String O;
@ExcelTitleBind(title = ".*年1-2月完成数$_绝对值")
private String P;
@ExcelTitleBind(title = ".*年1-2月完成数$_增速(%)")
private String Q;
/**
* 2021年1-3月完成投资
*/
@ExcelTitleBind(title = ".*完成投资$_绝对值")
private String R;
@ExcelTitleBind(title = ".*完成投资$_增速(%)")
private String S;
@ExcelTitleBind(title = ".*完成投资$_单月完成数")
private String T;
@ExcelTitleBind(title = ".*完成投资$_进度(%)")
private String U;
/**
* 2021年1-4月完成投资
*/
@ExcelTitleBind(title = ".*完成投资$_绝对值")
private String V;
@ExcelTitleBind(title = ".*完成投资$_增速(%)")
private String W;
@ExcelTitleBind(title = ".*完成投资$_单月完成数")
private String X;
@ExcelTitleBind(title = ".*完成投资$_进度(%)")
private String Y;
}
提供的测试案例代码:
正则多级标题
为了方便对比数据,我将字段的命名和单元格列相同
测试得到的数据如下:
from excel-import-export.
二级表头也不一致
发布了版本1.3.22 还有看下,上面我最新的回复
from excel-import-export.
解决了部分问题 但也没全部解决
列表是从数据字典存储维护 每年会变
所以 每一列表头 是从数据库取值
是一个二维的概念 相当于 横向循环
横向循环 又分为 一级表头 二级表头
from excel-import-export.
你的意思是对应javabean是这样的对吗
class Temp {
// 2018
@ExcelTitleBind(title = "标题")
private String A;
@ExcelTitleBind(title = "绝对值")
private String B;
@ExcelTitleBind(title = "增速(%)")
private String C;
}
@Data
@ExcelTableHeader(height = 4, sheetName = "县市区")
public class ImportRegularTitle_For_multiLevelTitle {
List<Temp> list;
}
from excel-import-export.
解决了部分问题 但也没全部解决
列表是从数据字典存储维护 每年会变 所以 每一列表头 是从数据库取值
是一个二维的概念 相当于 横向循环 横向循环 又分为 一级表头 二级表头
从截图来讲,意思就是说,可以通过UI上的按钮 “添加年度完成数”来添加这里的一行数据,这样excel的列信息就会变化对吧。
如果是这样的话,通过注解的方式可能已经做不到了(你可以自己想想这个标题个数是动态的,你要加注解是根据标题而加的,如果标题都不存在,注解自然就不知道怎么加)。
简便的改法就是
我会暴漏一个方法出来,然后你需要自己查数据库,然后将这些信息处理成excel-import-export能够处理的标题信息,然后传进去,这样就可以解决这个问题。
之前的处理是通过注解传进去的,比较麻烦的是,你该用什么对象去接这个excel数据,
如果说用前面提到的 List 而Obj则是一类属性(关键是list长度是动态的)不好操作。
以前的做法是这样的,我不知道该怎么处理。
List<ImportRegularTitle> quarterList =
ExcelImportExportUtils.importExcel(new FileInputStream(areaQuarter), ImportRegularTitle.class, 2000);
如果换成下面的
ExcelImportExportUtils.importExcel(new FileInputStream(areaQuarter), 标题信息数据 2000);
那么返回给你一个jsonObject是可以的。
然后你自己可以通过JsonObject.parseObject( )尝试转换,这种是不依赖与注解的方式。
from excel-import-export.
http://doc.wupaas.com/docs/easypoi/easypoi-1c1rqdskq6nbs
通过模板解决了
from excel-import-export.
Related Issues (8)
- 导入Integer 类型转换异常 HOT 4
- 导入记录 识别到对象 对象都是空数据 HOT 23
- 建议加一个设置 无论什么异常 任然可以导入数据 HOT 5
- 希望能增加导入匹配数据字典 HOT 4
- 1.3.7 找不到 ExcelTitleBind HOT 3
- v1.3.15 将注解的包路径做一个调整
- escel文件中数据量比较多,有几十万条数据,然后容易OOM HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from excel-import-export.