我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringBoot+EasyPoi实现excel导出功能

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringBoot+EasyPoi实现excel导出功能

在实际项目开发中,对于Excel的导入导出还是很常见的需求,比如说将数据根据模板批量导入到数据库中,以及将数据库中的数据批量导出陈Excel的形式

现有需求: 根据检索条件查询列表并将结果导出到excel

Easypoi文档:https://easypoi.mydoc.io/#text_186900

EasyPoi的主要特点

1.设计精巧,使用简单
2.接口丰富,扩展简单
3.默认值多,write less do more
4.spring mvc支持,web导出可以简单明了

实现过程

1.创建一个Spring Boot项目

快速生成链接:start.spring.io

在这里插入图片描述

2.引入EasyPoi的pom依赖


<!--EasyPoi导入导出-->
<dependency>
   <groupId>cn.afterturn</groupId>
   <artifactId>easypoi-base</artifactId>
   <version>4.3.0</version>
</dependency>
<dependency>
   <groupId>cn.afterturn</groupId>
   <artifactId>easypoi-web</artifactId>
   <version>4.3.0</version>
</dependency>
<dependency>
   <groupId>cn.afterturn</groupId>
   <artifactId>easypoi-annotation</artifactId>
   <version>4.3.0</version>
</dependency>
  • easypoi-base 导入导出的工具包,可以完成Excel导出,导入,Word的导出,Excel的导出功能
  • easypoi-web 耦合了spring-mvc 基于AbstractView,极大的简化spring-mvc下的导出功能
  • easypoi-annotation 基础注解包,作用与实体对象上,拆分后方便maven多工程的依赖管理

sax 导入使用xercesImpl这个包(这个包可能造成奇怪的问题哈),word导出使用poi-scratchpad,都作为可选包了

pom.xml中的所有依赖:


<dependencies>
     <!-- 导入web支持:SpringMVC开发支持,Servlet相关的程序 -->
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
     </dependency>

     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-devtools</artifactId>
         <scope>runtime</scope>
         <optional>true</optional>
     </dependency>
     <dependency>
         <groupId>org.projectlombok</groupId>
         <artifactId>lombok</artifactId>
         <optional>true</optional>
     </dependency>
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
     </dependency>
     <!-- mybatis相关的依赖 -->
     <!--mybatis-plus自动的维护了mybatis以及mybatis-spring的依赖,
     在springboot中这三者不能同时的出现,避免版本的冲突,表示:跳进过这个坑-->
     <!--mybatis-plus-->
     <dependency>
         <groupId>com.baomidou</groupId>
         <artifactId>mybatis-plus-boot-starter</artifactId>
         <version>3.4.3</version>
     </dependency>
     <!--mysql驱动-->
     <dependency>
         <groupId>mysql</groupId>
         <artifactId>mysql-connector-java</artifactId>
         <scope>runtime</scope>
     </dependency>
     <!-- alibaba的druid数据库连接池 -->
     <dependency>
         <groupId>com.alibaba</groupId>
         <artifactId>druid</artifactId>
         <version>1.1.20</version>
     </dependency>
     <!-- alibaba的druid数据库连接池 -->
     <dependency>
         <groupId>com.alibaba</groupId>
         <artifactId>druid-spring-boot-starter</artifactId>
         <version>1.1.20</version>
     </dependency>
     <!--swagger2依赖-->
     <dependency>
         <groupId>io.springfox</groupId>
         <artifactId>springfox-swagger2</artifactId>
         <version>2.9.2</version>
         <!--排除自身的依赖1.5.20版本-->
         <exclusions>
             <exclusion>
                 <groupId>io.swagger</groupId>
                 <artifactId>swagger-models</artifactId>
             </exclusion>
         </exclusions>
     </dependency>
     <dependency>
         <groupId>io.springfox</groupId>
         <artifactId>springfox-swagger-ui</artifactId>
         <version>2.9.2</version>
     </dependency>
     <!--此版本解决 example="" 造成的 空字符串""无法转成Number 问题-->
     <dependency>
         <groupId>io.swagger</groupId>
         <artifactId>swagger-models</artifactId>
         <version>1.5.21</version>
     </dependency>
     <!--EasyPoi导入导出-->
     <dependency>
         <groupId>cn.afterturn</groupId>
         <artifactId>easypoi-base</artifactId>
         <version>4.3.0</version>
     </dependency>
     <dependency>
         <groupId>cn.afterturn</groupId>
         <artifactId>easypoi-web</artifactId>
         <version>4.3.0</version>
     </dependency>
     <dependency>
         <groupId>cn.afterturn</groupId>
         <artifactId>easypoi-annotation</artifactId>
         <version>4.3.0</version>
     </dependency>

     <!--fastjson-->
     <dependency>
         <groupId>com.alibaba</groupId>
         <artifactId>fastjson</artifactId>
         <version>1.2.71</version>
     </dependency>
 </dependencies>

