pom.xml

        <dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.9</version>
</dependency>
ExcelUtil.java
package com.zjjw.cases.web;

import com.alibaba.nacos.common.util.UuidUtils;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.springframework.util.StringUtils; @Slf4j
public class ExcelUtil { private static Integer MAXROWS = 1048000; public synchronized static <Ty> void outfile(HttpServletResponse response, Map<String, String> map, String sheetname, List<Ty> list) throws Exception {
String uuid = UuidUtils.generateUuid();
log.info("id:{},执行导出开始",uuid);
//创建poi导出数据对象
SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(1000);
//创建全局样式
CellStyle cellStyle = sxssfWorkbook.createCellStyle();
cellStyle.setFillForegroundColor((short) 10);
cellStyle.setBorderBottom(CellStyle.BORDER_NONE); //下边框
cellStyle.setBorderLeft(CellStyle.BORDER_NONE);//左边框
cellStyle.setBorderTop(CellStyle.BORDER_NONE);//上边框
cellStyle.setBorderRight(CellStyle.BORDER_NONE);//右边框
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); //垂直居中
//cellStyle.setWrapText(true);//自动换行
Font font = sxssfWorkbook.createFont();
font.setFontName("宋体");//设置字体
short pintSize = 10;
font.setFontHeightInPoints(pintSize);//设置字体大小
// font.setBold(true);//加粗
cellStyle.setFont(font);
int integer = list.size();
if (MAXROWS<integer) {
throw new RuntimeException("数据行数超过excel最大数据行数!");
}
if (integer > 0) {
//数据量过大分批拉取
int k = 0;
//一个sheet最大行数
final int pageNum = 500000;
double count = deciMal(integer, pageNum);
double num = Math.ceil(count);
int j = 1;
while (num != 0) {
String newsheetname = sheetname + j;
if (num == 1) {
List<Ty> subList = list.subList(k, integer);
setData(map, newsheetname, sxssfWorkbook, cellStyle, pintSize, subList);
} else {
List<Ty> subList = list.subList(k, k + pageNum);
k = k + pageNum;
// 创建sheet页
setData(map, newsheetname, sxssfWorkbook, cellStyle, pintSize, subList);
}
num--;
j++;
}
} // 下载导出
String filename = sheetname + getNowTime();
//创建一个输出流
OutputStream outputStream = null;
try {
// 设置头信息
response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.ms-excel");
//一定要设置成xlsx格式
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename + ".xlsx", "UTF-8"));
outputStream = response.getOutputStream();
//写入数据
sxssfWorkbook.write(outputStream);
outputStream.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != outputStream) {
outputStream.close();
}
} log.info("id:{},执行导出结束",uuid);
} private static double deciMal(int top, int below) {
float f = (float)top/below;
double result = new BigDecimal(f).setScale(6, BigDecimal.ROUND_HALF_UP).doubleValue();
return result;
} private static <Ty> void setData(Map<String, String> map, String newsheetname, SXSSFWorkbook sxssfWorkbook, CellStyle cellStyle, short pintSize, List<Ty> subList) {
// 创建sheet页
SXSSFSheet sheet = (SXSSFSheet) sxssfWorkbook.createSheet(newsheetname);
int size = map.size() - 1;
/** 合并表头
CellRangeAddress region = new CellRangeAddress(0, 0, (short) 0, (short) size);
//参数1:起始行 参数2:终止行 参数3:起始列 参数4:终止列
sheet.addMergedRegion(region);
SXSSFRow headTitle = sheet.createRow(0);
SXSSFCell cellHeadTitle = headTitle.createCell(0);
cellHeadTitle.setCellValue(newsheetname);
cellHeadTitle.setCellStyle(cellStyle);
//创建表头
SXSSFRow headRow = sheet.createRow(1);*/
Row headRow = sheet.createRow(0);
//设置excel表头
int i = 0;
for (Map.Entry<String, String> entry : map.entrySet()) {
String mapKey = entry.getKey();
String[] split = mapKey.split("-");
mapKey = split[0];
//设置表头宽度
if (split.length > 1) {
int titlewidth = Integer.parseInt(split[1]);
titlewidth = titlewidth * pintSize * 30;
sheet.setColumnWidth(i, titlewidth);
}
Cell cell = headRow.createCell(i);
cell.setCellValue(mapKey);
cell.setCellStyle(cellStyle);
i++;
} // 遍历上面数据库查到的数据
for (Ty t : subList) {
Row dataRow = sheet.createRow(sheet.getLastRowNum() + 1);
Map<String, Object> data = null;
if (t instanceof Map) {
data = (Map<String, Object>) t;
} else {
data = object2Map(t);
}
//设置excel表头
int j = 0;
for (Map.Entry<String, String> entry : map.entrySet()) {
String mapValue = entry.getValue();
Cell cell = dataRow.createCell(j);
Object obj = data.get(mapValue);
String value = "";
if (!StringUtils.isEmpty(obj)) {
value = value + obj;
}
cell.setCellValue(value);
cell.setCellStyle(cellStyle);
j++;
}
}
} private static String getNowTime() //获取当前系统时间并格式化
{
System.setProperty("user.timezone", "GMT+08");
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
int date = calendar.get(Calendar.DATE);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
// String nowTime = year + "-" + month + "-" + date + "-" + hour + "-" + minute + "-" + second;
String nowTime = year + "" + month + "" + date + "" + hour + "" + minute + "" + second;
return nowTime;
} /**
* 实体对象转成Map
*
* @param obj 实体对象
* @return
*/
private static Map<String, Object> object2Map(Object obj) {
Map<String, Object> map = new HashMap<String, Object>();
if (obj == null) {
return map;
}
Class clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields();
try {
for (Field field : fields) {
field.setAccessible(true);
map.put(field.getName(), field.get(obj));
}
} catch (Exception e) {
log.error("object2Map方法异常",e);
}
return map;
} /**
* Map转成实体对象
*
* @param map map实体对象包含属性
* @param clazz 实体对象类型
* @return
*/
private static <T> T map2Object(Map<String, Object> map, Class<T> clazz) {
if (map == null) {
return null;
}
T obj = null;
try {
obj = clazz.newInstance();
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
int mod = field.getModifiers();
if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {
continue;
}
field.setAccessible(true);
String filedTypeName = field.getType().getName();
if (filedTypeName.equalsIgnoreCase("java.util.date")) {
String datetimestamp = String.valueOf(map.get(field.getName()));
if (datetimestamp.equalsIgnoreCase("null")) {
field.set(obj, null);
} else {
field.set(obj, new Date(Long.parseLong(datetimestamp)));
}
} else {
field.set(obj, map.get(field.getName()));
}
}
} catch (Exception e) {
log.error("map2Object方法异常",e);
}
return obj;
} }

