springboot poi
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的更多相关文章
- SpringBoot+POI报表批量导出
由于servletResponse 获取的输出流对象在一次请求中只能输出一次,所以要想实现批量导出报表,需要将excel文件打包成zip格式然后输出. 好了,废话不多说,上代码. 1. 首先,需要导入 ...
- 使用poi进行数据的导出Demo
这是本人在项目中遇到了一个导出数据时,如果该条数据中包含汉字,就会出现excel单元格的大小与期望的样式不一样,也是查找了半天,也没有发现哪里出的问题. 现将一个小Demo奉献在这里,可以在遇到使用p ...
- SpringBoot加Poi仿照EasyPoi实现Excel导出
POI提供API给Java程序对Microsoft Office格式档案读和写的功能,详细功能可以直接查阅API,因为使用EasyPoi过程中总是缺少依赖,没有搞明白到底是什么坑,索性自己写一个简单工 ...
- 基于springboot跟poi封装的最便捷的excel导出
发布时间:2018-11-15 技术:springboot1.5.6 + maven3.0.5 + jdk1.8 概述 Springboot最便捷的Excel导出,只需要一个配置文件即可搞定 ...
- SpringBoot图文教程9—SpringBoot 导入导出 Excel 「Apache Poi」
有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+ ...
- SpringBoot文件上传与POI的使用
1.使用springboot上传文件 本文所要源码在一个项目中,源码:https://github.com/zhongyushi-git/springboot-upload-download.git. ...
- Springboot+vue前后端分离项目,poi导出excel提供用户下载的解决方案
因为我们做的是前后端分离项目 无法采用response.write直接将文件流写出 我们采用阿里云oss 进行保存 再返回的结果对象里面保存我们的文件地址 废话不多说,上代码 Springboot 第 ...
- SpringBoot集成文件 - 集成POI之Excel导入导出
Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能.本文主要介绍通过Spr ...
- SpringBoot集成文件 - 如何使用POI导出Word文档?
前文我们介绍了通过Apache POI导出excel,而Apache POI包含是操作Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API.所以 ...
随机推荐
- VC CString,int,string,char*之间的转换
CString转string : CString strMfc = "test"; std::string strStr; strStr = strMfc.GetBuffer(); ...
- 32 位bitmap 内存存储 顺序 bgra 前3位 与23位一致。 都是 bgr 呵呵 与rgb 相反
32 位bitmap 内存存储 顺序 bgra 前3位 与23位一致. 都是 bgr 呵呵 与rgb 相反
- Matlab 文件格式化/Matlab Source File Formattor
由于需要使用到别人编写的Matlab代码文件,但是呢不同的人有不同的风格,有的写得就比较糟糕了. 为了更好地理解代码的内容,一个比较美观的代码会让人身心愉悦. 但是在网上并没有找到一个比较好的实现,此 ...
- 【MM系列】SAP 通过原材料找到成品的函数
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP 通过原材料找到成品的函数 ...
- python+selenium下载文件——firefox
修改Firefox的相关配置. 1.profile.set_preference('browser.download.folderList',2) 设置成0代表桌面,1代表下载到浏览器默认下载路径:2 ...
- input输入框的的input事件和change事件以及change和blur事件的区别
input输入框的 oninput事件 ,在用户输入的时候触发,只要元素值发生变化就会触发 input输入框的 onchange事件 ,要在输入框失去焦点的时候触发事件,当鼠标在其他地方点击一下才会触 ...
- 自己写一个Layout
1 Layout是ViewGroup的子类 LinearLayout.FrameLayout都是ViewGroup的子类,自己写的Layout也是ViewGroup的子类. 2 步骤 第一,自己的La ...
- jmeter应用之批量插入数据
上一篇讲到如何在jmeter中配置并连接使用mysql数据库,这一节主要是讲数据库连接的简单应用——批量插入数据 总体步骤如下: 1)新建线程组和添加JDBC Connection Configura ...
- java基础笔记(2)
java中成员变量是有默认初始值的,而局部变量是没有的: 构造方法名和类名相同,没有返回值,即结构如下:public 构造方法名(): 实例化类的本质就是调用了类的构造方法: 如果自定义了构造方法,就 ...
- 不能将X*类型的值分配到X*类型的实体问题的解决方法
今天在学习链表的过程中遇到了这个问题,我用如下方法定义了一个结构体,然后这个函数想要在链表头插入一个节点.但是在函数的最后一行却出现了报错:不能将MyLinkedList * 类型的值分配到MyLin ...