一、引入相关依赖

  1. <!--数据导出excel-->
  2. <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
  3. <dependency>
  4. <groupId>org.apache.poi</groupId>
  5. <artifactId>poi</artifactId>
  6. <version>3.17</version>
  7. </dependency>
  8. <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
  9. <dependency>
  10. <groupId>org.apache.poi</groupId>
  11. <artifactId>poi-ooxml</artifactId>
  12. <version>3.17</version>
  13. </dependency>
  14. <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-schemas -->
  15. <dependency>
  16. <groupId>org.apache.poi</groupId>
  17. <artifactId>poi-ooxml-schemas</artifactId>
  18. <version>3.17</version>
  19. </dependency>

二、Controller接口

  1. package com.huang.controller;
  2. import com.huang.mapper.UsersMapper;
  3. import com.huang.util.excelExport.ExcelExport2;
  4. import org.springframework.stereotype.Controller;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import javax.annotation.Resource;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import java.io.IOException;
  10. /**
  11. * @Author:huang
  12. * @Date:2019-09-21 13:13
  13. * @Description:<描述>
  14. */
  15. @Controller
  16. public class TestController {
  17. @Resource
  18. private UsersMapper usersMapper;
  19. @RequestMapping("/test")
  20. public void testExprotExcel(HttpServletResponse response){
  21. //创建一个数组用于设置表头
  22. String[] arr = new String[]{"ID","用户名","账号","密码","备注"};
  23. //调用Excel导出工具类
  24. ExcelExport2.export(response,usersMapper.selectAll(),arr);
  25. }
  26. }

三、工具类

3.1文件导出excel工具类

大体思路是传入一个需要导出的数据集合,获取该对象类,然后遍历集合,使用下面的类操作工具类,通过反射获取对象类的属性的get方法,然后将数据对象的值取出来放到excel里

  1. package com.huang.util.excelExport;
  2. import org.apache.poi.hssf.usermodel.*;
  3. import org.apache.poi.ss.usermodel.Cell;
  4. import org.apache.poi.ss.usermodel.CellType;
  5. import org.apache.poi.ss.usermodel.Row;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. import java.lang.reflect.Field;
  9. import java.lang.reflect.InvocationTargetException;
  10. import java.lang.reflect.Method;
  11. import java.text.SimpleDateFormat;
  12. import java.util.Date;
  13. import java.util.List;
  14. /**
  15. * @Author:haung
  16. * @Date:2019-09-21 11:21
  17. * @Description:Excel导出工具类,依赖于ClassUtil工具类
  18. */
  19. public final class ExcelExport2 {
  20. /**
  21. * 将传入的数据导出excel表并下载
  22. * @param response 返回的HttpServletResponse
  23. * @param importlist 要导出的对象的集合
  24. * @param attributeNames 含有每个对象属性在excel表中对应的标题字符串的数组(请按对象中属性排序调整字符串在数组中的位置)
  25. */
  26. public static void export(HttpServletResponse response, List<?> importlist, String[] attributeNames) {
  27. //获取数据集
  28. List<?> datalist = importlist;
  29. //声明一个工作薄
  30. HSSFWorkbook workbook = new HSSFWorkbook();
  31. //生成一个表格
  32. HSSFSheet sheet = workbook.createSheet();
  33. //设置表格默认列宽度为15个字节
  34. sheet.setDefaultColumnWidth((short) 18);
  35. //获取字段名数组
  36. String[] tableAttributeName = attributeNames;
  37. //获取对象属性
  38. Field[] fields = ClassUtil.getClassAttribute(importlist.get(0));
  39. //获取对象get方法
  40. List<Method> methodList = ClassUtil.getMethodGet(importlist.get(0));
  41. //循环字段名数组,创建标题行
  42. Row row = sheet.createRow(0);
  43. for (int j = 0; j< tableAttributeName.length; j++){
  44. //创建列
  45. Cell cell = row.createCell(j);
  46. //设置单元类型为String
  47. cell.setCellType(CellType.STRING);
  48. cell.setCellValue(transCellType(tableAttributeName[j]));
  49. }
  50. //创建普通行
  51. for (int i = 0;i<datalist.size();i++){
  52. //因为第一行已经用于创建标题行,故从第二行开始创建
  53. row = sheet.createRow(i+1);
  54. //如果是第一行就让其为标题行
  55. Object targetObj = datalist.get(i);
  56. for (int j = 0;j<fields.length;j++){
  57. //创建列
  58. Cell cell = row.createCell(j);
  59. cell.setCellType(CellType.STRING);
  60. //
  61. try {
  62. Object value = methodList.get(j).invoke(targetObj, new Object[]{});
  63. cell.setCellValue(transCellType(value));
  64. } catch (IllegalAccessException e) {
  65. e.printStackTrace();
  66. } catch (InvocationTargetException e) {
  67. e.printStackTrace();
  68. }
  69. }
  70. }
  71. response.setContentType("application/octet-stream");
  72. //默认Excel名称
  73. response.setHeader("Content-Disposition", "attachment;fileName="+"test.xls");
  74. try {
  75. response.flushBuffer();
  76. workbook.write(response.getOutputStream());
  77. } catch (IOException e) {
  78. e.printStackTrace();
  79. }
  80. }
  81. private static String transCellType(Object value){
  82. String str = null;
  83. if (value instanceof Date){
  84. Date date = (Date) value;
  85. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  86. str = sdf.format(date);
  87. }else{
  88. str = String.valueOf(value);
  89. if (str == "null"){
  90. str = "";
  91. }
  92. }
  93. return str;
  94. }
  95. }

