一、 第一种方式

1.首先从中央仓库中导入架包Poi3.14以及Poi-ooxml3.14.
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>

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

package com.roncoo.education.web.common;

import org.apache.poi.hssf.usermodel.*;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List; /**
* @author ZhangRF
*/
public class ExcelUtil {
/**
* Excel表格导出
*
* @param response HttpServletResponse对象
* @param excelData Excel表格的数据,封装为List<List<String>>
* @param sheetName sheet的名字
* @param fileName 导出Excel的文件名
* @param columnWidth Excel表格的宽度,建议为15
* @throws IOException 抛IO异常
*/
public static void exportExcel(HttpServletResponse response,
List<List<String>> excelData,
String sheetName,
String fileName,
int columnWidth) throws IOException { //声明一个工作簿
HSSFWorkbook workbook = new HSSFWorkbook(); //生成一个表格,设置表格名称
HSSFSheet sheet = workbook.createSheet(sheetName); //设置表格列宽度
sheet.setDefaultColumnWidth(columnWidth); //写入List<List<String>>中的数据
int rowIndex = 0;
for (List<String> data : excelData) {
//创建一个row行,然后自增1
HSSFRow row = sheet.createRow(rowIndex++); //遍历添加本行数据
for (int i = 0; i < data.size(); i++) {
//创建一个单元格
HSSFCell cell = row.createCell(i); //创建一个内容对象
HSSFRichTextString text = new HSSFRichTextString(data.get(i)); //将内容对象的文字内容写入到单元格中
cell.setCellValue(text);
}
} //准备将Excel的输出流通过response输出到页面下载
//八进制输出流
response.setContentType("application/octet-stream"); //设置导出Excel的名称
response.setHeader("Content-disposition", "attachment;filename=" + java.net.URLEncoder.encode(fileName, "UTF-8")); //刷新缓冲
response.flushBuffer(); //workbook将Excel写入到response的输出流中,供页面下载该Excel文件
workbook.write(response.getOutputStream()); //关闭workbook
workbook.close();
} }

3.service导出实现

public void orderExport(OrderInfoQO orderInfoQO, HttpServletResponse response) {
orderInfoQO.setPageCurrent(1);
orderInfoQO.setPageSize(1000);
Integer courseFlag = orderInfoQO.getCourseFlag();
CourseFlagEnum courseFlagEnum = CourseFlagEnum.values(courseFlag);
boolean isGet = true;
List<List<String>> excelData = new ArrayList<>();
List<String> head = new ArrayList<>();
head.add("订单编号");
head.add("讲师信息");
head.add("用户手机号");
head.add("用户姓名");
if (courseFlagEnum == CourseFlagEnum.YUNXIAOHUI) {
head.add("机构名称");
}
head.add("课程顾问");
head.add("课程名称");
head.add("课程原价");
head.add("课程实付");
head.add("齿币");
head.add("交易类型");
head.add("支付方式");
head.add("购买渠道");
head.add("支付时间");
head.add("客户备注");
excelData.add(head);
do {
Page<OrderInfoVO> page = feignOrderInfo.listForPage(orderInfoQO);
if (page.getPageCurrent() == page.getTotalPage()) {
isGet = false;
} else {
orderInfoQO.setPageCurrent(page.getPageCurrent() + 1);
}
page.getList().stream().map(m -> {
UserExtVO userExtVO = feignUserExt.getByUserNo(m.getUserNo());
List<String> data = new ArrayList<>();
data.add(String.valueOf(m.getOrderNo()));
data.add(m.getLecturerName());
data.add(m.getMobile());
if (userExtVO != null && userExtVO.getId() != null) {
data.add(userExtVO.getRealName());
if (courseFlagEnum == CourseFlagEnum.YUNXIAOHUI) {
data.add(userExtVO.getOrgName());
}
data.add(userExtVO.getKefuName());
} else {
data.add("");
if (courseFlagEnum == CourseFlagEnum.YUNXIAOHUI) {
data.add("");
}
data.add("");
}
data.add(m.getCourseName());
data.add(String.valueOf(m.getPricePayable()));
data.add(String.valueOf(m.getPricePaid()));
data.add(String.valueOf(m.getUsePoint()));
TradeTypeEnum tradeTypeEnum = TradeTypeEnum.values(m.getTradeType());
if (tradeTypeEnum == null) {
data.add("");
} else {
data.add(tradeTypeEnum.getDesc());
}
PayTypeEnum payTypeEnum = PayTypeEnum.values(m.getPayType());
if (payTypeEnum == null) {
data.add("");
} else {
data.add(payTypeEnum.getDesc());
}
ChannelTypeEnum channelTypeEnum = ChannelTypeEnum.values(m.getChannelType());
if (channelTypeEnum == null) {
data.add("");
} else {
data.add(channelTypeEnum.getDesc());
}
data.add(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(m.getPayTime()));
data.add(m.getRemarkCus());
excelData.add(data);
return m;
}).collect(Collectors.toList());
} while (isGet); String sheetName = "课程订单";
String fileName = "订单报表-";
if (courseFlagEnum == CourseFlagEnum.YUNXIAOHUI) {
fileName = "云校汇订单报表";
}
fileName = fileName + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + ".xls"; try {
ExcelUtil.exportExcel(response, excelData, sheetName, fileName, 15);
} catch (IOException e) {
e.printStackTrace();
}
}

