SpringBoot实现数据导出成Excel

SpringBoot实现Excel读取在另一篇文章 文章地址:
https://blog.csdn.net/qq_45367825/article/details/111411691

这是本人写的一个SpringBoot对Excel写入的方法,实测能用,待提升的地方有很多,有不足之处请多多指点。
Excel2003版(后缀为.xls)最大行数是65536行,最大列数是256列。
Excel2007以上的版本(后缀为.xlsx)最大行数是1048576行,最大列数是16384列。
若数据量超出行数,需要进行脚页的控制,这一点没做,因为一般100W行已够用。
提供3种方法写入:
1.根据给定的实体类列List和列名数组arr[]进行Excel写入
2.根据给定的List和key的顺序数组key[]进行Excel写入
3.根据给定的List按顺序Excel写入,列名数组arr[]需要自行和数据列顺序进行一一对应

同名的Excel会被覆盖!!!

写入Excel所需要的几个类

1.在pom.xml加上依赖

</dependencies><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.0.1</version></dependency>
</dependencies>

2.ExcelPOJO实体类

package com.cly.utils.Excel;/*** @author : CLy* @ClassName : ExcelPOJO* @date : 2020/7/9 17:13* 实体类所有成员变量都需要有GET,SET方法* 所有成员变量都要加上注解@excelRescoure(value = "?"),?为Excel真实列名,必须一一对应* @excelRescoure(value = "?"),?可为空,需要用到才赋值* 成员变量目前只允许String,Double,Interge,Float**/public class ExcelPOJO  {public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPasswork() {return passwork;}public void setPasswork(String passwork) {this.passwork = passwork;}public String getLook() {return look;}public void setLook(String look) {this.look = look;}@excelRescoure(value = "姓名")private  String name;@excelRescoure(value = "密码")private  String passwork;@excelRescoure(value = "工号")private  String look;@Overridepublic String toString(){return "name:"+this.getName()+",passwork:"+this.getPasswork()+",look:"+this.getLook();}public ExcelPOJO() {}
}

3.@interface自定义注解(用于实体类读取)

package com.cly.utils.Excel;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** @author : CLy* @ClassName : myRescoure* @date : 2020/7/10 9:31**/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface excelRescoure {String value() default "";//默认为空
}

4.excelWrite类(写入Excel数据类)有很多冗余的代码,可抽离出来

