SpringBoot使用poi实现导出excel
//实体类
//导出的数据的实体
public class User {
private String id;
private String name;
private String year;
//省略get和set
}
//存放数据实体类
public class ExportEntity<T> implements Serializable {
Map<String,List<T>> map = new HashMap();
public Map<String, List<T>> getMap() {
return map;
}
public void setMap(Map<String, List<T>> map) {
this.map = map;
}
}
//controller
@Controller
public class UserController {
@Autowired
UserService userService;
@ResponseBody
@RequestMapping("/export")
public void export(HttpServletResponse response){
userService.exportData(response);
}
}
//service
public interface UserService {
void exportData(HttpServletResponse response);
}
//实现该方法
@Service
public class UserServiceImpl implements UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
//导出数据库数据
@Override
public void exportData(HttpServletResponse response){
//存放数据
Map<String, List<User>> map = new HashMap();
//根据年份导出数据
for (int j = 2019; j < 2022 ; j++) {
String sql = "select * from user where year = '"+j+"'";
List<User> listData = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
//key对应年份,value为查出来的数据集合
map.put(String.valueOf(j),listData);
}
ExportEntity<User> export = new ExportEntity();
export.setMap(map);
try {
// excel文件名
String fileName = "export.xls";
//字段名称显示在excel第一行
String[] title = {"主键","名称","年份"};
//字段备注显示在excel第二行
String[] mergeCell = {"ID","name","year"};
//标题要合并几行 没用到
Integer cellNum = title.length - 1;
// 创建HSSFWorkbook
//多个sheet页
HSSFWorkbook wbMulit = ExportUtil.getHSSFWorkbookMulit(title, export, null, mergeCell, cellNum);
//单个sheet页
// HSSFWorkbook wbSingle = ExportUtil.getHSSFWorkbookSingle(title, export, null, mergeCell, cellNum);
// 响应到客户端
this.setResponseHeader(response, fileName);
OutputStream os = response.getOutputStream();
wbMulit.write(os);
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 发送响应流方法
public void setResponseHeader(HttpServletResponse response, String fileName) {
try {
try {
fileName = new String(fileName.getBytes(), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
response.setContentType("application/octet-stream;charset=ISO8859-1");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
response.addHeader("Pargam", "no-cache");
response.addHeader("Cache-Control", "no-cache");
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
//导出方法
import com.qxj.export.entity.ExportEntity;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class ExportUtil {
/**
* 导出多个sheet页Excel
* @param title 标题
* @param map 内容
* @param wb HSSFWorkbook对象
* @return
*/
public static HSSFWorkbook getHSSFWorkbookMulit(String[] title, ExportEntity<?> map, HSSFWorkbook wb, String[] mergeCell, Integer cellNum ){
// 第一步,创建一个HSSFWorkbook,对应一个Excel文件
if(wb == null){
wb = new HSSFWorkbook();
}
String[][] content = new String[0][];
HSSFSheet sheet = null;
//获取到参数中的数据
Map<String, ? extends List<?>> mapData = map.getMap();
List exportEntities = new ArrayList();
//将数据存放到集合中 显示多个个sheet页写法 根据年份创建sheet页
for (int k = 2019; k < 2022; k++) {
for (int i = k; i < k + 1; i++) {
if (i < 2022) {
for (int j = 0; j < mapData.get(String.valueOf(i)).size(); j++) {
exportEntities.add(mapData.get(String.valueOf(i)).get(j));
}
}
}
if(exportEntities.size()!=0) {
//需要导出的数据存入二维数组中
content = new String[exportEntities.size()][title.length];
for (int j = 0; j < exportEntities.size(); j++) {
//拿到需要导出的对象
Object export = exportEntities.get(j);
Class exportClass = export.getClass();
//通过反射获取属性信息
Field[] declaredFields = exportClass.getDeclaredFields();
for (int i = 0; i < declaredFields.length; i++) {
//获得属性
Field field = declaredFields[i];
//打开访问
field.setAccessible(true);
//获取属性名
String name = field.getName();
String value = null;
try {
value = (String) field.get(export);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
content[j][i] = value;
}
}
// 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet 根据年导出显示多个sheet页
sheet = wb.createSheet(String.valueOf(k));
//设置每一列的宽度
for (int i = 0; i < title.length; i++) {
sheet.setColumnWidth(i, 30 * 256);
}
//给单元格设置样式以及创建单元格
style(sheet,wb,mergeCell,title,content);
exportEntities.clear();//清理数据集合
}
}
return wb;
}
/**
* 导出单个sheet页Excel
* @param title 标题
* @param map 内容
* @param wb HSSFWorkbook对象
* @return
*/
public static HSSFWorkbook getHSSFWorkbookSingle(String[] title, ExportEntity<?> map, HSSFWorkbook wb, String[] mergeCell, Integer cellNum ){
// 第一步,创建一个HSSFWorkbook,对应一个Excel文件
if(wb == null){
wb = new HSSFWorkbook();
}
String[][] content = new String[0][];
HSSFSheet sheet = null;
// 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet 只需要一个sheet页放开
sheet = wb.createSheet("sheetName");
//设置每一列的宽度
for (int i = 0; i < title.length; i++) {
sheet.setColumnWidth(i, 30 * 256);
}
Map<String, ? extends List<?>> mapData = map.getMap();
List exportEntities = new ArrayList();
//将数据存放到集合中 显示单个sheet页写法
for (int k = 2019; k < 2022; k++) {
for (int i = 0; i < mapData.get(String.valueOf(k)).size(); i++) {
exportEntities.add(mapData.get(String.valueOf(k)).get(i));
}
}
if(exportEntities.size()!=0) {
//需要导出的数据存入二维数组中
content = new String[exportEntities.size()][title.length];
for (int j = 0; j < exportEntities.size(); j++) {
Object export = exportEntities.get(j);
Class exportClass = export.getClass();
Field[] declaredFields = exportClass.getDeclaredFields();
for (int i = 0; i < declaredFields.length; i++) {
//获得属性
Field field = declaredFields[i];
//打开访问
field.setAccessible(true);
//获取属性名
String name = field.getName();
String value = null;
try {
value = (String) field.get(export);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
content[j][i] = value;
}
}
//给单元格设置样式以及创建单元格
style(sheet,wb,mergeCell,title,content);
exportEntities.clear();//清理数据集合
}
return wb;
}
//表格样式设置和创建单元格
private static void style(HSSFSheet sheet, HSSFWorkbook wb, String[] mergeCell, String[] title, String[][] content){
// 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
HSSFRow row = sheet.createRow(0);
row.setHeightInPoints(30);//设置高度
// 第四步,创建单元格,并设置值表头 设置表头居中 //标题的样式
HSSFCellStyle style = wb.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER);//左右居中
style.setVerticalAlignment(VerticalAlignment.CENTER);//上下居中
style.setBorderRight(BorderStyle.THIN);
style.setBorderBottom(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
style.setBorderTop(BorderStyle.THIN);
Font font = wb.createFont();
font.setColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex());//设置字体颜色
font.setFontName("黑体");//设置字体
font.setFontHeightInPoints((short) 16);//设置字体大小
style.setFont(font);
//数据的样式
HSSFCellStyle styleData = wb.createCellStyle();
styleData.setWrapText(true);//设置自动换行
styleData.setAlignment(HorizontalAlignment.CENTER);//左右居中
styleData.setVerticalAlignment(VerticalAlignment.CENTER);//上下居中
styleData.setBorderBottom(BorderStyle.THIN);
styleData.setBorderLeft(BorderStyle.THIN);
styleData.setBorderRight(BorderStyle.THIN);
styleData.setBorderTop(BorderStyle.THIN);
//声明列对象
HSSFCell cell = null;
for (int i = 0; i < mergeCell.length; i++) {
cell = row.createCell(i);
cell.setCellValue(mergeCell[i]);
cell.setCellStyle(style);
}
//创建标题那一行
HSSFRow rowTitle = sheet.createRow(1);
//创建标题
for (int i = 0; i < title.length; i++) {
cell = rowTitle.createCell(i);
cell.setCellValue(title[i]);
cell.setCellStyle(style);
}
//创建内容
for (int i = 0; i < content.length; i++) {
row = sheet.createRow(i + 2);
for (int j = 0; j < content[i].length; j++) {
//将内容按顺序赋给对应的列对象
cell = row.createCell(j);
cell.setCellValue(content[i][j]);
cell.setCellStyle(styleData);
}
}
}
}
//配置文件
#mysql
#DB
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost/数据库名称
spring.datasource.username=root
spring.datasource.password=root
#JPA
spring.jpa.database=mysql
spring.jpa.show-sql=true
#port
server.port=8088
//依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
<!-- https://mvnrepository.com/artifact/oracle/oracle-jdbc -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.4.0-atlassian-hosted</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
//表结构
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`year` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact;
SET FOREIGN_KEY_CHECKS = 1;
SpringBoot使用poi实现导出excel的更多相关文章
- Java利用POI导入导出Excel中的数据
首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...
- Java POI导入导出Excel
1.异常java.lang.NoClassDefFoundError: org/apache/poi/UnsupportedFileFormatException 解决方法: 使用的poi的相关jar ...
- java中使用poi导入导出excel文件_并自定义日期格式
Apache POI项目的使命是创造和保持java API操纵各种文件格式基于Office Open XML标准(OOXML)和微软的OLE复合文档格式(OLE2)2.总之,你可以读写Excel文件使 ...
- SpringMvc 使用poi导入导出Excel
Util类 package com.common.util; public class ExportUtil { private XSSFWorkbook wb = null; private XSS ...
- springMVC中使用POI方式导出excel至客户端、服务器实例
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 这里的方法支持导出excel至项目所在服务器,或导 ...
- java使用poi生成导出Excel(新)
导出样式: java代码: import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStre ...
- 如何用poi生成导出excel
import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Sheet; import java. ...
- java操作Excel的poi的导出Excel表格
页面布局 点击导出用户:触发函数,直接访问后台 后台方法如下: public String export()throws Exception{ Connection con=null; try { c ...
- POI通用导出Excel数据(包括样式设计)
前言 前一段时间我写过通用的导入Excel,前几天也写了导出pdf格式的,还有我之前搞得导出Word,我在之前的博客也都介绍了导出和导入是一个道理,无非是一个获取一个是赋值.昨天有一位同仁看了我的Ex ...
- POI导入导出excel(附工具类)
关于POI导出excel的功能我在前面的文章已经写过了,POI导出excel的三种方式 , 导出表格数据到excel并下载(HSSFWorkbook版) ,本篇文章主要是将导入导出功能进一步地封装,在 ...
随机推荐
- 如何通过C#/VB.NET设置Word文档段落缩进
缩进是指调整文本与页面边界之间的距离.在水平标尺,有四个段落缩进滑块:首行缩进.悬挂缩进.左缩进以及右缩进.在对于word文档的录入时,常常需要注意录入的格式,通过合理地设置段落格式,可以让文稿看起来 ...
- 记录一个奇葩的问题:k8s集群中master节点上部署一个单节点的nacos,导致master节点状态不在线
情况详细描述; k8s集群,一台master,两台worker 在master节点上部署一个单节点的nacos,导致master节点状态不在线(不论是否修改nacos的默认端口号都会导致master节 ...
- C语言指针笔记01
int num = 90; 定义一个整型变量num int* ptr = # 定义一个整型指针变量ptr,指针变量ptr的类型取决于他所需要指向的变量,如这里,ptr要指向int类型变 ...
- RabbitMQ原理和架构图解(附6大工作模式)
为什么要使用RabbitMQ? 1.解耦 系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦. 2.异步 将消息写入消息队列,非必要的业务逻辑以异步的方式运 ...
- netstat -lnp |grep XXX后不显示进程
netstat -lnp |grep XXX后不显示进程,不一定是没有进程,可能是这个命令不好使,换成 ps -ef | grep XXX
- PTA 乙级解题笔记 1001 害死人不偿命的(3n+1)猜想
卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 (3n+1) 砍掉一半.这样一直反复砍下去,最后一定在某一步得到 n=1.卡拉兹在 1950 ...
- C++面向对象编程之类模板、函数模板等一些补充
1.static数据 和 static函数: 对于 非static函数 在内存中只有一份,当类对象调用时,其实会有该对象的this pointer传进去,那个函数就知道要对那个对象进行操作: stat ...
- 微信电脑版DAT文件转图片工具
一键批量将微信聊天接受到的加密存储DAT图片文件转化为普通图片. 通过查看转化后的图片,您可以: (1)清理无用的历史图片,节省电脑硬盘存储空间. (2)恢复寻找重要照片资料. 下载地址:点此下载 微 ...
- JavaWeb完整案例详细步骤
JavaWeb完整案例详细步骤 废话少说,展示完整案例 代码的业务逻辑图 主要实现功能 基本的CURD.分页查询.条件查询.批量删除 所使用的技术 前端:Vue+Ajax+Elememt-ui 后端: ...
- Vue学习之--------深入理解Vuex之getters、mapState、mapGetters(2022/9/3)
这一篇博客的内容是在上一篇博客的基础上进行:深入理解Vuex.原理详解.实战应用 @ 目录 1.getters的使用 1.1 概念 1.2 用法 1.3 如何读取数据 2.getters在项目中的实际 ...