POI提供API给Java程序对Microsoft Office格式档案读和写的功能,详细功能可以直接查阅API,因为使用EasyPoi过程中总是缺少依赖,没有搞明白到底是什么坑,索性自己写一个简单工具类,来实现无论传入任何对象集合,都能够实现导出Excel的功能,没有看EasyPoi的源码, 只是在功能上模仿一下。

首先导入基本依赖,除了SpringBoot基本依赖依赖,导入Poi的依赖

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>

编写自定义注解

@Retention(RetentionPolicy.RUNTIME)
public @interface Excel {

//Excel列名称
String name() default "";

//Excel列数
int orderNum() default ; }

编写javaBean,所有需要导出的属性都使用Excel注解

public class Person{

   private String id;

   @Excel(name = "用户姓名")
private String userName; @Excel(name = "电话",orderNum = )
private String phone; @Excel(name = "邮箱",orderNum = )
private String email; @Excel(name = "地址",orderNum = )
private String address; public void setId(String id){ this.id=id;
} public String getId(){
return id;
} public void setUserName(String userName){ this.userName=userName;
} public String getUserName(){
return userName;
} public void setphone(String phone){ this.phone=phone;
} public String getphone(){
return phone;
} public void setEmail(String email){ this.email=email;
} public String getEmail(){
return email;
} public void setAddress(String address){ this.address=address;
} public String getAddress(){
return address;
} }

编写工具类

public class PoiUtils {

    /**
*
* 功能描述:
* 需要导出的属性要加Excel注解,实现Excel导出功能
* @param: [list, fileName, sheetName, response, clazz]
* @return: void
* @auther: wang
* @date: 2019/1/18 15:31
*/
public Static <T> void export(Collection<T> collection, String fileName, String sheetName, HttpServletResponse response, Class<?> clazz) throws IOException, IntrospectionException, InvocationTargetException, IllegalAccessException { HSSFWorkbook workbook = new HSSFWorkbook();
//创建一个Excel表单,参数为sheet的名字
HSSFSheet sheet = workbook.createSheet(sheetName);
//创建表头
setTitle(workbook, sheet, clazz);
//新增数据行,并且设置单元格数据
int rowNum = ;
for (T t : collection) {
HSSFRow row = sheet.createRow(rowNum);
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(Excel.class)) {
PropertyDescriptor pd = new PropertyDescriptor(field.getName(),
clazz);
Method getMethod = pd.getReadMethod();//获得get方法
Excel excel = field.getAnnotation(Excel.class);
row.createCell(excel.orderNum()).setCellValue(String.valueOf(getMethod.invoke(t))); } }
rowNum++;
}
//清空response
response.reset();
// 告诉浏览器用什么软件可以打开此文件
response.setHeader("content-Type", "application/vnd.ms-excel");
// 下载文件的默认名称
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".xls", "utf-8"));
OutputStream os;
//可以将生成Excel默认下载到某个目录下
//os = new BufferedOutputStream(new FileOutputStream("D:\\bmj\\target\\bmj128-0.0.1\\" + fileName));
//也可以通过response得到输出流,写到输出流中,在页面中进行下载
os = new BufferedOutputStream(response.getOutputStream());
//将excel写入到输出流中
workbook.write(os);
os.flush();
os.close(); } /***
* 设置表头
* @param workbook
* @param sheet
*/
private static void setTitle(HSSFWorkbook workbook, HSSFSheet sheet, Class clazz) {
HSSFRow row = sheet.createRow();
Field[] fields = clazz.getDeclaredFields();
//设置为居中加粗
HSSFCellStyle style = workbook.createCellStyle();
HSSFFont font = workbook.createFont();
//设置字体
font.setFontName("宋体");
//设置粗体
font.setBold(true);
//设置字号
font.setFontHeightInPoints((short) );
//设置颜色
font.setColor(IndexedColors.BLACK.index);
style.setFont(font);
HSSFCell cell;
for (Field field : fields) {
if (field.isAnnotationPresent(Excel.class)) {
Excel excel = field.getAnnotation(Excel.class);
cell = row.createCell(excel.orderNum());
cell.setCellValue(excel.name());
cell.setCellStyle(style);
sheet.setColumnWidth(excel.orderNum(), *);
}
} } }

页面调用,页面采用的是EasyUI框架

      <div style="padding:5px;background:#fafafa;width:100%;">
<a href="javascript:void(0)" class="easyui-linkbutton" plain="true" iconCls="icon-undo" onclick="downLoadExcel()">导出日志</a>
</div>

可以按照页面给增加筛选条件,根据筛选条件下载

   function downLoadExcel(){

        var url=base+'/api/xx?xx='+$("#xx").val()+'&xx='+$("#xx").val()+'&xx='+$("#xx").val();
window.location.href = url; }

编写Controller