springboot poi的更多相关文章

  1. SpringBoot+POI报表批量导出

    由于servletResponse 获取的输出流对象在一次请求中只能输出一次,所以要想实现批量导出报表,需要将excel文件打包成zip格式然后输出. 好了,废话不多说,上代码. 1. 首先,需要导入 ...

  2. 使用poi进行数据的导出Demo

    这是本人在项目中遇到了一个导出数据时,如果该条数据中包含汉字,就会出现excel单元格的大小与期望的样式不一样,也是查找了半天,也没有发现哪里出的问题. 现将一个小Demo奉献在这里,可以在遇到使用p ...

  3. SpringBoot加Poi仿照EasyPoi实现Excel导出

    POI提供API给Java程序对Microsoft Office格式档案读和写的功能,详细功能可以直接查阅API,因为使用EasyPoi过程中总是缺少依赖,没有搞明白到底是什么坑,索性自己写一个简单工 ...

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

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

  5. SpringBoot图文教程9—SpringBoot 导入导出 Excel 「Apache Poi」

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

  6. SpringBoot文件上传与POI的使用

    1.使用springboot上传文件 本文所要源码在一个项目中,源码:https://github.com/zhongyushi-git/springboot-upload-download.git. ...

  7. Springboot+vue前后端分离项目,poi导出excel提供用户下载的解决方案

    因为我们做的是前后端分离项目 无法采用response.write直接将文件流写出 我们采用阿里云oss 进行保存 再返回的结果对象里面保存我们的文件地址 废话不多说,上代码 Springboot 第 ...

  8. SpringBoot集成文件 - 集成POI之Excel导入导出

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能.本文主要介绍通过Spr ...

  9. SpringBoot集成文件 - 如何使用POI导出Word文档?

    前文我们介绍了通过Apache POI导出excel,而Apache POI包含是操作Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API.所以 ...

随机推荐

  1. element 库 date-picker 的 disabledDate 的坑

    概述 今天使用 element 库的 date-picker 组件,使用日期范围,然后使用了 disabledDate 属性,把 2018 年 1 月和 2020 年 12 月之后的日期全部 disa ...

  2. list,string,tuple,dictionary之间的转换

    list,string,tuple,dictionary之间的转换 类型 String List tuple dictionary String - list(str), str.split() tu ...

  3. Jmeter之Synchronizing Timer(同步集合点)

    在性能测试时,需要压测并发,此时就需要用到Synchronizing Timer组件. 一.界面显示 二.配置说明 1.名称:标识 2.注释:备注 3.Grouping (1.Number of si ...

  4. Java ——扩展:内部类 匿名内部类 IO file 设计模式

    内部类的拓展 定义类or方法内部的类 最外层的类只能使用public和默认修饰 class Demo { class A { } public static void main(String[] ar ...

  5. 【HANA系列】SAP HANA日期函数总结

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA日期函数总结   ...

  6. 【bzoj4710】[Jsoi2011]分特产

    JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望任何一个同学因为没有拿到 ...

  7. P1118 [USACO06FEB]数字三角形`Backward Digit Su`… (dfs)

    https://www.luogu.org/problemnew/show/P1118 看的出来是个dfs 本来打算直接从下到上一顿搜索 但是不会 看了题解才知道系数是个杨辉三角....... 这样就 ...

  8. 【转】mysqldump原理探究

    作者:胡儿胡儿 来源:CSDN 原文:https://blog.csdn.net/cug_jiang126com/article/details/49824471 —————————————————— ...

  9. Nginx 配置二级虚拟目录访问 Laravel 重写

    server { listen 80; server_name _; root /opt/sites; index index.php index.html index.htm; etag on; g ...

  10. HNUSTOJ 1444:树的最长路径

    1444: 树的最长路径 时间限制: 1 Sec  内存限制: 128 MB 提交: 18  解决: 7 [提交][状态][讨论版] 题目描述 定义:无向树中结点的路径为该结点所能到达的最远距离:无向 ...