一. 问题引入

博客专栏:

  • Springboot整合Poi导出excel(简单版)

  • Springboot整合Poi导出excel(注解版)

    总所周知Springboot是一个功能强大的微服务框架,集成了很多优秀的Spring组件,但是却没有支持Excel导出的插件。为此我们引入Poi插件。场景是导出Controller返回的Json数据,输出到二维表格。设置表头及其他设置可参考Poi中文文档。本教程试用简单导出Excel,通俗易懂。

    1. 首先从中央仓库中导入架包Poi3.14以及Poi-ooxml3.14.

 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.14</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.14</version></dependency>

2.编写工具类

编写用于导出Excel的工具类ExportExcelUtils,工具类可以直接使用,不需要更改。

package org.emall.website.util;import org.apache.poi.hssf.usermodel.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;/*** @author created by Zhangdazhuang* @version v.0.1* @Description TODO* @date 2019/4/7* @备注**/
public class ExportExcelUtils {private static final Logger logger = LoggerFactory.getLogger(ExportExcelUtils.class);/*** 导出Excel** @param excelName 要导出的excel名称* @param list      要导出的数据集合* @param fieldMap  中英文字段对应Map,即要导出的excel表头* @param response  使用response可以导出到浏览器* @param <T>*/public static <T> void export(String excelName, List<T> list, LinkedHashMap<String, String> fieldMap, HttpServletResponse response) {// 设置默认文件名为当前时间:年月日时分秒if (excelName == null || excelName == "") {excelName = new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()).toString();}// 设置response头信息response.reset();response.setContentType("application/vnd.ms-excel"); // 改成输出excel文件try {response.setHeader("Content-disposition", "attachment; filename="+ new String(excelName.getBytes("gb2312"), "ISO-8859-1") + ".xls");} catch (UnsupportedEncodingException e1) {logger.info(e1.getMessage());}try {//创建一个WorkBook,对应一个Excel文件HSSFWorkbook wb = new HSSFWorkbook();//在Workbook中,创建一个sheet,对应Excel中的工作薄(sheet)HSSFSheet sheet = wb.createSheet(excelName);//创建单元格,并设置值表头 设置表头居中HSSFCellStyle style = wb.createCellStyle();//创建一个居中格式style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 填充工作表fillSheet(sheet, list, fieldMap, style);//将文件输出OutputStream ouputStream = response.getOutputStream();wb.write(ouputStream);ouputStream.flush();ouputStream.close();} catch (Exception e) {logger.info("导出Excel失败!");logger.error(e.getMessage());}}/*** 根据字段名获取字段对象** @param fieldName 字段名* @param clazz     包含该字段的类* @return 字段*/public static Field getFieldByName(String fieldName, Class<?> clazz) {logger.info("根据字段名获取字段对象:getFieldByName()");// 拿到本类的所有字段Field[] selfFields = clazz.getDeclaredFields();// 如果本类中存在该字段,则返回for (Field field : selfFields) {//如果本类中存在该字段,则返回if (field.getName().equals(fieldName)) {return field;}}// 否则,查看父类中是否存在此字段,如果有则返回Class<?> superClazz = clazz.getSuperclass();if (superClazz != null && superClazz != Object.class) {//递归return getFieldByName(fieldName, superClazz);}// 如果本类和父类都没有,则返回空return null;}/*** 根据字段名获取字段值** @param fieldName 字段名* @param o         对象* @return 字段值* @throws Exception 异常*/public static Object getFieldValueByName(String fieldName, Object o)throws Exception {logger.info("根据字段名获取字段值:getFieldValueByName()");Object value = null;//根据字段名得到字段对象Field field = getFieldByName(fieldName, o.getClass());//如果该字段存在,则取出该字段的值if (field != null) {field.setAccessible(true);//类中的成员变量为private,在类外边使用属性值,故必须进行此操作value = field.get(o);//获取当前对象中当前Field的value} else {throw new Exception(o.getClass().getSimpleName() + "类不存在字段名 "+ fieldName);}return value;}/*** 根据带路径或不带路径的属性名获取属性值,即接受简单属性名,* 如userName等,又接受带路径的属性名,如student.department.name等** @param fieldNameSequence 带路径的属性名或简单属性名* @param o                 对象* @return 属性值* @throws Exception 异常*/public static Object getFieldValueByNameSequence(String fieldNameSequence,Object o) throws Exception {logger.info("根据带路径或不带路径的属性名获取属性值,即接受简单属性名:getFieldValueByNameSequence()");Object value = null;// 将fieldNameSequence进行拆分String[] attributes = fieldNameSequence.split("\\.");if (attributes.length == 1) {value = getFieldValueByName(fieldNameSequence, o);} else {// 根据数组中第一个连接属性名获取连接属性对象,如student.department.nameObject fieldObj = getFieldValueByName(attributes[0], o);//截取除第一个属性名之后的路径String subFieldNameSequence = fieldNameSequence.substring(fieldNameSequence.indexOf(".") + 1);//递归得到最终的属性对象的值value = getFieldValueByNameSequence(subFieldNameSequence, fieldObj);}return value;}/*** 向工作表中填充数据** @param sheet    excel的工作表名称* @param list     数据源* @param fieldMap 中英文字段对应关系的Map* @param style    表格中的格式* @throws Exception 异常*/public static <T> void fillSheet(HSSFSheet sheet, List<T> list,LinkedHashMap<String, String> fieldMap, HSSFCellStyle style) throws Exception {logger.info("向工作表中填充数据:fillSheet()");// 定义存放英文字段名和中文字段名的数组String[] enFields = new String[fieldMap.size()];String[] cnFields = new String[fieldMap.size()];// 填充数组int count = 0;for (Map.Entry<String, String> entry : fieldMap.entrySet()) {enFields[count] = entry.getKey();cnFields[count] = entry.getValue();count++;}//在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制shortHSSFRow row = sheet.createRow((int) 0);// 填充表头for (int i = 0; i < cnFields.length; i++) {HSSFCell cell = row.createCell(i);cell.setCellValue(cnFields[i]);cell.setCellStyle(style);sheet.autoSizeColumn(i);}// 填充内容for (int index = 0; index < list.size(); index++) {row = sheet.createRow(index + 1);// 获取单个对象T item = list.get(index);for (int i = 0; i < enFields.length; i++) {Object objValue = getFieldValueByNameSequence(enFields[i], item);String fieldValue = objValue == null ? "" : objValue.toString();row.createCell(i).setCellValue(fieldValue);}}}}

3.编写实体类

需要输出到Excel的实体表。

package org.emall.website.entity;import java.math.BigInteger;/*** @author created by Zhangdazhuang* @version v.0.1* @Description TODO* @date 2019/4/7* @备注**/
public class Excel {private BigInteger id;private String order_number;private String amount_real;private String date_add;private String status_str;private String link_man;private String mobie;private String address;private String detailValue;public Excel() {}public Excel(BigInteger id, String order_number, String amount_real, String date_add, String status_str, String link_man, String mobie, String address, String detailValue) {this.id = id;this.order_number = order_number;this.amount_real = amount_real;this.date_add = date_add;this.status_str = status_str;this.link_man = link_man;this.mobie = mobie;this.address = address;this.detailValue = detailValue;}public BigInteger getId() {return id;}public void setId(BigInteger id) {this.id = id;}public String getOrder_number() {return order_number;}public void setOrder_number(String order_number) {this.order_number = order_number;}public String getAmount_real() {return amount_real;}public void setAmount_real(String amount_real) {this.amount_real = amount_real;}public String getDate_add() {return date_add;}public void setDate_add(String date_add) {this.date_add = date_add;}public String getStatus_str() {return status_str;}public void setStatus_str(String status_str) {this.status_str = status_str;}public String getLink_man() {return link_man;}public void setLink_man(String link_man) {this.link_man = link_man;}public String getMobie() {return mobie;}public void setMobie(String mobie) {this.mobie = mobie;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getDetailValue() {return detailValue;}public void setDetailValue(String detailValue) {this.detailValue = detailValue;}
}

4.编写控制层即得到Json数据

编写控制层ExcelController,注意fieldMap.put(“实体类属性名”,“Excel中显示的属性名”); 设置实体属性名和数据库中对应。如果得不到数据对应不上,请采用ResultMap设置或者用Select XX(数据库名)As 实体属性名

package org.emall.website.controller;import org.emall.website.entity.Excel;
import org.emall.website.entity.Order;
import org.emall.website.service.OrderService;
import org.emall.website.util.ExportExcelUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.LinkedHashMap;
import java.util.List;/*** @author created by Zhangdazhuang* @version v.0.1* @Description TODO* @date 2019/4/7* @备注**/
@Controller
public class ExcelController {@Autowiredprivate HttpServletRequest request;@Autowiredprivate OrderService orderService;@RequestMapping(value = "/excel/exportBankCheckInfo",method = RequestMethod.GET)public void ExportBankCkeckInfo(HttpServletResponse response, HttpServletRequest request){//这里是笔者实际业务需求中需要得到时间间隔。可忽略String start=request.getParameter("start");String end=request.getParameter("end");System.out.println("打印的起始日期为:"+start+",打印的结束日期为:"+end);//得到所有要导出的数据List<Excel> orderlist =orderService.listexcel(start,end);//定义导出的excel名字String excelName = "订单详情表";//获取需要转出的excel表头的map字段LinkedHashMap<String, String> fieldMap = new LinkedHashMap<>();fieldMap.put("id","编号");fieldMap.put("link_man","姓名");fieldMap.put("amount_real","价格");fieldMap.put("date_add","日期");fieldMap.put("status_str","订单状态");fieldMap.put("mobie","收货电话");fieldMap.put("address","地址");fieldMap.put("detailValue","订单详情");//导出用户相关信息new ExportExcelUtils().export(excelName,orderlist,fieldMap,response);}}

5.验证

在导出工具类中,通过HttpServletResponse response设置输出为Excel。所以通过Controller层的Url可以直接得到URL。保存位置是保存在浏览器的默认保存位置,因为是下载请求。(笔者存疑:是否可以保存到任意位置)。
输入请求 127.0.0.1:8080/(可选项目名)/excel/exportBankCheckInfo

最后查看导出的Excel格式如下:

这里只是简单实现了Excel的导入,通过Poi插件或者其他开源的插件可以对导入导出Excel做更加功能丰富的操作,详情请移步CSDN或者github。欢迎加入Q群959706394,大家一起学习交流编程知识,解决实际业务需求中各种需求。

Springboot整合Poi导出excel(简单版)相关推荐