4.接口调用

/**
* 报表导出
*
* @param response
* @throws IOException
*/
@RequestMapping(value = "/export", method = RequestMethod.GET)
public void orderExport(@ModelAttribute OrderInfoQO orderInfoQO, HttpServletResponse response) throws IOException {
biz.orderExport(orderInfoQO, response);
}

二、第二种方式

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; /**
* @version v.0.1
* @Description TODO
* @date 2020/6/1
* @备注
**/
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.name
Object 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的行数列数有限制short
HSSFRow 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;

/**
* @version v.0.1
* @Description TODO
* @date 2020/6/1
* @备注
**/
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; /**
* @version v.0.1
* @Description TODO
* @date 2020/6/1
* @备注
**/
@Controller
public class ExcelController { @Autowired
private HttpServletRequest request;
@Autowired
private 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。保存位置是保存在浏览器的默认保存位置,因为是下载请求。

spring boot 整合 poi 导出excel的更多相关文章

  1. Spring Boot利用poi导出Excel

    至于poi的用法就不多说了,网上多得很,但是发现spring boot结合poi的就不多了,而且大多也有各种各样的问题. public class ExcelData implements Seria ...

  2. spring boot:使用poi导出excel电子表格文件(spring boot 2.3.1)

    一,什么是poi? 1,poi poi是用来兼容微软文档格式的java api, 它是apache的顶级项目之一, 也是我们在生产环境中导出excel时使用最多的库 2,poi官方网站: http:/ ...

  3. spring boot 使用POI导出数据到Excel表格

    在spring boot 的项目经常碰到将数据导出到Excel表格的需求,而POI技术则对于java操作Excel表格提供了API,POI中对于多种类型的文档都提供了操作的接口,但是其对于Excel表 ...

  4. spring boot使用AbstractXlsView导出excel

    一.maven依赖jar包 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi ...

  5. spring boot 使用 POI 读取Excel文件

    内容简介 本文主要介绍使用POI进行Excel文件的相关操作,涉及读取文件,获取sheet表格,对单元格内容进行读写操作,以及合并单元格的操作. Excel文件目录 Excel模板文件存了resour ...

  6. Spring Boot:添加导出Excel表格功能

    1.添加POI依赖 2.创建EXCEL实体类 3.创建表格工具类 4.创建ExcelConstant 5.创建ExcelController 1.添加POI依赖 <dependency> ...

