报表导出之easypoi的应用
报表导出有很多种方法,像之前我有写过的jxl,poi,jasperreport又或者各种商业软件,这次来简单介绍下用了许久的开源轮子easypoi。
easypoi的底层原理就不介绍了。因为官方文档的不足,本次简单记录下使用easypoi导出excel的各种方法。
首先在具体介绍前,建议大家先看一看easypoi的官方文档,http://easypoi.mydoc.io/
文档中基础使用上的介绍还是比较详细的。
本次我以目前流行的springboot项目为例。
第一步我们需要引入easypoi的依赖,一个自定义的starter
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
<version>3.3.0</version>
</dependency>
注意:引入了这个就不用再引入poi的包了,自定义的starter已经包含相关依赖了。
1、默认导出方式
导出类的配置
@Getter
@Setter
public class GroupCtrlVO {
@Excel(name = "操作人", orderNum = "1", width = 30)
private String ctrlUser;
@Excel(name = "操作时间", orderNum = "2", width = 30, format = "yyyy-MM-dd HH:mm:ss")
private Date ctrlTime;
@Excel(name = "标签名称", orderNum = "3", width = 30)
private String groupName;
@Excel(name = "操作类型", orderNum = "4", width = 30)
private String ctrlOperation;
}
service的配置
@Override
public void export(String login, HttpServletResponse response) {
OutputStream output = null;
try {
WebUserDO userDO = cmWebUserMapper.getWebUserByLogin(login);
List<GroupCtrlVO> list = crmCustomerInfoGroupMapper.listCtrlVo(userDO.getId());
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), GroupCtrlVO.class, list);
response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(login+ "标签操作记录.xls", "UTF-8"));
response.setContentType("application/msexcel");
output = response.getOutputStream();
workbook.write(output);
} catch (Exception e) {
log.error("标签操作记录导出失败!", e);
} finally {
try {
output.close();
} catch (IOException e) {
log.error("标签操作记录输出流关闭失败!", e);
}
}
}
2、模板导出方式
excel模板:相关循环参数参考官方文档

service配置:
@Override
public void export(String startDate, String endDate, HttpServletResponse response) {
OutputStream output = null;
try {
List<Test> list = testMapper.list(startDate,endDate);
TemplateExportParams params = new TemplateExportParams(ExcelPathUtils.convertTemplatePath("static/report/template_test_report.xlsx"));
Map<String, Object> data = new HashMap<String, Object>();
data.put("list", list);
Workbook workbook = ExcelExportUtil.exportExcel(params, data);
response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(startDate+"~"+endDate + "测试报表.xlsx", "UTF-8"));
response.setContentType("application/msexcel");
output = response.getOutputStream();
workbook.write(output); } catch (Exception e) {
e.printStackTrace();
} finally {
try {
output.close();
} catch (IOException e) {
log.error("测试报表输出流关闭失败!", e);
}
}
}
注意:导出的字段要和模板循环到字段相同
3、模板多sheet导出
多sheet模板:


service配置:
@Override
public void export(String startDate, String endDate, String strategyName, HttpServletResponse response) {
OutputStream output = null;
try {
//查表1数据
List<Test1DO> list = testMapper.listStrategy(strategyName, startDate, endDate);
//查表2数据
List<Test2DO> listDetail = test2Mapper.listStrategy(strategyName, startDate, endDate);
TemplateExportParams params = new TemplateExportParams(ExcelPathUtils.convertTemplatePath("static/report/template_test_two_sheet_report.xlsx"),true);
Map<String, Object> data = new HashMap<String, Object>();
data.put("list", list);
data.put("listDetail", listDetail);
Workbook workbook = ExcelExportUtil.exportExcel(params, data);
response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(startDate+"~"+endDate + "测试多表单报表.xlsx", "UTF-8"));
response.setContentType("application/msexcel");
output = response.getOutputStream();
workbook.write(output);
} catch (Exception e) {
log.error("测试多表单导出失败!", e);
} finally {
try {
output.close();
} catch (IOException e) {
log.error("测试多表单输出流关闭失败!", e);
}
}
}
因为springboot打成jar包,文件读取路径的问题,上述案例中ExcelPathUtils是我按照自己需求重写的,有需要的同学可以参考下。
/**
* poi导出路径获取,解决jar包找不到路径的问题
* 思路:将文件写入tomcat临时文件夹中
* @author 小卖铺的老爷爷
* @date 2018年12月26日
*/
public class ExcelPathUtils {
public static String convertTemplatePath(String path) {
// 如果是windows 则直接返回
// if (System.getProperties().getProperty("os.name").contains("Windows")) {
// return path;
// }
Resource resource = new ClassPathResource(path);
FileOutputStream fileOutputStream = null;
// 将模版文件写入到 tomcat临时目录
String folder = System.getProperty("catalina.home");
File tempFile = new File(folder + File.separator + path);
// System.out.println("文件路径:" + tempFile.getPath());
// 文件存在时 不再写入
if (tempFile.exists()) {
return tempFile.getPath();
}
File parentFile = tempFile.getParentFile();
// 判断父文件夹是否存在
if (!parentFile.exists()) {
parentFile.mkdirs();
}
try {
BufferedInputStream bufferedInputStream = new BufferedInputStream(resource.getInputStream());
fileOutputStream = new FileOutputStream(tempFile);
byte[] buffer = new byte[10240];
int len = 0;
while ((len = bufferedInputStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return tempFile.getPath();
} }
报表导出之easypoi的应用的更多相关文章
- 【HOW】如何限制Reporting Services报表导出功能中格式选项
Reporting Services报表导出功能中缺省会提供多种导出格式选项,但很多情况下不需要全部的格式选项,因此需要对这些选项进行限制.下面我们以SQL Server 2008 R2为例来说明对这 ...
- JAVA将Excel中的报表导出为图片格式(一)问题背景
如题所示,先抛出一个问题,如何使用JAVA将Excel中的报表导出为图片格式? 首先说一下这个问题的背景,也就是为什么博主会碰到这个问题 随着微信,易信之流大行其道,企业内部的办公交流.绩效考评甚至考 ...
- Ireport 报表导出 Poi + ireport 导出pdf, word ,excel ,htm
Ireport 报表导出 Poi + ireport 导出pdf, doc ,excel ,html 格式 下面是报表导出工具类reportExportUtils 需要导出以上格式的报表 只需要调用本 ...
- kettle工具实现报表导出的初步搭建
1.下载kettle 国外网站:http://kettle.pentaho.org/需要FQ,下载慢 2.下载完成启动(windows)-->spoon.bat 3.进入界面,两个主要的tab页 ...
- Dynamics CRM 报表导出EXCEL 列合并问题的解决方法
CRM中的报表导出功能提供了多种格式,excel就是其中之一,这次遇到的问题是导出后打开excel列明合并的问题,具体如下看着相当不美观,物料名称字段占了AB两列,品牌占了CD两列等等. 该问题的源头 ...
- 考勤输入导入OA平台与考勤统计报表导出功能源代码
注:以某某公司为例,每日签到时间为8点整 每日签退时间为17点30分 规则:公司签到签退时间在OA平台中可以视实际情况调整,当天有请假并通过工作流审批通过为有效,当天因公外出并通过工作流审批通过为 ...
- ActiveReports 报表应用教程 (16)---报表导出
葡萄城ActiveReports报表支持多种格式的报表导出,包括PDF.Excel.Word.RTF.HTML.Text.TIFF以及其它图片格式,用户可以将它们应用到Windows Forms.We ...
- 填报表导出excel非可写单元格锁定问题
问题描述: 填报表单元格分为可写和不可写两种状态,当填报表在web上展现的时候可写单元格可以进行数据填报和修改,非可写单元格不可操作. 报表导出为excel时,润乾导出excel包默认情况下不对 ...
- 报表导出excel方式介绍
报表导出excel提供了四种方式,在单元格属性"其他/导出excel方式"可以选择,如下图 一是导出缺省值:报表中的单元格包含两个值,一个真实值一个显示值,但是在excel中 ...
随机推荐
- 处理收到的Stanzas
处理收到的Stanzas 背部 Smack使用两种结构提供了一个灵活的框架来处理传入的节: org.jivesoftware.smack.StanzaCollector - 一个允许您同步等待新节的类 ...
- SQL Server中查找包含某个文本的存储过程 SQL 查找存储过程中出现过的文字怎么查询 查询整个数据库中出现的文本 sql 全局搜索
--将text替换成你要查找的内容SELECT name, *FROM sysobjects o, syscomments sWHERE o.id = s.id AND text LIKE '%tex ...
- 2019 云和数据java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.云和数据等公司offer,岗位是Java后端开发,因为发展原因最终选择去了云和数据,入职一年时间了,也成为了面 ...
- [译] Ruby如何访问Excel文件
Parsing Excel Files with Ruby BY: MATT NEDRICH 翻译:佣工7001 本文中,我将会评判几种Ruby语言访问Excel文件的库.我将要讨论针对不同格式 ...
- English--分词短语
English|分词短语 现在开始讲解分词短语的内容.在英语的语法世界里面,想要将句子写的漂亮,分词短语,你值得拥有! 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点的描述.力 ...
- spark和深度学习集成调研
http://dy.163.com/v2/article/detail/E2TMAOTU0518KCLV.html http://www.elecfans.com/d/676451.html http ...
- Vue – 基础学习(3):$forceUpdate()和$nextTick()的区别
Vue – 基础学习(3):$forceUpdate()和$nextTick()的区别
- jmeter-Unable to access jarfile ApacheJMeter.jar
jmeter在运行时报错Unable to access jarfile ApacheJMeter.jar.如下图: 检查后发现jmeter_home/bin/目录下缺失 ApacheJMeter.j ...
- 没有用到React,为什么我需要import引入React?
没有用到React,为什么我需要import引入React? 本质上来说JSX是React.createElement(component, props, ...children)方法的语法糖. 所以 ...
- 《Scala程序设计》暨Scala简介
JVM语言 JVM上的语言越来越多了,从前几年的groovy.Scala和Clojure,现在又听说一门Kotlin.对于前三种语言,groovy算是JVM平台上的动态脚本语言,可以类比Python: ...