3.2类操作工具类

该工具类用于Excel导出工具类里的属性操作

  1. package com.huang.util.excelExport;
  2. import org.springframework.stereotype.Component;
  3. import java.lang.reflect.Field;
  4. import java.lang.reflect.Method;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. /**
  8. * @Author:huang
  9. * @Date:2019-09-21 13:41
  10. * @Description:关于类的操作的工具类
  11. */
  12. public final class ClassUtil {
  13. private ClassUtil() {
  14. throw new Error("工具类不允许实例化!");
  15. }
  16. /**
  17. * 获取类属性
  18. * @param targetObj 要获取属性的类
  19. * @return 含有类属性的集合
  20. */
  21. public static Field[] getClassAttribute(Object targetObj){
  22. Class<?> objectClass = targetObj.getClass();
  23. return objectClass.getDeclaredFields();
  24. }
  25. /**
  26. * 获取对象的所有get或set方法
  27. * @param targetObj 要获取属性的类
  28. * @param methodKeyword get或者set关键字
  29. * @return 含有类get或set方法的集合
  30. */
  31. public static List<Method> getMethod(Object targetObj,String methodKeyword){
  32. List<Method> methodList = new ArrayList<>();
  33. Class<?> objectClass = targetObj.getClass();
  34. Field[] field = objectClass.getDeclaredFields();
  35. for (int i = 0;i<field.length;i++){
  36. //获取属性名并组装方法名
  37. String fieldName = field[i].getName();
  38. String getMethodName = methodKeyword
  39. + fieldName.substring(0, 1).toUpperCase()
  40. + fieldName.substring(1);
  41. try {
  42. Method method = objectClass.getMethod(getMethodName,new Class[]{});
  43. methodList.add(method);
  44. } catch (NoSuchMethodException e) {
  45. e.printStackTrace();
  46. }
  47. }
  48. return methodList;
  49. }
  50. /**
  51. * 获取对象的所有get方法
  52. * @param targetObj 要获取属性的类
  53. * @return 含有类方法的集合
  54. */
  55. public static List<Method> getMethodGet(Object targetObj){
  56. return getMethod(targetObj,"get");
  57. }
  58. /**
  59. * 获取对象的所有set方法
  60. * @param targetObj 要获取属性的类
  61. * @return 含有类方法的集合
  62. */
  63. public static List<Method> getMethodSet(Object targetObj){
  64. return getMethod(targetObj,"set");
  65. }
  66. }

四、后续补充的话

  1. 说实在的,我自己都没想到随便写的东西能有这么高的点击数,这篇文章是做项目的时候第一次遇到导出Excel需求的时候写的,当时头铁硬生生自己造了个轮子出来,上述代码可以用,但是仍然存在表头设置麻烦,内存占用高,而且导出数据可控性低的问题。实际上,针对这个需求,如果是需要导出大量数据而没有排版要求的话,可以用EasyExcel,顺带还能把Excel导入给解决了;如果是需要按照复杂模板导出的话,可以使用jxls,或者大佬进一步封装的jxlss。这些都是实用而且成熟的轮子,无意耽误了各位时间,属实抱歉......