package com.cly.utils.Excel;import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletResponse;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.*;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.*;/*** @author : CLy* @ClassName : excelWrite* @date : 2020/7/17 17:01**/
public class excelWrite {//日志输出private static Logger logger = LoggerFactory.getLogger(excelWrite.class);/*** 方法一:* 实体类数据写入新建的excel* @path:excel文件路径* @array[]:文件首行数据列名,可为空,为空时不存在首行列名* @list<T>:实体类数据数列*/public static <T> String writeToExcelByPOJO(String path, String[] array, List<T> list)  {/* for (T t : list) {System.out.println(t);}*///创建工作薄Workbook wb = new XSSFWorkbook();/**标题和页码*/CellStyle titleStyle = wb.createCellStyle();// 设置单元格对齐方式titleStyle.setAlignment(HorizontalAlignment.CENTER); // 水平居中//titleStyle.setVerticalAlignment(); // 默认垂直居中// 设置字体样式Font titleFont = wb.createFont();titleFont.setFontHeightInPoints((short) 12); // 字体高度titleFont.setFontName("黑体"); // 字体样式titleStyle.setFont(titleFont);//创建sheetSheet sheet = wb.createSheet("第一页");sheet.autoSizeColumn(0);// 自动设置宽度// 在sheet中添加标题行Row row = sheet.createRow((int) 0);// 行数从0开始for (int i = 0; i < array.length; i++) {Cell cell = row.createCell(i);cell.setCellValue(array[i]);cell.setCellStyle(titleStyle);}/**数据样式*/// 数据样式 因为标题和数据样式不同 需要分开设置 不然会覆盖CellStyle dataStyle = wb.createCellStyle();// 设置居中样式dataStyle.setAlignment(HorizontalAlignment.CENTER); // 水平居中/**处理实体类数据并写入*///获取当前的泛型对象Object obj = list.get(0);ArrayList arrayList = new ArrayList();//LinkedHashMap保证顺序LinkedHashMap<String, Object> POJOfields = getPOJOFieldAndValue(obj);for (int i = 0; i < array.length; i++) {for (Map.Entry<String, Object> map : POJOfields.entrySet()) {if (map.getKey().equals(array[i])) {arrayList.add(map.getValue());}}}if (array.length != arrayList.size()) {return "标题列数和实体类标记数不相同";}try {//数据从序号1开始int index = 1;//利用迭代器,遍历集合数据,产生数据行Iterator<T> it = list.iterator();while (it.hasNext()) {row = sheet.createRow(index);// 默认的行数从0开始,为了统一格式设置从1开始,就是从excel的第二行开始index++;T t = (T) it.next();//System.out.println("t:" + t);for (int i = 0; i < arrayList.size(); i++) {String fieldName = (String) arrayList.get(i);//System.out.println(fieldName);String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);//System.out.println(getMethodName);Class<? extends Object> tCls = t.getClass();// 泛型为Object以及所有Object的子类//System.out.println(tCls);Method method = tCls.getMethod(getMethodName, new Class[]{});// 通过方法名得到对应的方法//PropertyDescriptor pd = new PropertyDescriptor((String) arrayList.get(i), it.getClass());//获取成员变量的get方法//Method method = pd.getWriteMethod();Object value = method.invoke(t, new Object[]{});// 动态调用方,得到属性值//System.out.println(value.toString());Cell cell = row.createCell(i);if (value != null) {if (value instanceof Date) {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");value = simpleDateFormat.format(value);}cell.setCellValue(value.toString());// 为当前列赋值cell.setCellStyle(dataStyle);//设置数据的样式}}}FileOutputStream fileOut = new FileOutputStream(path);wb.write(fileOut);fileOut.flush();wb.close();fileOut.close();return "success";} catch (Exception e) {e.printStackTrace();}return "faile";}/*** 获取对应的实体类成员*/private static LinkedHashMap<String, Object> getPOJOFieldAndValue(Object T) {//声明返回结果集LinkedHashMap<String, Object> result = new LinkedHashMap<>();Field[] fields = T.getClass().getDeclaredFields();//获取属性名if (fields != null) {for (Field field : fields) {excelRescoure Rescoure = field.getAnnotation(excelRescoure.class);if (Rescoure.value() != null && !"".equals(Rescoure.value())) {result.put(Rescoure.value(), field.getName());}}} else {logger.warn("实体类:" + T + "不存在成员变量");return null;}return result;}/**---------------------===================================================---------------------------**//*** 方法2:* HashMap数据写入新建的excel* @path:excel文件路径* @array[]:文件首行数据列名,可为空,为空时不存在首行列名* @List<Map<?,?>>:HashMap数据数列* @key:hashmap里面的key值,需要一一对应列名的顺序* */public  static  String writeToExcelByHashMap (String path, String[] array, List<HashMap> list,String[] key){//创建工作薄Workbook wb = new XSSFWorkbook();/**标题和页码*/CellStyle titleStyle = wb.createCellStyle();// 设置单元格对齐方式titleStyle.setAlignment(HorizontalAlignment.CENTER); // 水平居中//titleStyle.setVerticalAlignment(); // 默认垂直居中// 设置字体样式Font titleFont = wb.createFont();titleFont.setFontHeightInPoints((short) 12); // 字体高度titleFont.setFontName("黑体"); // 字体样式titleStyle.setFont(titleFont);//创建sheetSheet sheet = wb.createSheet("第一页");sheet.autoSizeColumn(0);// 自动设置宽度// 在sheet中添加标题行Row row = sheet.createRow((int) 0);// 行数从0开始for (int i = 0; i < array.length; i++) {Cell cell = row.createCell(i);cell.setCellValue(array[i]);cell.setCellStyle(titleStyle);}/**数据样式*/// 数据样式 因为标题和数据样式不同 需要分开设置 不然会覆盖CellStyle dataStyle = wb.createCellStyle();// 设置居中样式dataStyle.setAlignment(HorizontalAlignment.CENTER); // 水平居中/**数据写入*///数据从序号1开始try {int index = 1;for (int i = 0; i < list.size(); i++) {row = sheet.createRow(index);// 默认的行数从0开始,为了统一格式设置从1开始,就是从excel的第二行开始index++;HashMap hashMap= list.get(i);for (int j = 0; j < key.length; j++) {Cell cell = row.createCell(j);cell.setCellValue(hashMap.get(key[j]).toString());// 为当前列赋值cell.setCellStyle(dataStyle);//设置数据的样式}}FileOutputStream fileOut = new FileOutputStream(path);wb.write(fileOut);fileOut.flush();wb.close();fileOut.close();return "success";}catch (Exception e){e.printStackTrace();}return "faile";}/**------------------===========================================================------------------------------------------------------*//*** 方法3:* HashMap数据写入新建的excel* @path:excel文件路径* @array[]:文件首行数据列名,可为空,为空时不存在首行列名,列名需要和数列的数据顺序一一对应* @List<List>:数列数据数列** */public  static String writeToExcelByList(String path, String[] array, List<List> list){//创建工作薄Workbook wb = new XSSFWorkbook();/**标题和页码*/CellStyle titleStyle = wb.createCellStyle();// 设置单元格对齐方式titleStyle.setAlignment(HorizontalAlignment.CENTER); // 水平居中//titleStyle.setVerticalAlignment(); // 默认垂直居中// 设置字体样式Font titleFont = wb.createFont();titleFont.setFontHeightInPoints((short) 12); // 字体高度titleFont.setFontName("黑体"); // 字体样式titleStyle.setFont(titleFont);//创建sheetSheet sheet = wb.createSheet("第一页");sheet.autoSizeColumn(0);// 自动设置宽度// 在sheet中添加标题行Row row = sheet.createRow((int) 0);// 行数从0开始for (int i = 0; i < array.length; i++) {Cell cell = row.createCell(i);cell.setCellValue(array[i]);cell.setCellStyle(titleStyle);}/**数据样式*/// 数据样式 因为标题和数据样式不同 需要分开设置 不然会覆盖CellStyle dataStyle = wb.createCellStyle();// 设置居中样式dataStyle.setAlignment(HorizontalAlignment.CENTER); // 水平居中/**数据写入*///数据从序号1开始try {int index = 1;for (int i = 0; i < list.size(); i++) {row = sheet.createRow(index);// 默认的行数从0开始,为了统一格式设置从1开始,就是从excel的第二行开始index++;List data= list.get(i);for (int j = 0; j < data.size(); j++) {Cell cell = row.createCell(j);cell.setCellValue(data.get(j).toString());// 为当前列赋值cell.setCellStyle(dataStyle);//设置数据的样式}}FileOutputStream fileOut = new FileOutputStream(path);wb.write(fileOut);fileOut.flush();wb.close();fileOut.close();return "success";}catch (Exception e){e.printStackTrace();}return "faile";}
}

