从零玩转EasyPoi-cong-ling-wan-zhuan-easypoi
title: 从零玩转EasyPoi
date: 2023-01-11 13:49:25.908
updated: 2023-03-30 13:23:20.817
url: https://www.yby6.com/archives/cong-ling-wan-zhuan-easypoi
categories:
tags:
EasyPoi Excel和 Word简易工具类
easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员
就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板
语言(熟悉的表达式语法),完成以前复杂的写法
基础示例
测试项目: http://git.oschina.net/lemur/easypoi-test
EasyPoi的主要特点
1.设计精巧,使用简单
2.接口丰富,扩展简单
3.默认值多,write less do more
4.AbstractView 支持,web导出可以简单明了
什么场景该用哪个方法
- 导出
1.正规excel导出 (格式简单,数据量可以,5W以内吧)
注解方式: ExcelExportUtil.exportExcel(ExportParams entity, Class<?> pojoClass,Collection<?> dataSet)
2.不定多少列,但是格式依然简单数据库不大
自定义方式: ExcelExportUtil.exportExcel(ExportParams entity, List<ExcelExportEntity> entityList,Collection<?> dataSet)
3.数据量大超过5W,还在100W以内
注解方式 ExcelExportUtil.exportBigExcel(ExportParams entity, Class<?> pojoClass,IExcelExportServer server, Object queryParams)
自定义方式: ExcelExportUtil.exportBigExcel(ExportParams entity, List<ExcelExportEntity> excelParams,IExcelExportServer server, Object queryParams)
4.样式复杂,数据量尽量别大
模板导出 ExcelExportUtil.exportExcel(TemplateExportParams params, Map<String, Object> map)
5.一次导出多个风格不一致的sheet
模板导出 ExcelExportUtil.exportExcel(Map<Integer, Map<String, Object>> map,TemplateExportParams params)
6.一个模板但是要导出非常多份
模板导出 ExcelExportUtil.exportExcelClone(Map<Integer, List<Map<String, Object>>> map,TemplateExportParams params)
7.模板无法满足你的自定义,试试html
自己构造html,然后我给你转成excel ExcelXorHtmlUtil.htmlToExcel(String html, ExcelType type)
8.数据量过百万级了.放弃excel吧,csv导出
注解方式: CsvExportUtil.exportCsv(CsvExportParams params, Class<?> pojoClass, OutputStream outputStream)
自定义方式: CsvExportUtil.exportCsv(CsvExportParams params, List<ExcelExportEntity> entityList, OutputStream outputStream)
9.word导出
模板导出: WordExportUtil.exportWord07(String url, Map<String, Object> map)
10.PDF导出
模板导出: TODO
- 导入
如果想提高性能 ImportParams 的concurrentTask 可以帮助并发导入,仅单行,最小1000
excel有单个的那种特殊读取,readSingleCell 参数可以支持
1. 不需要检验,数据量不大(5W以内)
注解或者MAP: ExcelImportUtil.importExcel(File file, Class<?> pojoClass, ImportParams params)
2. 需要导入,数据量不大
注解或者MAP: ExcelImportUtil.importExcelMore(InputStream inputstream, Class<?> pojoClass, ImportParams params)
3. 数据量大了,或者你有特别多的导入操作,内存比较少,仅支持单行
SAX方式 ExcelImportUtil.importExcelBySax(InputStream inputstream, Class<?> pojoClass, ImportParams params, IReadHandler handler)
4. 数据量超过EXCEL限制,CSV读取
小数据量: CsvImportUtil.importCsv(InputStream inputstream, Class<?> pojoClass,CsvImportParams params)
大数据量: CsvImportUtil.importCsv(InputStream inputstream, Class<?> pojoClass,CsvImportParams params, IReadHandler readHandler)
关于Excel导出XLS和XLSX区别
1.导出时间XLS比XLSX快2-3倍
2.导出大小XLS是XLSX的2-3倍或者更多
3.导出需要综合网速和本地速度做考虑^~^
几个工程的说明
1.easypoi 父包--作用大家都懂得
2.easypoi-annotation 基础注解包,作用与实体对象上,拆分后方便maven多工程的依赖管理
3.easypoi-base 导入导出的工具包,可以完成Excel导出,导入,Word的导出,Excel的导出功能
4.easypoi-web 耦合了spring-mvc 基于AbstractView,极大的简化spring-mvc下的导出功能
5.sax 导入使用xercesImpl这个包(这个包可能造成奇怪的问题哈),word导出使用poi-scratchpad,都作为可选包了
EasyPoi 模板 表达式支持
- 空格分割
- 三目运算 {{test ? obj:obj2}}
- n: 表示 这个cell是数值类型 {{n:}}
- le: 代表长度{{le:()}} 在if/else 运用{{le:() > 8 ? obj1 : obj2}}
- fd: 格式化时间 {{fd:(obj;yyyy-MM-dd)}}
- fn: 格式化数字 {{fn:(obj;###.00)}}
- fe: 遍历数据,创建row
- !fe: 遍历数据不创建row
- $fe: 下移插入,把当前行,下面的行全部下移.size()行,然后插入
- !if: 删除当前列 {{!if:(test)}}
- 单引号表示常量值 '' 比如'1' 那么输出的就是 1
- &NULL& 控制
- ]] 换行符
EasyPoi导出实例
1.注解,导入导出都是基于注解的,实体上做上注解,标示导出对象,同时可以做一些操作
@ExcelTarget("courseEntity")
public class CourseEntity implements java.io.Serializable {
/** 主键 */
private String id;
/** 课程名称 */
@Excel(name = "课程名称", orderNum = "1", needMerge = true)
private String name;
/** 老师主键 */
@ExcelEntity(id = "yuwen")
@ExcelVerify()
private TeacherEntity teacher;
/** 老师主键 */
@ExcelEntity(id = "shuxue")
private TeacherEntity shuxueteacher;
@ExcelCollection(name = "选课学生", orderNum = "4")
private List<StudentEntity> students;
2.基础导出
传入导出参数,导出对象,以及对象列表即可完成导出
HSSFWorkbook workbook = ExcelExportUtil.exportExcel(new ExportParams(
"2412312", "测试", "测试"), CourseEntity.class, list);
3.基础导出,带有索引
在到处参数设置一个值,就可以在导出列增加索引
ExportParams params = new ExportParams("2412312", "测试", "测试");
params.setAddIndex(true);
HSSFWorkbook workbook = ExcelExportUtil.exportExcel(params,
TeacherEntity.class, telist);
4.导出Map
创建类似注解的集合,即可完成Map的导出,略有麻烦
List<ExcelExportEntity> entity = new ArrayList<ExcelExportEntity>();
entity.add(new ExcelExportEntity("姓名", "name"));
entity.add(new ExcelExportEntity("性别", "sex"));
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
Map<String, String> map;
for (int i = 0; i < 10; i++) {
map = new HashMap<String, String>();
map.put("name", "1" + i);
map.put("sex", "2" + i);
list.add(map);
}
HSSFWorkbook workbook = ExcelExportUtil.exportExcel(new ExportParams(
"测试", "测试"), entity, list);
5.模板导出
根据模板配置,完成对应导出
TemplateExportParams params = new TemplateExportParams();
params.setHeadingRows(2);
params.setHeadingStartRow(2);
Map<String,Object> map = new HashMap<String, Object>();
map.put("year", "2013");
map.put("sunCourses", list.size());
Map<String,Object> obj = new HashMap<String, Object>();
map.put("obj", obj);
obj.put("name", list.size());
params.setTemplateUrl("org/jeecgframework/poi/excel/doc/exportTemp.xls");
Workbook book = ExcelExportUtil.exportExcel(params, CourseEntity.class, list,
map);
6.导入
设置导入参数,传入文件或者流,即可获得相应的list
ImportParams params = new ImportParams();
params.setTitleRows(2);
params.setHeadRows(2);
//params.setSheetNum(9);
params.setNeedSave(true);
long start = new Date().getTime();
List<CourseEntity> list = ExcelImportUtil.importExcel(new File(
"d:/tt.xls"), CourseEntity.class, params);
7.和spring mvc的无缝融合
简单几句话,Excel导出搞定
@RequestMapping(params = "exportXls")
public String exportXls(CourseEntity course,HttpServletRequest request,HttpServletResponse response
, DataGrid dataGrid,ModelMap map) {
CriteriaQuery cq = new CriteriaQuery(CourseEntity.class, dataGrid);
org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, course, request.getParameterMap());
List<CourseEntity> courses = this.courseService.getListByCriteriaQuery(cq,false);
map.put(NormalExcelConstants.FILE_NAME,"用户信息");
map.put(NormalExcelConstants.CLASS,CourseEntity.class);
map.put(NormalExcelConstants.PARAMS,new ExportParams("课程列表", "导出人:Jeecg",
"导出信息"));
map.put(NormalExcelConstants.DATA_LIST,courses);
return NormalExcelConstants.JEECG_EXCEL_VIEW;
}
8.Excel导入校验,过滤不符合规则的数据,追加错误信息到Excel,提供常用的校验规则,已经通用的校验接口
@Excel(name = "Email", width = 25)
@Max(value = 15,message = "max 最大值不能超过15")
private int email;
/**
* 手机号
*/
@Excel(name = "Mobile", width = 20)
@NotNull
private String mobile;
ExcelImportResult<ExcelVerifyEntity> result = ExcelImportUtil.importExcelVerify(new File(
"d:/tt.xls"), ExcelVerifyEntity.class, params);
for (int i = 0; i < result.getList().size(); i++) {
System.out.println(ReflectionToStringBuilder.toString(result.getList().get(i)));
}
9.导入Map
设置导入参数,传入文件或者流,即可获得相应的list,自定义Key,需要实现IExcelDataHandler接口
ImportParams params = new ImportParams();
List<Map<String,Object>> list = ExcelImportUtil.importExcel(new File(
"d:/tt.xls"), Map.class, params);
10.大数据量Excel导出
exportBigExcel 的方法 ,最后可以关闭closeExportBigExcel 也可以不关闭
11.如果View不起作用,已经发现被其他View处理掉的情况,使用下面这个,进行了统一封装,相同的效果
PoiBaseView
public static void render(Map<String, Object> model, HttpServletRequest request,
HttpServletResponse response, String viewName) {
PoiBaseView view = null;
if (BigExcelConstants.BIG_EXCEL_VIEW.equals(viewName)) {
view = new BigExcelExportView();
} else if (MapExcelConstants.JEECG_MAP_EXCEL_VIEW.equals(viewName)) {
view = new JeecgMapExcelView();
} else if (NormalExcelConstants.JEECG_EXCEL_VIEW.equals(viewName)) {
view = new JeecgSingleExcelView();
} else if (TemplateExcelConstants.JEECG_TEMPLATE_EXCEL_VIEW.equals(viewName)) {
view = new JeecgTemplateExcelView();
} else if (MapExcelGraphConstants.MAP_GRAPH_EXCEL_VIEW.equals(viewName)) {
view = new MapGraphExcelView();
}
try {
view.renderMergedOutputModel(model, request, response);
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
}
}
// Demo
@RequestMapping(params = "exportXls")
public void exportXls(CourseEntity course,HttpServletRequest request,HttpServletResponse response
, DataGrid dataGrid,ModelMap map) {
CriteriaQuery cq = new CriteriaQuery(CourseEntity.class, dataGrid);
org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, course, request.getParameterMap());
List<CourseEntity> courses = this.courseService.getListByCriteriaQuery(cq,false);
map.put(NormalExcelConstants.FILE_NAME,"用户信息");
map.put(NormalExcelConstants.CLASS,CourseEntity.class);
map.put(NormalExcelConstants.PARAMS,new ExportParams("课程列表", "导出人:Jeecg",
"导出信息"));
map.put(NormalExcelConstants.DATA_LIST,courses);
PoiBaseView.render(map,request,response,NormalExcelConstants.JEECG_EXCEL_VIEW);
}
从零玩转EasyPoi-cong-ling-wan-zhuan-easypoi的更多相关文章
- 《从零玩转JavaWeb+项目实战》-系列课堂录制计划
点击试听课程 前言 很多自学编程的同学经常和我说想学一门语言自己到网上找一些教程看到一半就像背单词背到ambulance一样坚持不下去了....究其原因基本上都是:内容太多,太枯燥,专业术语听不懂,学 ...
- 从零玩转第三方登录之QQ登录
从零玩转第三方登录之QQ登录 前言 在真正开始对接之前,我们先来聊一聊后台的方案设计.既然是对接第三方登录,那就免不了如何将用户信息保存.首先需要明确一点的是,用户在第三方登录成功之后, 我们能拿到的 ...
- 从零玩转SpringSecurity+JWT整合前后端分离
从零玩转SpringSecurity+JWT整合前后端分离 2021年4月9日 · 预计阅读时间: 50 分钟 一.什么是Jwt? Json web token (JWT), 是为了在网络应用环境间传 ...
- 从零玩转人脸识别之RGB人脸活体检测
从零玩转RGB人脸活体检测 前言 本期教程人脸识别第三方平台为虹软科技,本文章讲解的是人脸识别RGB活体追踪技术,免费的功能很多可以自行搭配,希望在你看完本章课程有所收获. ArcFace 离线SDK ...
- 《从零玩转python+人工智能-3》网易云课堂王顺子
#1.145——152节课25章——面向对象三大特性小案例 class Animal: def __init__(self,name,age=1): self.name = name self.age ...
- 02-从零玩转JavaWeb-类与对象
配套视频:对象与类 一.什么是对象 包含特性和行为的一个实体 下图当中,"颜色"和"体重"属于"特性或叫状态" "咬人&quo ...
- 01-从零玩转JavaWeb-面向过程与面向对象
配套视频讲解:面向过程面向对象 一.面向过程 所有事情都按顺序一件一件来执行. 二.面向对象 面向对象是将功能通过对象也实现,将功能封装进对象之中 让对象去实现具体的细节 三.面向对象的目的 ...
- 03-从零玩转JavaWeb-创建类与对象
创建类创建对象 一.什么是成员变量 对象的一些状态特征使用成员变量表示 二.行为什么什么表示 对象的 行为 使用 方法 表示 三.如何创建对象 class 类名{0 ~ N个成员变量0 ~ N ...
- 04-从零玩转JavaWeb-JVM内存详情分析
JVM内存划分栈与栈帧 JVM将内存主要划分为: 方法区 虚拟机栈 本地方法栈 堆 程序计数器 一.方法区:存放字节码,常量 ,静态变量,是一个共享的区域 二.虚拟机栈:执行方法其实就是栈帧入栈,出栈 ...
- 05-从零玩转JavaWeb-彻底搞懂值传递
一.数据类型分类 基本数据类型: 只有一块存储空间, 在栈中,存放的是具体的值 引用数据类型: 引用数据类型有两块存储空间 一个在栈(Stack)中,一个在堆(heap) ...
随机推荐
- (数据科学学习手札154)geopandas 0.14版本新特性一览
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,就在前两天,Python生态中 ...
- Java 21 新特性:switch的模式匹配
在之前的Java 17新特性中,我们介绍过关于JEP 406: switch的模式匹配,但当时还只是关于此内容的首个预览版本.之后在JDK 18.JDK 19.JDK 20中又都进行了更新和完善.如今 ...
- SQL函数Intersect,except整理
1. 集合函数使用的规则 ① 每个集合要求列数量相同,列顺序相同. ② 每个集合显示的列,要求数据类型一致或者可隐式转换成同一数据类型 ③ 最终集合列名称与第一个集合的列名称一致 2. ...
- Vue2系列(lqz)——slot插槽 (内容分发)、2 transition过渡、3 生命周期、4 swiper学习、5 自定义组件的封装、6 自定义指令、7 过滤器
文章目录 1 slot插槽 (内容分发) 1.1 基本使用 1.2 插槽应用场景1 1.3 插槽应用场景2 1.4 具名插槽 2 transition过渡 3 生命周期 4 swiper学习 5 自定 ...
- 编译python为可执行文件遇到的问题:使用python-oracledb连接oracle数据库时出现错误:DPY-3010
错误原文: DPY-3010: connections to this database server version are not supported by python-oracledb in ...
- chatgpt 非常不稳定
写一个飞机大战游戏 很抱歉,作为一名语言模型,我没有具体的编程功能,无法直接为您编写一个飞机大战游戏.不过,我可以为您提供一些创建飞机大战游戏的一般步骤和建议. 设计游戏元素 首先,您 ...
- 若依vue分离版(ruoyi-vue)跳过token验证,设置白名单
找到SecurityConfig类的configure方法 如图所示 在设置白名单后还需要把接口上的权限标识符去掉.然后需要重启一下项目,热加载不行,会报错.
- CSS 还原拉斯维加斯球数字动画
我的小册 <CSS 技术揭秘与实战通关>上线了,想了解更多有趣.进阶.系统化的 CSS 内容,可以猛击 - LINK. 最近大家刷抖音,是否有刷到拉斯维加斯的新地标 「Sphere」: 场 ...
- 快速展示原型之Minimal API开发
Minimal API官网地址: https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/minimal-apis/security?vi ...
- k8s zookeeper安装(集群版与非集群版)
集群版zookeeper安装 第一步:添加helm镜像源 helm repo add incubator http://storage.googleapis.com/kubernetes-charts ...