  7. (ssh整合web导出excel)在ssh框架中使用poi正确导出具有比较高级固定格式的excel 整体过程,查询导出前后台下载

    (一) 接需求  :   需求相关   (贴图 ) 生成三核对文件 1.新增三核对菜单页面中,增加生成三核对文件功能按钮,弹窗可根据变电站.电压等级查询定值单. 2.定值单信息以表格形式展示,根据选择 ...

  8. poi导出excel

    Java使用poi组件导出excel报表,能导出excel报表的还可以使用jxl组件,但jxl想对于poi功能有限,jxl应该不能载excel插入浮动层图片,poi能很好的实现输出excel各种功能, ...

  9. POI导出excel的简单demo

    目前使用过两种导出excel的方式,一种是如题所示的使用POI的方式进行数据的导出,这种方式一般只有在处理比较多的数据或者说需要导出的excel表格中有图片之类的需要特殊处理的文件的时候使用:还有一种 ...

随机推荐

  1. I - Coins dp

    http://acm.hdu.edu.cn/showproblem.php?pid=2844 这个题目是一个多重背包转化成01背包 题意: Whuacmers拥有bi个面值为ai的硬币,现在他要用这些 ...

  2. 前端【JS】,深拷贝与浅拷贝的区别及详解!

    我是前端小白一枚,为了巩固知识和增强记忆,开始整理相关的知识,方便以后复习和面试的时候看看.OK,让我们进入正题~ 先说说浅拷贝和深拷贝的理解吧,个人是这样理解的:两个对象A.B, A有数据B为空,B ...

  3. inode block 软硬链接

    inode block 软硬链接 1 inode 1.1 inode(索引节点)作用 (1)用于存储文件数据属性信息(2)用于存储数据指针信息 1.2 如何产生 格式化时,创建文件系统 1.3 如何查 ...

  4. spring mvc实现转发和重定向

    转发:服务器端请求的跳转 同一个请求之内 重定向:客户端请求的跳转 两次请求 转发和重定向的区别: 1,转发地址栏不会发生变化,重定向地址栏会发生变化. 2,转发请求的参数不会丢失 重定向参数会丢失. ...

  5. C# 多线程猜想

    公司分配给我一个活,让我给Kong网关做一个获取设置的站点.Kong网关号称几万的QPS的神器,我有点慌,如果因为我的站点拖累了Kong我就是千古罪人. 配合Kong的站点必须要经过性能测试,在性能测 ...

  6. opencv-12-高斯滤波-双边滤波(附C++代码实现)

    开始之前 这几天由于自己的原因没有写, 一个是因为自己懒了, 一个是感觉这里遇到点问题不想往下写了, 我们先努力结束这个章节吧, 之前介绍了比较常用而且比较好理解的均值和中值滤波, 但是呢,在例程Sm ...

  7. 【HBase】协处理器是什么?又能干什么?怎么用?

    目录 简单了解 官方帮助文档 协处理器出现的原因 协处理器的分类 Observer Endpoint Phoenix 协处理器的使用 加载方式 静态加载 动态加载 协处理器的卸载 协处理器Observ ...

  8. Qt 操作sql server数据库

    添加qtsql的库 连接数据库 QSqlDatabase_db = QSqlDatabase::addDatabase("QODBC"); _db.setHostName(); _ ...

  9. 数学建模(二)优劣解距离法Topsis模型部分

    步骤: (一)统一指标类型:指标正向化(转化为极大型)(论文) 越大越好极大型指标,效益型指标 越小越好极小型指标,成本型指标 max-x,max=max{xi} 落在某个区间[a,b]是最好的,区间 ...

  10. Nginx|构建简单的文件服务器(mac) 续-FastDFS安装(mac)|文件存储方案

    目录 Nginx|构建简单的文件服务器(mac) 1 所需安装包 2 安装fastdfs-nginx-module-master 3 安装Nginx Nginx|构建简单的文件服务器(mac) 续上文 ...