5.测试类,同名的Excel会被覆盖

package com.cly.utils.Excel;import java.util.*;/*** @author : CLy* @ClassName : WriteTest* @date : 2020/7/31 15:26**/
public class WriteTest {public static void main(String[] args) throws Exception {/**实体类测试* writeToExcelByPOJO(String path, String[] array, List<T> list)* @path:excel文件路径* @array[]:文件首行数据列名,可为空,为空时不存在首行列名* @list<T>:实体类数据数列* 注意同名的Excel会被覆盖,请写好文件名字和对应的后缀*/ExcelPOJO excelPOJO = new ExcelPOJO();excelPOJO.setName("name");excelPOJO.setPasswork("pass");excelPOJO.setLook("look");ExcelPOJO POJO2 = new ExcelPOJO();POJO2.setName("name2");POJO2.setPasswork("pass2");POJO2.setLook("look2");ExcelPOJO POJO3 = new ExcelPOJO();POJO3.setName("name3");POJO3.setPasswork("pass3");POJO3.setLook("look3");List<ExcelPOJO> list = new ArrayList<>();list.add(excelPOJO);list.add(POJO2);list.add(POJO3);/**列名对应实体类中成员变量@excelRescoure的值,只需要写入要的列明,不必全部成员变量都写上*/String[] arr = {"姓名", "密码"};String s = excelWrite.writeToExcelByPOJO("D:\\123.xls", arr, list);System.out.println(s);/**HashMap测试* writeToExcelByHashMap (String path, String[] array, List<HashMap> list,String[] key)* @path:excel文件路径* @array[]:文件首行数据列名,可为空,为空时不存在首行列名* @List<Map<?,?>>:HashMap数据数列* @key:hashmap里面的key值,需要一一对应列名的顺序* 注意同名的Excel会被覆盖,请写好文件名字和对应的后缀*/HashMap hashMap= new HashMap<>();hashMap.put("1","q");hashMap.put("0","w");hashMap.put("5","e");hashMap.put("2","r");HashMap hashMap2= new HashMap<>();hashMap2.put("1","q2");hashMap2.put("0","w2");hashMap2.put("5","e2");hashMap2.put("2","r2");/**列名顺序*/String[] arr2 = {"第一列","第二列","第三列","第四列"};/**HashMap中的数据KEY对应列名顺序,不存在列名或顺序要求可随意,但该数组数据必须要*/String[] key = {"0","1","2","5"};List list = new ArrayList();list.add(hashMap);list.add(hashMap2);String s = excelWrite.writeToExcelByHashMap("D:\\123.xls", arr2, list,key);System.out.println(s);/**List测试* writeToExcelByList(String path, String[] array, List<List> list)* @path:excel文件路径* @array[]:文件首行数据列名,可为空,为空时不存在首行列名,列名需要和数列的数据顺序一一对应* @List<List>:数列数据数列* 注意同名的Excel会被覆盖,请写好文件名字和对应的后缀*/String[] arr3 = {"第一列","第二列","第三列","第四列"};List data = new ArrayList();data.add("1");data.add("2");data.add("3");data.add("4");List data2 = new ArrayList();data2.add("5");data2.add("6");data2.add("7");data2.add("8");List<List> list1 = new ArrayList();list1.add(data);list1.add(data2);String s = excelWrite.writeToExcelByList("D:\\123.xls", arr3, list1);System.out.println(s);}
}