Springboot导出Excel并下载的更多相关文章

  1. JS导出excel设置下载的标题/与angular结合冲突

    2017.8更新 此功能与angular结合使用时,最后一行 document.getElementById("dlink").click(); 与angular的ng-click ...

  2. SpringBoot导出excel数据报错Could not find acceptable representation

    转自:https://blog.csdn.net/mate_ge/article/details/93518286?utm_source=distribute.pc_relevant.none-tas ...

  3. POI导出Excel并下载

    首先在pom.xml添加jar包: <!-- 导出excel --> <dependency> <groupId>org.apache.poi</groupI ...

  4. POI导出excel并下载(以流的形式在客户端下载,不保存文件在服务器上)

    import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; i ...

  5. Java导出excel并下载功能

    我们使用的导出并下载功能是利用一个插件叫POI的插件提供的导出功能,很实用:首先先导入Jar包: Jar包下载地址:http://poi.apache.org/   官方文档地址:http://poi ...

  6. django 导出excel react下载 --- 导出并下载

    Dajngo查询数据,查询出来之后生成Excel保存本地 class ExportExcel(APIView): def post(self, request, *args, **kwargs): e ...

  7. MVC导出Excel,提供下载Excel

    类1: using System.Collections.Generic;using System.Data;using System.Web.Mvc;using System.IO;using Sy ...

  8. Java poi 导出Excel并下载到客户端

    Maven配置,包含了其他文件格式的依赖,就全贴出来了 <dependency> <groupId>org.apache.poi</groupId> <art ...

  9. (十一)SpringBoot导出excel文件

    一:添加POI依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-oox ...

随机推荐

  1. Codeforces Round #371 (Div. 2)

    之前做过E题,是一个DP. A题,水题,两线段求交集. B题,set一下判断即可. C题,水题.但是我写麻烦了,直接转化成二进制再做,比用字符串relize()以后再map要好写得多. D题,交互题, ...

  2. 8.8 JQuery框架

    8.8 JQuery框架 一.JQuery是一个javascript的框架,是对javascript的一种封装. 通过JQuery可以非常方便的操作html的元素\要使用Jquery需要导入一个第三方 ...

  3. 深入理解Java的三大特性之多态

    世界上最美丽的东西,看不见也摸不着,要靠心灵去感受. ——海伦·凯勒 面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响类使用的情况下改变类的内部结构,并保护数据.对 ...

  4. php反序列化笔记

    普通的魔法方法 public,private,protected属性序列化后的不同 绕过wakeup session反序列化 phar反序列化 1.普通的魔法方法 __construct() 创建一个 ...

  5. 查找与排序算法(Searching adn Sorting)

    1,查找算法 常用的查找算法包括顺序查找,二分查找和哈希查找. 1.1 顺序查找(Sequential search) 顺序查找: 依次遍历列表中每一个元素,查看是否为目标元素.python实现代码如 ...

  6. 手把手教你把5V的Arduino改造成3.3V版本

    Arduino Pro Mini是基于ATmega328的微控制板,支持5V/3.3V电压.但是我们比较容易买到的是5V供电的版本,有的时候需要用到3.3V版本(比如我们的软控DAC).怎样才能让这款 ...

  7. 埃利斯(A.Ellis)ABCDE情绪管理理论

    埃利斯(A.Ellis)ABCDE情绪管理理论A :Activating Events(诱发事件)B :Beliefs(个体对诱发事件的评价.解释.看法)C :Consequences(个体情绪和行为 ...

  8. ps在psd格式图片里面切图流程

    第一. 第二. xx的地方自己重新命名 第三. 第四.

  9. 实现超简单的http服务器

    想在Linux下实现一个简单的web Server并不难.一个最简单的HTTP Server不过是一个高级的文件服务器,不断地接收客户端(浏览器)发送的HTTP请求,解析请求,处理请求,然后像客户端回 ...

  10. python之scrapy爬取某集团招聘信息

    1.创建工程 scrapy startproject gosuncn 2.创建项目 cd gosuncn scrapy genspider gaoxinxing gosuncn.zhiye.com 3 ...