//实体类
//导出的数据的实体
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的更多相关文章

  1. Java利用POI导入导出Excel中的数据

         首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...

  2. Java POI导入导出Excel

    1.异常java.lang.NoClassDefFoundError: org/apache/poi/UnsupportedFileFormatException 解决方法: 使用的poi的相关jar ...

  3. java中使用poi导入导出excel文件_并自定义日期格式

    Apache POI项目的使命是创造和保持java API操纵各种文件格式基于Office Open XML标准(OOXML)和微软的OLE复合文档格式(OLE2)2.总之,你可以读写Excel文件使 ...

  4. SpringMvc 使用poi导入导出Excel

    Util类 package com.common.util; public class ExportUtil { private XSSFWorkbook wb = null; private XSS ...

  5. springMVC中使用POI方式导出excel至客户端、服务器实例

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 这里的方法支持导出excel至项目所在服务器,或导 ...

  6. java使用poi生成导出Excel(新)

    导出样式: java代码: import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStre ...

  7. 如何用poi生成导出excel

    import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Sheet; import java. ...

  8. java操作Excel的poi的导出Excel表格

    页面布局 点击导出用户:触发函数,直接访问后台 后台方法如下: public String export()throws Exception{ Connection con=null; try { c ...

  9. POI通用导出Excel数据(包括样式设计)

    前言 前一段时间我写过通用的导入Excel,前几天也写了导出pdf格式的,还有我之前搞得导出Word,我在之前的博客也都介绍了导出和导入是一个道理,无非是一个获取一个是赋值.昨天有一位同仁看了我的Ex ...

  10. POI导入导出excel(附工具类)

    关于POI导出excel的功能我在前面的文章已经写过了,POI导出excel的三种方式 , 导出表格数据到excel并下载(HSSFWorkbook版) ,本篇文章主要是将导入导出功能进一步地封装,在 ...

随机推荐

  1. 大家都能看得懂的源码 - 那些关于DOM的常见Hook封装(一)

    本文是深入浅出 ahooks 源码系列文章的第十四篇,该系列已整理成文档-地址.觉得还不错,给个 star 支持一下哈,Thanks. 上一篇我们探讨了 ahooks 对 DOM 类 Hooks 使用 ...

  2. 基于ASP.NET Core 6.0的整洁架构

    大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 本节将介绍基于ASP.NET Core的整洁架构的设计理念,同时基于理论落地的代码 ...

  3. Windows 10 索引设置

    有时候想找一下电脑上的某个文件,但是只记得关键字不记得文件名的信息了.这个时候就会尝试在Windows的窗口中搜索.不过有时候明明文件存在,但是无法找到文件.这个时候就需要检查索引设置了.https: ...

  4. 【项目实战】Kaggle电影评论情感分析

    前言 这几天持续摆烂了几天,原因是我自己对于Kaggle电影评论情感分析的这个赛题敲出来的代码无论如何没办法运行,其中数据变换的维度我无法把握好,所以总是在函数中传错数据.今天痛定思痛,重新写了一遍代 ...

  5. 6.Ceph 基础篇 - CephFS 文件系统

    文章转载自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247485294&idx=1&sn=e9039504 ...

  6. 还不会Traefik?看这篇文章就够了!

    文章转载自:https://mp.weixin.qq.com/s/ImZG0XANFOYsk9InOjQPVA 提到Traefik,有些人可能并不熟悉,但是提到Nginx,应该都耳熟能详. 暂且我们把 ...

  7. salesforce零基础学习(一百一十九)In-App Guidance实现引导页操作功能

    本篇参考: https://help.salesforce.com/s/articleView?id=sf.customhelp_lexguid.htm&type=5 https://deve ...

  8. 关于IDEA中Tomcat中文乱码的解决方案

    进入Tomcat/config文件夹下,打开编辑logging.properties 然后查看该文件内是否存在java.util.logging.ConsoleHandler.encoding = U ...

  9. 一键生成通用高亮代码块到剪贴板,快捷粘贴兼容 TT/WX/BJ 编辑器

    有些在线图文编辑器不支持直接插入代码块,但可以直接粘贴 HTML 格式的高亮代码块. 花了一点时间研究了一下各家的编辑器,规则却各不相同.有的要求代码块被包含于 <code> ... &l ...

  10. Java斗地主(集合综合练习)

    ​ 学完了集合后我们可以开始做一个简易版的 " 斗地主 " 了,但是呢咱们这个斗地主只能实现制造牌,洗牌.发牌.看牌这几个简单的功能,并不是我们玩的 " 真人版斗地主 & ...