//实体类
//导出的数据的实体
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. 第七十五篇:Vue兄弟组件传值

    好家伙, 兄弟组件的传值用到Eventbus组件, 1.EventBus的使用步骤 ① 创建 eventBus.js 模块,并向外共享一个Vue的实例对象 ②在数据发送方, 调用bus.$emit(' ...

  2. Netty整合STOMP

    1.STOMP协议简介 常用的WebSocket协议定义了两种传输信息类型:文本信息和二进制信息.类型虽然被确定,但是他们的传输体是没有规定的,也就是说传输体可以自定义成什么样的数据格式都行,只要客户 ...

  3. SpringBoot使用libreoffice转换PDF

    1.简介 有时候我们需要在程序中使用到office的转换和预览功能,本文就针对这个需求记录了较为简单的office转换和功能:jodconverter.当然也有aspose和其他开源第三方(kkfil ...

  4. day02-代码实现01

    多用户即时通讯系统02 4.编码实现01 4.1功能实现-用户登录 4.1.1功能说明 因为还没有学习数据库,我们人为规定 用户名/id = 100,密码为 123456 就可以登录,其他用户不能登录 ...

  5. ProxySQL介绍

    介绍 ProxySQL是用C++语言开发的,一个轻量级开源软件,性能和功能满足读写中间件所需的绝大多数功能,其配置数据基于SQLite存储,目前已到v2.4.1版本. 功能方面如下: 最基本的读/写分 ...

  6. Centos7新增静态路由

    文章转载自:https://blog.51cto.com/loong576/2417561 环境说明: 一.临时方式 1. 查看路由和ip [root@centos7 ~]# route -n Ker ...

  7. Containerd和Docker的关系

    联系 容器运行时(Container Runtime)是Kubernetes(k8s)最重要的组件之一,负责管理镜像和容器的生命周期.Kubelet通过Container Runtime Interf ...

  8. fastdfs-zyc管理FastDFS的web界面

    俩压缩包根据大小重命名以下,按图片所示 把1_fastdfs-zyc.7z重命名为fastdfs-zyc.7z.001 把2_fastdfs-zyc.7z重命名为fastdfs-zyc.7z.002 ...

  9. 配置Pod的 /etc/hosts

    某些情况下,DNS 或者其他的域名解析方法可能不太适用,您需要配置 /etc/hosts 文件,在Linux下是比较容易做到的,在 Kubernetes 中,可以通过 Pod 定义中的 hostAli ...

  10. 详解JS中 call 方法的实现

    摘要:本文将全面的,详细解析call方法的实现原理 本文分享自华为云社区<关于 JavaScript 中 call 方法的实现,附带详细解析!>,作者:CoderBin. 本文将全面的,详 ...