3.编写excel工具类


package com.example.easypoiexceldemo.utils;

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.BeanUtils;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;


public class ExcelUtils {

    
    public static void exportExcel(HttpServletResponse response, String fileName, Collection<?> list, Class<?> pojoClass) throws IOException {
        if (StringUtils.isBlank(fileName)) {
            //当前日期
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            fileName = df.format(new Date());
        }
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(fileName, fileName, ExcelType.HSSF), pojoClass, list);
        response.setCharacterEncoding("UTF-8");
        response.setHeader("content-Type", "application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xls");
        ServletOutputStream out = response.getOutputStream();
        workbook.write(out);
        out.flush();
    }

    
    public static void exportExcelToTarget(HttpServletResponse response, String fileName, Collection<?> sourceList, Class<?> targetClass) throws Exception {
        List targetList = new ArrayList<>(sourceList.size());
        for (Object source : sourceList) {
            Object target = targetClass.newInstance();
            BeanUtils.copyProperties(source, target);
            targetList.add(target);
        }
        exportExcel(response, fileName, targetList, targetClass);
    }


    
    public static void exportExcel(HttpServletResponse response, String title, String sheetName, String fileName, Collection<?> list, Class<?> pojoClass) throws IOException {
        if (StringUtils.isBlank(fileName)) {
            //当前日期
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            fileName = df.format(new Date());
        }
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(title, sheetName, ExcelType.HSSF), pojoClass, list);
        response.setCharacterEncoding("UTF-8");
        response.setHeader("content-Type", "application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xls");
        ServletOutputStream out = response.getOutputStream();
        workbook.write(out);
        out.flush();
    }
}

4.在实体类上加注解@Excel

我这边使用了lombok。getter setter和构造方法通过注解 @Data @AllArgsConstructor进行添加,不使用lombok也可手动添加。

要导出的数据可在实体类对应属性上方加**@Excel()注解**。可定义导出列的名称、宽度,以及性别可区分化(一般数据库中存储的性别为1和2),日期格式化等等。


package com.example.easypoiexceldemo.excel;

import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.Data;

import java.util.Date;


@Data
public class ProductExcel {

    
    @Excel(name = "商品id")
    private Integer product_id;
    
    @Excel(name="商品标题")
    private String title;
    
    @Excel(name="商品副标题")
    private String sub_title;
    
    @Excel(name="商品售价")
    private Double sale_price;
    
    @Excel(name="创建者")
    private Integer create_by;
    
    @Excel(name="创建时间", format = "yyyy-MM-dd")
    private Date create_time;
    
    @Excel(name="修改时间", format = "yyyy-MM-dd")
    private Date update_time;
    
    @Excel(name="修改者id")
    private Integer update_by;
}

@Excel 作用到filed上面,是对Excel一列的一个描述

@Excel 的属性介绍:

在这里插入图片描述
在这里插入图片描述

5.Controller



    @GetMapping("/excel")
    @ApiOperation("根据检索条件查询列表,导出excel")
    public void export( HttpServletResponse response) throws IOException {
        //根据条件检索列表
        QueryWrapper<Product> queryWrapper = new QueryWrapper();
        //根据条件检索商品列表
        List<Map<String, Object>> list = productService.selectList(queryWrapper);
        //将List<Map<String, Object>>结果集转换成List<ProductExcel>
        List<ProductExcel> productList = MapToEntity.setList(list,ProductExcel.class);
        //导出excel
        ExcelUtils.exportExcel(response,null,productList, ProductExcel.class);
    }

setList方法为工具类,用于将List<Map<String, Object>>结果集转换成List

MapToEntity工具类:


package com.example.easypoiexceldemo.utils;

import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;


