轻松完成excel读写操作- 基于POI的框架BingExcel的使用(2)
在进行 类转换时候,系统默认注册了一些转换器,当然你也可以自定局部或者全局的转换器。下面进行具体使用说明
java类说明 对应的java实体类,其属性必须要有__@CellConfig__注解,此注解必须的值为index属性,起始值是0;如果你要限定实体类的某一个属性必须有值的话,可以这样定义:
- @CellConfig(index = 0,readRequired=true)
- private String a;
一旦你加上了 readRequired 这个属性,当你的excel对应属性不存在时候,就会抛出异常illegalValueException ;如果你想在属性不存在时候做一些其他业务逻辑,那你不应该加上 readRequired 这个属性,而是自己去定义一个这个属性的转换器(在后面会讲到转化器的定义)。
当然你也会有需求,比如我确实需要定义一个属性,他在excel中确实不存在。那么你可以把这个属性定义为transient 的:
- //与excel不对应的属性。
- private transient String test;
另外关键的操作类是 BingExcel ,这个类必须由 BingExcelBuilder 来构建(补充一点:因为不可能在转换中将一个百万级的数据直接转换到内存中list对象,这里也提供了 BingExcelEvent 来进行大数据的读取)
2. 自定义转化器
属性的转换是靠默认的转化器( FieldValueConverter )来进行的,默认的转换器包括数组,列表(List),枚举等。如下面例子:
员工表-salary.xlsx(可以从 这里下载),里面有个字段-部门,在java中是个枚举对象;另外里面还有一些日期字段(入职时间等),但是是用字符串形式存储的日期,这样自定义的转换器就不能去处理了。
- public class Salary {
- @CellConfig(index = 1)
- private String employNum;
- @CellConfig(index = 0)
- private String id;
- //默认的boolean类型只支持"TRUE", "FALSE"字符的转换,但是它自带了传参数的构造方法,具体可以参考源码,
- @CellConfig(index = 8)
- @BingConvertor(value = BooleanFieldConverter.class, strings = { "1","0" }, booleans = { false })
- private boolean allDay;
- @CellConfig(index=7)
- private Department department;//枚举类型
- @CellConfig(index = 13)
- @BingConvertor(DateTestConverter.class)
- // 自定义转换器
- private Date atypiaDate;
- @CellConfig(index = 14)
- private Date entryTime;//用默认的转换器
- // 与excel无对应关系的属性定义
- private transient String test;
- public String toString() {
- return MoreObjects.toStringHelper(this.getClass()).omitNullValues()
- .add("id", id).add("employNum", employNum)
- .add("allDay", allDay)
- .add("atypiaDate", atypiaDate)
- .add("department", department)
- .add("entryTime", entryTime).toString();
- }
- //省略了 getter与setter方法。
- }
部门枚举的定义:当然你可以把他定义到 Salary 中,作为一个内部类
- enum Department {
- develop, personnel, product;
- }
定义自己的日期转换器,可以通过实现 FieldValueConverter 或者继承 AbstractFieldConvertor
- public class DateTestConverter extends AbstractFieldConvertor {
- @Override
- public boolean canConvert(Class<?> clz) {
- return clz.equals(Date.class);
- }
- @Override
- public Object fromString(String cell, ConverterHandler converterHandler,Type type) {
- if (StringUtils.isBlank(cell)) {
- return null;
- }
- try {
- SimpleDateFormat format=new SimpleDateFormat("yyyy.MM.dd");
- Date date = format.parse(cell);
- return date;
- } catch (ParseException e) {
- throw new RuntimeException(e);
- }
- }
- }
然后,你就可以进行读入了:
- URL url = Salary.class.getResource("/salary.xlsx");
- File f = new File(url.toURI());
- BingExcel bing = BingExcelBuilder.toBuilder().builder();
- try {
- SheetVo<Salary> vo = bing.readFile(f, Salary.class, 1);
- System.out.println(vo.getSheetIndex());
- System.out.println(vo.getSheetName());
- List<Salary> objectList = vo.getObjectList();
- for (Salary salary : objectList) {
- System.out.println(salary);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
对于 BingExcel 类,它有多个方法:具体可以查相关api或者代码。
- /**
- * 读取所condition 对应 sheet表格,到SheetVo
- */
- <T> SheetVo<T> readFile(File file, ReaderCondition<T> condition) throws Exception ;
- /**
- * 读取所condition 对应 sheet表格,到list
- * @param file
- * @param conditions 每个表格对应的condition,注:对于返回的条数,取conditions中 endNum的最小值
- * @return sheetVo的list对象,如果没有符合conditions的结果,返回empetyList对象
- * @throws Exception
- */
- List<SheetVo> readFileToList(File file,ReaderCondition[] conditions) throws Exception ;
其中 ReaderCondition 提供了更为精细的读取控制。
更多内容可以关注:项目地址https://git.oschina.net/bingyulei007/bingExcel,也可以去项目页留言。提出宝贵的改进意见
轻松完成excel读写操作- 基于POI的框架BingExcel的使用(2)的更多相关文章
- 轻松完成excel读写操作- 基于POI的框架BingExcel的使用(1)
Bingexcel User Guide 使用maven进行项目开发目前项目的maven仓库是在github上,浏览地址为 https://github.com/bingyulei007/mvn-re ...
- Java学习---Excel读写操作
1.1.1. 简介 Apache POI 使用Apache POI 完成Excel读写操作 Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API ...
- NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))
NX二次开发API里没有对EXCAL读写操作的相关函数,市面上有很多种方法去实现,比如UFUN调KF,ODBC,OLE(COM组件)等等.这里我是用的OLE(COM组件)方式去做的,这种在VC上创建的 ...
- NX二次开发-基于NX开发向导模板的NX对Excel读写操作(OLE方式(COM组件))
在看这个博客前,请读者先去完整看完:NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))https://ufun-nxopen.blog.csdn.net/article ...
- JXL.jar简单封装Excel读写操作
1.分析 一个excel文件能够有多页,每页excel中能够有多行,每行中能够有多列.用面向对象的思想能够把一行中的某列看作是一个String对象,一行看作是一个包括多个列的对象.一页是包括多行的对面 ...
- java实现Excel定制导出(基于POI的工具类)
我的需求: 项目中有一些工程表格需要导出,设计到行列合并,定制样式,原有工具类冗余,内聚性强.所以想写一个可以随意定制excel的工具类,工具类满足需求: 对于常用的工程表格有模板格式,可以任意插拔. ...
- 【Python】excel读写操作 xlrd & xlwt
xlrd ■ xlrd xlrd模块用于读取excel文件内容 基本用法: workbook = xlrd.open_workbook('文件路径') workbook.sheet_names() # ...
- Excel 读写操作
读 import xlrd from xlrd.book import Book from xlrd.sheet import Sheet from xlrd.sheet import Cell wo ...
- 78、excel的读写操作
本篇主要是用python来自动生成excel数据文件也就是简单的excel读写操作.python读写excel文件主要是第三方模块库xlrd.xlwt. 本篇导航: 写excel 读excel 一.写 ...
随机推荐
- 黑马MySQL数据库学习day01 MySQL8和MySQL5.5暴力破解密码
- Qt 学习之路 2(3):Hello, world!
豆子 2012年8月22日 Qt 学习之路 2 107条评论 想要学习 Qt 开发,首先要搭建 Qt 开发环境.好在现在搭建 Qt 开发环境还是比较简单的.我们可以到 Qt 官方网站找到最新版 ...
- HashMap的容量大小增长原理(JDK1.6/1.7/1.8)
. 前言 HashMap的容量大小会根据其存储数据的数量多少而自动扩充,即当HashMap存储数据的数量到达一个阈值(threshold)时,再往里面增加数据,便可能会扩充HashMap的容量. 可能 ...
- window 系统 修改服务器远程登录端口
window 系统 [ 默认3389远程端口 ] 快捷键:Ctrl+R 然后输入“regedit”,打开注册表 或者 单击左下角[开始]——[运行],然后在输入框输入 regedit,点击确定,打开 ...
- 页面布局常用,让子级div排排坐
画页面的时候经常遇到页面布局的问题,父级div包裹多个子div很常见,代码如下: <div> <div style='width:100px;height: 100px;backgr ...
- Java的JsonHelper
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson --> <dependency> <g ...
- setlocal 本地变量详解
命令 setlocal (开启本地变量) endlocal (结束本地变量) 很多新手不理解这句话是什么意思,在批处理中有什么作用. 其实在批处理中 setlocal 作用很大,配合 endloca ...
- ADO执行事务
在工作中遇到,需要批量提交的.在sql2008以后有表变量定义,可以实现.但个人比较习惯用C#,就有下面代码,直接上代码... using (SqlConnection conn = new SqlC ...
- idea进行断点快捷键
快捷键 功能描述 F8 单步调试,不进入函数内部 F7 单步调试,进入函数内部 Shift+F7 选择要进入的函数 Shift+F8 跳出函数 Alt+F9 运行到断点 Alt+F8 执行表达式查看结 ...
- 2019.03.22 读书笔记 var object dynamic
var:语法糖,在编译时推断出类型,根据反编译可以看出.实际用处是增加代码的健壮性,比如 linq ,匿名对象等. object:很多人容易和var混淆,其实概念上完全不同,没什么可比性. dynam ...