6.运行结果和说明

1.实体类测试结果


2.HashMap测试

3.List测试


还有很多不足的地方,请多多指点,希望能给你带来帮助。

SpringBoot实现数据导出成Excel相关推荐

  1. Pl/sql 如何将oracle的表数据导出成excel文件?

    oracle将表数据导出成excel文件的方法 1)在SQL窗体上,查询需要导出的数据 --查询数据条件--select MID,CODE,NAME from Dxc_Goods_Cate where ...

  2. 查询php 输出表格,php输出excel表格数据-PHP如何将查询出来的数据导出成excel表格(最好做......

    PHP如何将查询出来的数据导出成excel表格(最好做... php 把数据导出excel表格有多种方法,使用 phpExcel 等,以下代码接通过 header 生成 excel 文件的代码示例: ...

  3. Vue将echarts数据导出成excel文件

    Vue将echarts数据导出成excel文件 一.下载vendor插件 下载 vendor 文件放置项目的 src 目录下 链接:https://pan.baidu.com/s/1XYYQ186zo ...

  4. 关于数据导出成excel表

    关于数据导出成excel表 咱们这里分享简单导出成excel表和筛选导出excel表,希望对各位有帮助,欢迎大家交流和点赞!!!! 我在这里使用的是一个导出工具类,如下: package cn.ms. ...

  5. vue导出excel加一个进度条_vue项目中如何把数据导出成excel文件

    Loading... 关于vue中如何把数据导出成excel文件 ### 1. 安装依赖 ``` yarn add file-saver yarn add xlsx yarn add script-l ...

  6. jQuery表格数据导出成Excel插件

    下载地址 一款能将网页上的Table表格数据导出成Excel文件的插件,这个导出插件使用jQuery代码实现的,很实用的导出Excel插件. dd:

  7. 使用SpringBoot+MongoDB数据导出为Excel文件

    MongoDB数据导出为Excel文件 注: 本文使用的是POI导出文件 导出数据两种创建工作簿的方式 // 创建工作簿 XSSFWorkbook wb = new XSSFWorkbook(); / ...

  8. Android将数据库数据导出成excel格式的文本(CSV)

    在做Android软件的时候往往随着时间的推移数据会越来越多,这个时候想要查看数据的时候到数据库里面去查看的话就会很麻烦,所以有时候需要将数据库里面的数据导出来用office打开看会更加方便.导出ex ...

  9. 关于ASP.NET 将数据导出成Excel 的总结[下]

    使用ExcelHelper 封装类,将DataSet 输出成Excel文件的多个Sheet 页. 使用代码如下: public partial class _Default : System.Web. ...

最新文章

  1. VS2015下OpenGL库的配置
  2. Python 定时任务的实现方式
  3. 【codevs1306】广播操的游戏
  4. osgi:install_OSGi服务测试助手:ServiceRegistrationRule
  5. layui弹出层html,layui-弹出层
  6. 如何灵活使用 ActionBar, Google 音乐ActionBar 隐藏和显示效果
  7. JAVA常见算法题(二十五)
  8. 解密《一个操作系统的实现》这本书
  9. windows ping 间隔_对于常用的ping命令,这些小技巧你不一定知道
  10. UE4 蓝图 循环调用
  11. 如何解决unity使用vs2017、vs2018、vs2019等 编辑器创建新项目时无法产生.sln文件的一个小办法
  12. GridView排序
  13. 非线性数学模型线性化
  14. Lifeline功能介绍02——个人事件的添加
  15. 函数调用之特殊三位数
  16. 1米*1米*1米*1米*1米等于什么?
  17. lambda表达式——捕获
  18. 部署SpringBoot+SpringCloud+Vue项目——半途而废版
  19. Excel作图汇总 - Excel2010
  20. 卷积神经网络 图像处理,卷积神经网络图像识别

热门文章

  1. [Java Path Finder][JPF学习笔记][5]编译jpf-symbc报错的解决方法
  2. android系统的优缺点
  3. 安装ubuntu 16.04系统
  4. 一起来探讨Javascript垃圾收集机制
  5. C#实现移动零和爬楼梯
  6. Arduino SPI快速上手
  7. DSICUZ论坛部署环境,超级简单,轻松拿捏
  8. “双碳”背景下 数据中心规划设计的新趋势及展望
  9. 如何实现外网访问内网mysql数据库
  10. 教你让Ubuntu中文程序远离乱码