@RestController
@RequestMapping(value = "/api/xx")
public class PersonController { private static final Logger LOG = LoggerFactory.getLogger(PersonController .class);
@Resource(name = "personService")
private PersonService personService; @RequestMapping("/export")
public void export(PersonQuery personQuery, HttpServletResponse response) { List<Person> personList = personService.selectAll(personQuery); try {
PoiUtils.export(auditLogList, "审计日志", "审计日志", response,AuditLog.class);
} catch (IOException | IntrospectionException | InvocationTargetException | IllegalAccessException e) {
LOG.error("审计日志错误{}",e);
} } }

页面如下

点击导出日志,显示如下

目前仅仅是针对单个sheet的操作,也没有像合并单元格这种复杂操作,需要继续完善。

SpringBoot加Poi仿照EasyPoi实现Excel导出的更多相关文章

  1. java通过POI和easypoi实现Excel的导出

    前言 在工作经常会遇到excel导出报表的功能,自己也做过一些,然后在项目里看到同事封装的一个excel导出工具类,着实不错,拿来分享一下.然后,又在网上看到一个使用easypoi实现cxcel导出的 ...

  2. java利用EasyPoi实现Excel导出功能

    easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言( ...

  3. Java常用工具类之Excel导出

    package com.wazn.learn.util; import java.util.List; import java.util.Map; import org.apache.poi.hssf ...

  4. SpringBoot图文教程10—模板导出|百万数据Excel导出|图片导出「easypoi」

    有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+ ...

  5. springboot通过poi导出excel

    Maven引入依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi< ...

  6. 基于springboot跟poi封装的最便捷的excel导出

    发布时间:2018-11-15   技术:springboot1.5.6 + maven3.0.5 + jdk1.8   概述 Springboot最便捷的Excel导出,只需要一个配置文件即可搞定 ...

  7. vue springboot利用easypoi实现简单导出

    vue springboot利用easypoi实现简单导出 前言 一.easypoi是什么? 二.使用步骤 1.传送门 2.前端vue 3.后端springboot 3.1编写实体类(我这里是dto, ...

  8. 转:POI操作Excel导出

    package com.rd.lh.util.excel; import java.beans.PropertyDescriptor; import java.io.FileOutputStream; ...

  9. Easypoi实现excel多sheet表导入导出功能

    Easypoi简化了开发中对文档的导入导出实现,并不像poi那样都要写大段工具类来搞定文档的读写. 第一步引入Easypoi依赖 <!-- 导出文件工具 EasyPoi实现Excel读写管理测试 ...

随机推荐

  1. asp.net core NLog将日志写到文件

    1.安装Nlog包 Install-Package NLog.Extensions.Logging -Pre 2.在项目添加nlog.config文件 2.1.nlog.config <?xml ...

  2. python&JSONP(初级篇)

    JSONP产生背景 1.跨域的安全限制都是对浏览器端来说的,服务器端是不存在跨域安全限制的. 2.浏览器的同源策略限制从一个源加载的文档或脚本与来自另一个源的资源进行交互. 3.如果协议,端口和主机对 ...

  3. 「JavaScript面向对象编程指南」闭包

    闭包 JS只有函数作用域,函数外为全局变量,函数内为局部变量 绿圆是函数fn的作用域,在这范围内可访问局部变量b和全局变量a,橙圆是fn内部函数inner的作用域,此范围内可访问自身作用域内的变量c, ...

  4. 51nod 2523

    len=0 break len=1,f=0,ans++,保留前一行的v数组,即len不变:f=1,重新确定下一列中需要判哪一行(标记法),跟新v数组 这题思路很清晰,但是写代码的时候弄错好几个变量,列 ...

  5. .Net业务搭配实用技术栈(转)

      前言 昨天有篇文章在讨论webform的设计思路,我已经四五年不用webform了,虽然它也提供了HttpModule和httphandle来处理请求,提供了一般处理程序ashx来简化处理流程,但 ...

  6. nvm的使用

    nvm能下载并按照指定 的版本,还能切换已安装好的版本,相当的好用

  7. 从零开始搭建Android组件化框架

    问题 在已经开发过几个项目的童鞋,如果这时需要重新开发一个新项目,是否需要自己重新搭建框架呢,还是从老项目中拷贝粘贴? 我们是否可以封装一个底层的lib库,这个底层的公共基础库 包括了一些第三方库(如 ...

  8. 射线法(1190 - Sleepwalking )

    题目:http://lightoj.com/volume_showproblem.php?problem=1190 参考链接:https://blog.csdn.net/gkingzheng/arti ...

  9. vue环境下新建项目

    1.之前电脑上安装了node和npm,查看下版本信息. 2.现在安装vue-cli脚手架,可以全局安装: npm install --global  vue-cli 之前自己电脑没有安装过webpac ...

  10. spring-cloud-hystrix-dasboard服务调用监控

    除了隔离依赖服务的调用以外,hystrix还提供了准实时的调用监控(hystrix dashboard),hystrxi会持续的记录所有通过hyxtrix发起的请求的执行信息,并以统计报表和图形的形式 ...