从零玩转EasyPoi-cong-ling-wan-zhuan-easypoi
Posted 杨不易呀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零玩转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);
带你从零玩转云服务器
前言
- 经过近十多年的蓬勃发展,云服务器已经成为互联网行业中的基础设施(像生活中电一样);掐指一算自己已然玩了七年的云服务器;
- 本篇博文将带大家玩转京东云服务器
如何玩转云?
玩转Docker
Docker架构图
环境
- 京东云主机 2核4G 1M带宽 独享100%CPU
- Xshell5
- Docker 19.03
安装步骤
- 查看操作系统类型(本人以Centos7为例,其他版本略有不同)
cat /etc/redhat-release
- 安装gcc环境
yum -y install gcc
yum -y install gcc-c++
- 若安装过老版本Docker则卸载,若未安装忽略本步
yum -y remove docker docker-common docker-selinux docker-engine
- 安装Docker依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
- 设置镜像仓库地址为京东云(DockerHub在国外太慢)
yum-config-manager --add-repo http://myregistry-cn-north-1.jcr.service.jdcloud.com/myrepo
- 更新yum软件包索引
yum makecache fast
- 安装Docker CE(CE版本已够一般用户使用)
yum -y install docker-ce
- 启动Docker
systemctl start docker
- 查看Docker版本
docker version
优化Docker—配置镜像加速器
-
在京东云 创建容器镜像
-
建立目录
mkdir -p /etc/docker
- 设置镜像加速器(其中地址为本人在京东云申请的镜像加速器地址)
tee /etc/docker/daemon.json <<-'EOF'
"registry-mirrors": ["https://xxx.jdcloud-registry-cn-north-1.jcr.service.jdcloud.com"]
EOF
- 重启Docker生效
systemctl daemon-reload
systemctl restart docker
玩转Kubernetes
Kubernetes架构图
基本环境
- 京东云主机 2核4G 1M带宽 独享100%CPU
- Etcd 版本3.4.14
- Docker
- k8s版本 1.17.16
kube-apiserver服务安装
- 下载并解压
cd /soft
wget https://dl.k8s.io/v1.20.0/kubernetes-server-linux-amd64.tar.gz
tar -zxvf kubernetes-server-linux-amd64.tar.gz
cd kubernetes
- 创建启动配置文件
mkdir /soft/kubernetes/server/conf/
vim /soft/kubernetes/server/conf/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--port=8886"
KUBE_ETCD_SERVERS="--etcd-servers=http://10.9.0.46:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=169.169.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,LimitRanger,SecurityContextDeny,ResourceQuota"
KUBE_API_LOG="--logtostderr=false --log-dir=/home/k8s-t/log/kubernets --v=2"
KUBE_API_ARGS=" "
- 修改配置文件
vim /etc/systemd/system/kube-apiserver.service
[Unit]
Description=Kubernetes API Server
After=etcd.service
Wants=etcd.service
[Service]
EnvironmentFile=/soft/kubernetes/server/conf/apiserver
ExecStart=/soft/kubernetes/server/bin/kube-apiserver \\
$KUBE_ETCD_SERVERS \\
$KUBE_API_ADDRESS \\
$KUBE_API_PORT \\
$KUBE_SERVICE_ADDRESSES \\
$KUBE_ADMISSION_CONTROL \\
$KUBE_API_LOG \\
$KUBE_API_ARGS
Restart=on-failure
Type=notify
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
- kube-controller-manger服务安装
- 创建启动配置文件
vim /soft/kubernetes/server/conf/controller-manager
KUBE_MASTER="--master=http://10.9.0.46:8886"
KUBE_CONTROLLER_MANAGER_ARGS=" "
- 修改配置文件
vim /etc/systemd/system/kube-controller-manager.service
[Unit]
Description=Kubernetes Scheduler
After=kube-apiserver.service
Requires=kube-apiserver.service
[Service]
EnvironmentFile=-/soft/kubernetes/server/conf/controller-manager
ExecStart=/soft/kubernetes/server/bin/kube-controller-manager \\
$KUBE_MASTER \\
$KUBE_CONTROLLER_MANAGER_ARGS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
- kube-scheduler服务安装
- 创建启动配置文件
vim /soft/kubernetes/server/conf/scheduler
KUBE_MASTER="--master=http://10.9.0.46:8886"
KUBE_SCHEDULER_ARGS="--logtostderr=true --log-dir=/home/k8s-t/log/kubernetes --v=2"
- 创建服务配置文件
vim /etc/systemd/system/kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler
After=kube-apiserver.service
Requires=kube-apiserver.service
[Service]
User=root
EnvironmentFile=-/soft/kubernetes/server/conf/scheduler
ExecStart=/soft/kubernetes/server/bin/kube-scheduler \\
$KUBE_MASTER \\
$KUBE_SCHEDULER_ARGS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
将各个组件启动
systemctl daemon-reload
systemctl enable kube-apiserver.service
systemctl start kube-apiserver.service
systemctl enable kube-controller-manager.service
systemctl start kube-controller-manager.service
systemctl enable kube-scheduler.service
systemctl start kube-scheduler.service
拥有京东云服务器还可以玩什么?
拥有自己个人网站,提高个人知名度
玩转小程序
玩转私有云盘(数据安全可靠,且网速有保障)
玩转ELK日志收集系统
玩转灰度实战
玩转禅道
云服务器 PK 自建机房
传统自建机房三大无解巨坑(本人有幸全程参与过两次自建机房建设,深知其中各种坑)
-
坑一:保障机房稳定运行且满足项目快速发展的需求成本极其大(机房选址,机柜,服务器选购,备用电源,网络搭建,基础软件安装及运维,电费,网络带宽费用,后期维护费用)
-
坑二:需要配备N个专业的高级运维人员
-
坑三:要做到机房高可用需要投入巨大的人力,物力,财力
自建机房需要做(包括但不仅限于以下几点)
-
机房选址(为了保障高可用,同城双机房,异地多机房)
云服务器完爆自建机房
解三坑
- 专业的人干专业的事情,大公司有更多的资源建立十分稳定可靠且实惠的云服务
- 弹性:资源被整合利用率会更高,通常大公司云管理几十万甚至上百万物理机,有统一的管理能力当使用低峰时可以进行关机等操作来降低能量消耗,当高峰时又可以迅速的启动机器支持业务;我们可以选择按量付费极大的降低服务器,网络等使用的成本
- 更加安全,普遍来说自建机房的安全性要远小于云服务器,云厂商有更专业的安全团队以及防范攻击的手段
上云意味着什么?
- 在当今这个云时代,针对中小型民营企业及个人,传统自建机房已然不是一个好的选择(成本,专业性等各个方面)
- 上云意味着我们花更少的费用,却用上了更合适的资源,更专业的服务,何乐而不为那?
搭建方式推荐
我为什么选择京东云?
- 京东大品牌,无论是服务器性能还是售后服务都值得信赖
- 一元活动是真的香呀
如何选购?
-
跟着老司机玩转云服务器,一台云服务器是唯一需要你准备资源,快速抢购京东云服务器,手慢无
-
我自己购买的配置是 云主机 2核4G 1M带宽 独享100%CPU
-
活动地址:一元抢购京东云服务器
-
如果是企业除了上面的优惠而且有更多抽奖机会不容错过
附赠福利
- 凡是通过以上活动地址购买的读者,可以加我的社区(点击我)或CSDN私信我,作者郑重承诺,提供终生免费技术咨询服务
总结
- 紧跟时代步伐,享受云时代给予我们每个人的红利
- 1元钱买云服务器不断实践去构建自己知识体系
以上是关于从零玩转EasyPoi-cong-ling-wan-zhuan-easypoi的主要内容,如果未能解决你的问题,请参考以下文章
从零玩转Java和word模板-从零玩转java和word模板
从零玩转Docker之docker-compose-azdocker-compose