  1. Springboot整合Poi导出excel(注解版)

    简介 博客专栏: Springboot整合Poi导出excel(简单版) Springboot整合Poi导出excel(注解版) 上文提到通过poi简单导出Excel后,很多读者反应需要解决导出自适应 ...

  2. Springboot利用poi导出excel下载

    Springboot利用poi导出excel下载 因为项目中之前的做法是用反射获取属性,所以demo中也是用的反射,我看网上很多文章都是存入一个List中,不知道这两种哪种更何合适一点,或者有什么更好 ...

  3. SpringBoot 整合Spring Security(简单版)

    1 写在前面 关于spring security的介绍,网上一大堆,这里就不介绍了,这里直接使用springboot开始整合 2 整个流程 spring security授权和认证的流程大致和shir ...

  4. springboot整合poi基于excel模板下载的功能实现

    现在网上有很多基于poi的excel导入导出功能实现的代码,大家都写的很好,但好像关于静态资源excel模板导出的却很少.我整理了一下项目中遇到的excel导出的功能代码,展示如下,希望有所帮助,如有 ...

  5. springBoot使用poi导出Excel

    一.导入依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</arti ...

  6. springboot整合poi解析excel

    1.poi的maven引入 <!-- poi导入导出 --><dependency><groupId>org.apache.poi</groupId>& ...

