EasyPoi教程.docx
《EasyPoi教程.docx》由会员分享,可在线阅读,更多相关《EasyPoi教程.docx(26页珍藏版)》请在冰豆网上搜索。
![EasyPoi教程.docx](https://file1.bdocx.com/fileroot1/2022-12/1/402c5552-4bfa-47be-9f60-ca5176771e60/402c5552-4bfa-47be-9f60-ca5176771e601.gif)
EasyPoi教程
简要教程
修改记录
日期
版本
作者
修订类型
描述
2016-1-20
1.0
JueYue
新建
2016-1-22
1.1
JueYue
修改
导入校验,文件合法性校验
前面的话
EasyPoi的编写其实是一次意外,之前我不太愿意写导入导出,因为代码号复杂,每次一个Excel都要写几百行,仅有少量的复用,一次需要写许多的导入导出,又没有人手,正好看到了Jeecg对应Poi的一个封装,但是他的封装比较简单,就自己在他思想的基础上开始构建现在的项目了.
EasyPoi秉承思想就是尽量简单,入库少,可以很快把简单的工作干了这是第一个版本的功能,后来慢慢用的人多了,也就功能慢慢丰富了,现在包含了Excel的导入导出,Word的导出,PDF的导出,ExcelCharts的导出,Html的导出5个功能模块,重点还是Excel,毕竟Excel是最常用的.
EasyPoi已经走过了3年,未来也会继续走,保持现有简单的功能继续前进.
程序员你懂得,懒得测试,目前测试覆盖率,基本功能我都写了,没有的就遇到了再说吧
第一章Excel篇
Excel的注解
本来注解是整个模块的精髓,不过随着模板的使用,他的重要性也就不如以前了,不过还是最简单的使用方式.注解都是在easypoi-annotation这个jar,拆分开的目的就是为了让多模块的maven项目少引用,因为easypoi-annotation是没有任何依赖的,只是单纯的注解
@ExcelExcel导出基本注释
这个注解是整个的基石,简单项目只靠这一个注解就可以完成所有功能
限定符和类型
可选元素和说明
java.lang.String
databaseFormat
导出时间设置,如果字段是Date类型则不需要设置数据库如果是string类型,这个需要设置这个数据库格式
java.lang.String
exportFormat
导出的时间格式,以这个是否为空来判断是否需要格式化日期
java.lang.String
format
时间格式,相当于同时设置了exportFormat和importFormat
double
height
导出时在excel中每个列的高度单位为字符,一个汉字=2个字符
int
imageType
导出类型1从file读取2是从数据库中读取默认是文件同样导入也是一样的
java.lang.String
importFormat
导入的时间格式,以这个是否为空来判断是否需要格式化日期
boolean
isHyperlink
这个是不是超链接,如果是需要实现接口返回对象
java.lang.String
isImportField
导入时会校验这个字段,看看这个字段是不是导入的Excel中有,如果没有说明是错误的Excel本意是想用true的,想想还是false比较好可以使用a_id,b_id来确实是否使用
boolean
isStatistics
是否自动统计数据,如果是统计,true的话在最后追加一行统计,把所有数据都和这个处理会吞没异常,请注意这一点
boolean
isWrap
是否换行即支持\n
int[]
mergeRely
合并单元格依赖关系,比如第二列合并是基于第一列则{1}就可以了
boolean
mergeVertical
纵向合并内容相同的单元格
boolean
needMerge
是否需要纵向合并单元格(用于含有list中,单个的单元格,合并list创建的多个row)
java.lang.String
orderNum
展示到第几个可以使用a_id,b_id来确定不同排序
java.lang.String[]
replace
值得替换导出是{a_id,b_id}导入反过来,所以只用写一个
java.lang.String
savePath
导入路径,如果是图片可以填写,默认是upload/className/IconEntity这个类对应的就是upload/Icon/
java.lang.String
suffix
文字后缀,如%90变成90%
int
type
导出类型1是文本2是图片,3是函数默认是文本
double
width
导出时在excel中每个列的宽单位为字符,一个汉字=2个字符如以列名列内容中较合适的长度例如姓名列6【姓名一般三个字】性别列4【男女占1,但是列标题两个汉字】限制1-255
这当中需要说明的是:
mergeVertical和mergeRely这两者是一起存在的功能,就是纵向合并单元和,mergeRely是判断和前面单元格的依赖,可用于多种集合,不太好导出情况,来合并处理
DEMO:
最简单的导出
复杂点的导出:
@ExcelTarget标记导入ID
就一个功能标记ID,用以区别多个导出对象,便于一个对象用于多个导出实例
java.lang.String
value
定义excel导出ID来限定导出字段
DEMO
使用方法
@ExcelEntity用来标示导出对象
因为对象不是基础属性,需要继续判断,所以加入这个属性,这个属性可以无限迭代,
ID和ExcelTarget的ID功能一致
java.lang.String
id
定义excel导出ID来限定导出字段,处理一个类对应多个不同名称的情况
java.lang.String
name
导出时,对应数据库的字段主要是用户区分每个字段,不能有annocation重名的导出时的列名导出排序跟定义了annotation的字段的顺序有关可以使用a_id,b_id来确实是否使用
@ExcelCollection标示集合
集合只能一层,如果name有值,表头就会有两行,有过没值就会只有一行
java.lang.String
id
定义excel导出ID来限定导出字段,处理一个类对应多个不同名称的情况
java.lang.String
orderNum
展示到第几个同样可以使用a_id,b_id
java.lang.Class
>
type
创建时创建的类型默认值是arrayList
DEMO
@ExcelIgnore忽略字段
标记为excel创建实体忽略,放置死循环的造成
注解基本上就到这来完了,主要还是各个注解直接的搭配使用,核心还是在于@Excel,主要的功能也是在这个地方,请大家开发之前先看看这个吧
Excel导出
导出统一入口ExcelExportUtil
excel,导入导出,模板导出的基础参数,数据处理的接口
private IExcelDataHandler
dataHanlder
数据处理接口,以此为主,replace,format都在这后面
默认实现ExcelDataHandlerDefaultImpl,用户自定义的实现可以继承这个
当然你可以可以用spring来管理这个对象,都是一样的
ExportParams导出参数
注解导出和map导出的参数设置
privateboolean
addIndex
是否添加序列
privateshort
color
表头颜色
privatejava.lang.String[]
exclusions
过滤的属性
privateint
freezeCol
冰冻列
privateshort
headerColor
属性说明行的颜色例如:
HSSFColor.SKY_BLUE.index默认
privatejava.lang.String
indexName
是否添加需要需要
privateboolean
isAppendGraph
是否追加图形
privateboolean
isCreateHeadRows
是否创建表头
privateboolean
isDynamicData
是否动态获取数据
privatejava.lang.String
secondTitle
第二行名称
privateshort
secondTitleHeight
表格名称
privatejava.lang.String
sheetName
sheetName
privatejava.lang.Class
>
style
Excel导出style
privatejava.lang.String
title
表格名称
privateshort
titleHeight
表格名称
private ExcelType
type
Excel导出版本
对象注解导出
注解导出第一步先给对象加上注解,这个我就复述了,之后查出来对象列表,这个大家也都懂
就一个方法,大数据量推荐使用2007版本,效率高,生成文件小,
Class填的就是Collection中的对象
DEMO
Map的导出
有时候我们希望导出一个map集合或者我们导出的列表是不固定的,就需要这个导出了
和上面方法的区别就是上面的Classes变成了EntityList其实Classes最好也会翻译成EntityList,只是自动帮你翻译了,这个方法就是把控制器还给你了,但是这个就比较麻烦,提供4个构造器name就是列的名称,key对应就是map中的key或者属性的name,便于map的快速导出
这个也是基本上支持注解中的所有功能
ExcelExportEntity()
ExcelExportEntity(java.lang.String name)
ExcelExportEntity(java.lang.String name,java.lang.Object key)
ExcelExportEntity(java.lang.String name,java.lang.Object key,int width)
DEMO
一次导出多个对象
其实就是对第一个方法的一个封装,没有什么需要介绍的
定义样式
自定义Cell样式接口,方便大家自己处理Excel的样式
提供了三个实现,
ExcelExportStylerBorderImpl有边框样式
ExcelExportStylerColorImpl有边框间隔行样式
ExcelExportStylerDefaultImpl默认的样式
样式使用方法ExportParams中调用setStyler就可以了,必须实现有参构造器
publicExcelExportStylerBorderImpl(Workbookworkbook){
super.createStyles(workbook);
}
Excel模板导出
为了更好的导出Excel,以及Excel的样式定义,复杂的表头等功能对已代码设置的很复杂的情况下使用模板确实是更好的办法,下面这样的样式我们自己实现要实现好久,但是模板就比较容易实现了,Excel分分钟的事情,模板秉承的是继承你的Cell样式,尽量不破坏你的东西
模板支持的语法
1)空格分割
2)三目运算{{test?
obj:
obj2}}
3)n:
表示这个cell是数值类型{{n:
}}
⏹用来处理数字问题,防止上面有小叹号
4)le:
代表长度{{le:
()}}在if/else运用{{le:
()>8?
obj1:
obj2}}
5)fd:
格式化时间{{fd:
(obj;yyyy-MM-dd)}}
⏹使用java的时间格式化,进行格式化处理
6)fn:
格式化数字{{fn:
(obj;###.00)}}
⏹处理小数点问题
7)单引号表示常量值''比如'1'那么输出的就是1
8)fe:
遍历数据,创建row
9)!
fe:
遍历数据不创建row
10)$fe:
下移插入,把当前行,下面的行全部下移.size()行,然后插入
11)#fe:
行遍历
⏹其他都是列遍历,这个是横向遍历
12)!
if:
删除当前列{{!
if:
(test)}}
13)&NULL&控制
14)]]换行符
⏹解决多行遍历的问题,详情看下嘛的遍历标签
遍历标签的使用
语法就上面这些,前面7个都没啥需要讲的都是我们一样的语法,说下下面几个
8,9,10都是一样的就是for循环创建表格,不同的是fe是全部都创建自己的表格,!
fe是先使用现有的表格,不够了再创建表格,$fe是把这样之下的先往下移动X行,在便利,说下3个的场景
第一个不说了,是不是都要创建
第二个是:
比如我们就创建4行或者<4行,4行之后还有别的数据,那么我们就使用!
fe来迭代
生成后不会影响其他数据
第三个是:
当遍历行下面仍有数据时,不影响下面的数据,进行插入操作
输出结果
多行遍历
针对多行遍历问题,给出了]]作为换行符用来标记list还没执行完的问题,多行遍历解决了部分Excel处理难的问题
生产效果
对应测试类TemplateForEachTest2
横向遍历
效果
用来解决横向纵向双向遍历统计的问题
对应测试类ExcelExportTemplateColFeTest
SUM的设计思路
因为模板中的SUM具有位置和属性的双重不确定性,所以针对SUM的这种运算,打算使用记忆的方法来预先记录SUM的位置以及需要SUM的对象,等待遍历处理的时候后置处理了,也防止遍历后,再扫描整个界面来处理问题
SUM的位置可以在FE的上面也可以在FE的下面,也可以直接在FE中来直接SUM比如
在FE后
在FE中
在FE前
为了防止效率的浪费,回预先记录这个SUM的位置,用了有效处理整个SUM后期处理寻址的问题,在使用中SUM只能SUMlist遍历中的数据,不能SUM其他的数据,位置可以自己定义,没有要求
导出操作
提供两个方法,一个是都是模板,第二个是第一个封装,就是多个sheet的模板导出
我的使用方式,如果是样式复杂就是模板,样式简单就是代码导出的
Excel导入
注解导入
基于Excel注解导出,只要反过来看代码就可以了,基本上不用讲什么,导出支持的功能,基本上导入同样支持
Map导入
传入对象传入map就可以,返回Map这个Object请大家注意了不确定是什么不过都是基本类型
和上面的是同一个方法
Sax导入
支持的功能不如上面的丰富,不在会吃图片,紧支持基本类型,
对于大数据量导入请使用Sax,避免造成内存溢出
Excel数据校验
校验是集成的JSR303,可选hibernate或者Apache的实现,这个我就不讲了,请大家自行XX,
功能都是一样的,需要开启设置在ImportParams中
这是一个事前校验,一般是数据的合法性,针对数据唯一性什么的,可以使用接口校验
同时提供了导入校验的接口,是整个对象一起校验的,返回校验结果就可以,比较简单
比如
下面说下错误信息的处理
错误信息默认会追加到这一行最后创建一个Cell中去,就是你可以返回这个Excel给用户,再让他改,
同时,我们也希望存放到数据库中这是我们需要我们的Entity实现一个接口
这样我们会把错误信息追加到你的对象中用于保存到数据库中
同时,会返回校验Result对象,用于判断是不是有错误,集合,已经Excel
文件合法性校验
文件合法性校验,是校验我们的文件是不是我们给对方的模板,是否包含全了我们要求的列
这个校验是中断校验,发现校验失败后会爆出异常,异常枚举值
校验方法有两种,1.注解校验,2数组校验,推荐后者
1.注解校验
在注解中加入
DEMO:
2.数据值校验,
就是在导入参数中动态设置需要校验的对象比如:
如果是有集合也可以校验
同样抛出校验异常信息,终止导入流程
第二章Word篇
Word模板导出
因为POI的Word2003支持的很不好,我也就不进行支持了,现在只支持2007版本
支持值替换,图片替换,table等功能
基本功能是基于Excel模板导出功能的clone,实现了Excel模板中的大部分功能,语法也都是保持一致,目前不能嵌套table请注意
语法啥的就不讲了,说下不同的地方
提供一个专用的图片替换类,判断这个对象会把这个地方替换成图片
第三章PDF导出
Pdf导出
同样是基于Excel模块的功能扩展,目前只支持Excel注解导出和map导出,还没支持模板
提供了样式接口IPdfExportStyler,用于创建Cell时候的样式设置
方法也和Excel;类似,但是要提供流
第四章HTML导出
HTML导出
目前只支持Excel转为HTML,效果还算凑合,给用户看看可以,企业级还是需要专业的解决方案
导出返回两种界面,支持图片转换
toTableHtml只返回table对象
toAllHtml返回包含html的对象
导出代码,算是一个单独的工具类
第五章Excel图表
第六章Springweb集成
Springmvc的配置
使用springmvc需要在spring-mvc.xml或者其他的配置文件中进行配置,主要是
默认视图级别设置低点
Bean视图设置级别高一些,然后把我们的视图配置上,就完成了
2.0.8版本后加上了@Controller里面只要在
component-scanbase-package="org.jeecgframework.poi.excel.view">
加入就可以了,但是解析器还是要配置的
这样就算集成完成了,下面我们介绍各种VIEW
注解viewJeecgSingleExcelView
模板View的使用
第七章缓存以及工具类
缓存
缓存是基于guava来实现的
提供了excel模板读取缓存,Html缓存,word模板读取缓存,图片读取缓存
讲下自定义文件读取
IFileLoader提供文件读取接口,自己实现这个接口,比如
然后根据自己的需要可以把自己实现的类设置为全局的类,或者线程内使用的类
POICacheManager提供对应的方法
对象
缓存时间
最大缓存数量
Excel,Word
1小时
50
Html
7天
200个
Image
1天
200个
每个cache都提供了set方法,以便大家设置自己的实现
工具类
PoiReflectorUtil反射工具类,从mybatis上copy下来的
PoiMergeCellUtil纵向合并工具类合并内容相同的单元格
PoiCellUtil读取单元格值,判断合并情况