public class MapToEntity {

    
    public static <T> List<T> setList(final List<Map<String, Object>> class="lazy" data-srcList, Class<T> clazz) {
        List<T> list = new ArrayList<>();
        for (int i=0;i<class="lazy" data-srcList.size();i++){
            try {
                T t = clazz.newInstance();
                Field[] fields = t.getClass().getDeclaredFields();
                for (Field field : fields) {
                    if (!"serialVersionUID".equals(field.getName())) {
                        //设置对象的访问权限,保证对private的属性的访问
                        field.setAccessible(true);
                        //读取配置转换字段名,并从map中取出数据
                        Object v = class="lazy" data-srcList.get(i).get(field.getName());
                        field.set(t, convert(v, field.getType()));
                    }
                }
                list.add(t);
            } catch (Exception ex) {
                ex.toString();
            }

        };
        return list;
    }

    
    private static <T> T convert(Object obj, Class<T> type) throws ParseException {
        if (obj != null && StringUtils.isNotBlank(obj.toString())) {
            if (type.equals(String.class)) {
                return (T) obj.toString();
            } else if (type.equals(BigDecimal.class)) {
                return (T) new BigDecimal(obj.toString());
            }else if(type.equals(Double.class)){
                return (T) Double.valueOf(obj.toString());
            }else if(type.equals(Integer.class)){
                return (T) Integer.valueOf(obj.toString());
            }else if(type.equals(Date.class)){
                if(obj!=null){
                    String timeStr = String.valueOf(obj);
                    String s[] = timeStr.split("T");
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    return (T) sdf.parse(s[0]+" "+s[1]);
                }else{
                    return null;
                }
            }
            else{
                //其他类型转换
                return (T) obj.toString();
            }

        }
        return null;
    }
}

6.启动项目,进行测试

项目启动成功后,在浏览器中输入 http://localhost:8083/product/excel,进行访问:

在这里插入图片描述

打开导出的excel文档:

在这里插入图片描述

到此这篇关于SpringBoot+EasyPoi实现excel导出的文章就介绍到这了,更多相关SpringBoot实现excel导出内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringBoot+EasyPoi实现excel导出功能

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Easypoi如何实现复杂excel文件导出功能

本篇内容介绍了“Easypoi如何实现复杂excel文件导出功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!之所以用Easypoi我是看中
2023-06-21

JAVA怎么实现导出Excel功能

Java可以通过使用Apache POI库来实现导出Excel功能。下面是一个简单的示例代码:```javaimport org.apache.poi.ss.usermodel.*;import org.apache.poi.xssf.us
2023-10-08

Java如何实现导出Excel功能

这篇文章将为大家详细讲解有关Java如何实现导出Excel功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。刚写了个导入Excel表格,现在来写个导出,其实形式都差不多,废话不多说,贴代码<
2023-06-21

Vue如何实现导出Excel功能

小编给大家分享一下Vue如何实现导出Excel功能,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1.前端主导流程:1.点击页面中导出按钮(注册点击事件)2.事件回调里面,发送请求后台数据3.对后台数据进行处理,完成想要的效
2023-06-20

Java中怎样实现导出Excel功能

这篇文章将为大家详细讲解有关Java中怎样实现导出Excel功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用第三方库实现导出Excel业界有句话:不重复造轮子。 使用工具类可以减少日常繁琐的编码,减
2023-06-14

《springboot中实现excel表格导出》

《springboot中实现excel表格导出》 简介 在Spring Boot中,实现Excel表格导出的方式有很多种,以下是几种常见的方法: 使用Apache POI:Apache POI是一个开源的Java API,用于处理Micro
2023-08-23

Asp.Net Core实现Excel导出功能的实现方法

在web应用程序开发时,或许你会遇到这样的需求,如何在 Asp.Net Core 中实现 excel 或者 word 的导入导出,在 NuGet 上有大量的工具包可以实现这样的功能,本篇就讨论下如何使用 ClosedXML 实现 Excel
2022-06-07

怎么用Vue代码实现导出Excel功能

这篇“怎么用Vue代码实现导出Excel功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么用Vue代码实现导出Excel
2023-07-04

Spring Boot项目怎么实现Excel导入与导出功能

本文小编为大家详细介绍“Spring Boot项目怎么实现Excel导入与导出功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Boot项目怎么实现Excel导入与导出功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入
2023-07-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录