  7. springboot -- 整合 poi 解析Excel 更新数据库数据

    目录: 1.建表,实体类,dao层,service层,自行操作 2.Excel–>Poi --> Maven依赖 3.解析Excel --> Poi 工具类 --> Confi ...

  8. springboot整合POI导出word(文字加图片)

    1.引入Poi依赖 2.设置word模板 3.(工具类)Utils 4.Controller 5.文件放置 6.运行结果 1.引入Poi依赖 <dependency><groupId ...

  9. SpringMVC 使用poi导出excel简单小例子

    不说话,上代码. student.java package com.cn.hnust.domain;import java.io.Serializable;public class Student i ...

最新文章

  1. luogu 5471 [NOI2019]弹跳 KDtree + Dijkstra
  2. 文本转声音,TTS语音实现
  3. 怎么看java中ide_如何在eclipse IDE中查看Java的字节码?
  4. 美国空军开发新型机载网络技术
  5. web 应用常见安全漏洞一览
  6. linux网络编程之用socket实现简单客户端和服务端的通信(基于UDP)
  7. 安装svn、git等托管软件
  8. shapefile导入oracle,shp2sdo.exe用法:shpfile导入OracleSpatial
  9. 资阳停车场系统推荐_详细讲解停车场管理车牌识别系统安装
  10. 新仓库无线AP手持连接故障
  11. Skype For Asterisk 的安装及使用
  12. 直关的sql 联级更新语句
  13. python bin文件转换成txt文件
  14. Gensim库的使用——Word2vec模型(二)训练自己的模型与训练参数
  15. 王船山的哲思深度:五百年来,真通天人之故者,船山一人而已
  16. 互联网日报 | 5月6日 星期四 | 阿里巴巴旗下“天猫香港”上线试营业;蔚来汽车将进军海外市场;五一档票房超16亿创新高...
  17. 从张家界火车站如何去张家界玻璃桥游玩,最详细的张家界攻略
  18. matlab 数组中的一个值,MATLAB数组元素引用的三种方法
  19. 计算机学frm,FRM金融计算器使用教程
  20. JVM2:垃圾收集器与内存分配策略

热门文章

  1. Docker官方教程
  2. 阿里云APP产品功能及使用介绍
  3. C++第一课(初识C++)
  4. Windows10 插入耳机没声音,安装驱动无效问题解决
  5. 2020“天猫双11”淘宝直播商家数据报告:新渠道、新品牌、新趋势
  6. 511遇见电脑PC任意多开绿色软件
  7. UCML页面生成后突然不能访问 参数化查询 '(@ActivityID nvarchar(4000))SELECT ActivityInfoEx.ActivityInfoEx' 需要参数 '@Acti
  8. 转:乱谈Dotnet之武林秘籍
  9. 第二十二章 : 格式化输出
  10. ITIL及ITSS相关概念介绍