Web项目利用EasyExcel实现Excel的导出操作

早期Java使用的一些解析,到处excel的框架存在种种问题被遗弃,现在使用阿里巴巴所提供的EasyExcel已成为一种主流,本篇将详细介绍该功能在Web项目中如何实际应用。

详细操作文档:写Excel | Easy Excel

一、项目演示

在后台管理界面中,使用Excel到处表格的功能较为常见,如下所示:

1.1 引入Maven依赖

            <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version></dependency>

1.2 观察Demo 

可以看出,该步骤其实主要分为以下四步:

  1. 设置下载文件的请求头
  2. 获取需要导出的数据
  3. 把数据写入Excel中
  4. 如果出现异常需要返回对应的Json字符串

主要代码预览:

1.3 设置下载文件的请求头

这里我们是通过自己实现的WebUtil工具类来实现设置下载文件的请求头,其实跟给出的Demo没什么区别,只是做了一层封装。

1.4 获取需要导出的数据

这里利用mp提供的list方法查询出来需要导出的数据,暂且存入到 categoryVos中,但是由于Category中的属性过多,所以我们这里创建了一个ExcelCategoryVo的对象用来存储,

注意这个对象需要添加上相应的注解才行:

后续,我们通过自己实现的Bean拷贝的工具类,将原先不符合条件的类转为符合条件的类,也就是上面我们展示的ExcelCategoryVo类,工具类如下:

package com.fox.utils;import org.springframework.beans.BeanUtils;import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;public class BeanCopyUtils {private BeanCopyUtils() {}public static <T> T copyBean(Object source,Class<T> clazz) {//创建目标对象T result = null;try {result = clazz.newInstance();//实现属性copyBeanUtils.copyProperties(source, result);} catch (Exception e) {e.printStackTrace();}//返回结果return result;}public static <E,T> List<T> copyBeanList(List<E> list, Class<T> clazz){
//        List<T> result = new ArrayList<>();
//        for (E e : list) {
//            T t = copyBean(e, clazz);
//            result.add(t);
//        }
//        return result;return list.stream().map(E -> copyBean(E, clazz)).collect(Collectors.toList());}
}

 1.5 把数据写入Excel中

观察Demo,大致是需要修改这三处地方:

DownloadData也就是我们实际需要存储到Excel中的对象:

sheet大致我们可以从英文字符中得出,他应该就是Excel中表的名字:

利用Ctrl+P,根据idea的提示,doWrite方法可以传入Collection的实现类,观察Demo中的data()方法其实是返回一个list集合,里面存储的是写入的对象

那么我们也可以返回一个list集合:

1.6 返回异常信息

 ResponseResult是我自定义的统一格式响应体:

可能有人会问,为什么这个方法的返回值是空呢? 而不是一般项目要求的统一格式返回体呢?

这是因为这里根据EasyExcel的Demo中所演示的,该方法其实已经将文件信息写入Json字符串中返回去了,如果这个时候再设置返回一个ResponseResult(自定义的统一格式返回体),那么浏览器就无法解析这个响应到底是哪个了,所以这里设置这个方法的返回值为void,也就是空。

运行程序,响应成功:

 下载成功后的Excel展示:

1.7 最终代码展示: 

controller层:

package com.fox.contrller;import com.alibaba.excel.EasyExcel;
import com.alibaba.fastjson.JSON;
import com.fox.domain.ResponseResult;
import com.fox.domain.entity.Category;
import com.fox.domain.vo.CategoryVo;
import com.fox.domain.vo.ExcelCategoryVo;
import com.fox.enums.AppHttpCodeEnum;
import com.fox.service.CategoryService;
import com.fox.utils.BeanCopyUtils;
import com.fox.utils.WebUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.util.List;@RestController
@RequestMapping("/content/category")
public class CategoryController {@Autowiredprivate CategoryService categoryService;@GetMapping("/export")public void export(HttpServletResponse response) {try {//设置下载文件的请求头WebUtils.setDownLoadHeader("分类.xlsx",response);//获取需要导出的数据List<Category> categoryVos = categoryService.list();List<ExcelCategoryVo> excelCategoryVos = BeanCopyUtils.copyBeanList(categoryVos, ExcelCategoryVo.class);//把数据写入到Excel中EasyExcel.write(response.getOutputStream(), ExcelCategoryVo.class).autoCloseStream(Boolean.FALSE).sheet("分类导出").doWrite(excelCategoryVos);} catch (Exception e) {//如果出现异常也要响应JsonResponseResult result = ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR);WebUtils.renderString(response, JSON.toJSONString(result));}}
}

 WebUtil工具类:

package com.fox.utils;import org.springframework.web.context.request.RequestContextHolder;import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;public class WebUtils
{/*** 将字符串渲染到客户端* * @param response 渲染对象* @param string 待渲染的字符串* @return null*/public static void renderString(HttpServletResponse response, String string) {try{response.setStatus(200);response.setContentType("application/json");response.setCharacterEncoding("utf-8");response.getWriter().print(string);}catch (IOException e){e.printStackTrace();}}public static void setDownLoadHeader(String filename, HttpServletResponse response) throws UnsupportedEncodingException {response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");String fname= URLEncoder.encode(filename,"UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition","attachment; filename="+fname);}
}

Bean拷贝工具类 

package com.fox.utils;import org.springframework.beans.BeanUtils;import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;public class BeanCopyUtils {private BeanCopyUtils() {}public static <T> T copyBean(Object source,Class<T> clazz) {//创建目标对象T result = null;try {result = clazz.newInstance();//实现属性copyBeanUtils.copyProperties(source, result);} catch (Exception e) {e.printStackTrace();}//返回结果return result;}public static <E,T> List<T> copyBeanList(List<E> list, Class<T> clazz){
//        List<T> result = new ArrayList<>();
//        for (E e : list) {
//            T t = copyBean(e, clazz);
//            result.add(t);
//        }
//        return result;return list.stream().map(E -> copyBean(E, clazz)).collect(Collectors.toList());}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/674959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx与history路由模式:刷新页面404问题

使用nginx部署前端项目&#xff0c;路由模式采用history模式时&#xff0c;刷新页面之后&#xff0c;显示404。 路由模式 前端路由的基本作用为&#xff1a; ①当浏览器地址变化时&#xff0c;切换页面&#xff1b; ②点击浏览器后退、前进按钮时&#xff0c;更新网页内容&…

基于ISO13400 (DoIP) 实现车辆刷写

近年来&#xff0c;在整车研发中基于以太网实现车辆高带宽通讯无疑是人们热议的话题。无论是车内基于车载以太网来减少线束成本&#xff0c;实现ADAS、信息娱乐系统等技术&#xff0c;还是基于新的电子电气架构以及远程诊断需求来实现以太网诊断&#xff08;DoIP&#xff09;&a…

BUGKU-WEB 留言板

题目描述 题目无需登录后台&#xff01;需要xss平台接收flag&#xff0c; http协议需要http协议的xss平台打开场景后界面如下&#xff1a; 解题思路 看到此类的题目&#xff0c;应该和存储型xss有关&#xff0c;也就是将恶意代码保存到服务器端即然在服务器端&#xff0c;那就…

【Cocos入门】场景切换(loadScene、preloadScene)

一、loadScene 加载场景 loadScene(sceneName: string, onLaunched: Director.OnSceneLaunched, onUnloaded: Director.OnUnload) : boolean 通过场景名称进行加载场景。返回值为布尔类型 参数&#xff1a; NameTypeDescriptionsceneNamestring场景名称onLaunchedDirector.O…

基于Chrome插件的Chatgpt对话无损导出markdown格式(Typora完美显示)

刚刚提交插件到Chrome插件商店正在审核&#xff0c;想尝试的可以先使用&#xff1a; https://github.com/thisisbaiy/ChatGPT-To-Markdown-google-plugin/tree/main 我将源代码上传至了GitHub&#xff0c;欢迎star, IssueGoogle插件名称为&#xff1a;ChatGPT to MarkDown plus…

3.1 Verilog 连续赋值

关键词&#xff1a;assign&#xff0c; 全加器 连续赋值语句是 Verilog 数据流建模的基本语句&#xff0c;用于对 wire 型变量进行赋值。&#xff1a; 格式如下 assign LHS_target RHS_expression &#xff1b; LHS&#xff08;left hand side&#xff09; 指赋值操作…

C#委托的前世今生

起因 很多C#初学者&#xff0c;都遇到过这样的问题——线程间操作无效&#xff0c;从不是创建控件的线程访问它。 今天就这个问题&#xff0c;展开分析。 溯源 先说下这个问题产生的根源。 大家都知道&#xff0c;程序运行起来之后&#xff0c;首先会有一个主线程&#xff…

中小型网络系统总体规划与设计方法

目录 1.基于网络的信息系统基本结构 2.网络需求调研与系统设计原则 3.网络用户调查 4.网络节点地理位置分布情况 5.网络需求详细分析 6.应用概要分析 7.网络工程设计总体目标与设计原则 8.网络结构与拓扑构型设计方法 9.核心层网络结构设计 10.接入核心路由器 11.汇聚…

Android 环境搭建

1、桥接工具安装 网站地址&#xff1a;AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载 使用安装包&#xff1a; adb 查看当前链接成功的设备&#xff1a;adb devices 使用adb shell指令来进入到手机的后台&#xff1a;

Redis 持久化对性能有何影响?

Redis 持久化对性能的影响 Redis 是一个高性能的内存数据存储系统&#xff0c;通常被用于缓存、消息队列和数据存储等方面。由于 Redis 是基于内存的&#xff0c;因此它的读写速度非常快&#xff0c;可以满足高并发、低延迟的应用需求。但是&#xff0c;当 Redis 需要持久化数…

探索STM32CubeMX:图形化工具简化嵌入式软件开发

STM32CubeMX是由STMicroelectronics提供的一款图形化工具&#xff0c;旨在简化STM32微控制器的嵌入式软件开发过程。它提供了一种快速、直观的方式来生成初始化代码并配置STM32微控制器&#xff0c;帮助开发人员节省宝贵的开发时间&#xff0c;并降低入门门槛。本文将探索STM32…

政安晨:快速学会~机器学习的Pandas数据技能(四)(汇总与映射)

从数据中提取价值&#xff01; 概述 在上一篇文章中&#xff0c;我们学习了如何从DataFrame或Series中选择相关数据。从我们的数据表示中选择正确的数据对于完成工作非常重要&#xff0c;正如我们在练习中所演示的那样。 然而&#xff0c;数据并不总是以我们想要的格式直接从…

【力扣】两数之和,暴力枚举 + 哈希表

两数之和原题地址 方法一&#xff1a;暴力枚举 首先&#xff0c;我们需要枚举数组中所有可能的下标对组合&#xff0c;对于 n 个数的数组&#xff0c;从中选两个下标&#xff0c;有 种可能。做法很简单&#xff0c;遍历数组中的所有元素&#xff0c;对于每一个元素&#xff…

【Java EE】----SpringBoot的日志文件

1.SpringBoot使用日志 先得到日志对象通过日志对象提供的方法进行打印 2.打印日志的信息 3.日志级别 作用&#xff1a; 可以筛选出重要的信息不同环境实现不同日志级别的需求 ⽇志的级别分为&#xff1a;&#xff08;1-6级别从低到高&#xff09; trace&#xff1a;微量&#…

【QT+QGIS跨平台编译】之三十一:【FreeXL+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、FreeXL介绍二、文件下载三、文件分析四、pro文件五、编译实践一、FreeXL介绍 【FreeXL跨平台编译】:Windows环境下编译成果(支撑QGIS跨平台编译,以及二次研发) 【FreeXL跨平台编译】:Linux环境下编译成果(支撑QGIS跨平台编译,以及二次研发) 【FreeXL跨平台…

【JS逆向五】逆向模拟某网站的生成的【jsonKey】值 仅供学习

逆向日期&#xff1a;2024.02.07 使用工具&#xff1a;Node.js 加密方法&#xff1a;AES 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 可使用AES进行解密处理&#xff08;直接解密即可&#xff09;&#xff1a;在线AES加解密工具 1、打开…

多路服务器技术如何处理大量并发请求?

在当今的互联网时代&#xff0c;随着用户数量的爆炸性增长和业务规模的扩大&#xff0c;多路服务器技术已成为处理大量并发请求的关键手段。多路服务器技术是一种并行处理技术&#xff0c;它可以通过多个服务器同时处理来自不同用户的请求&#xff0c;从而显著提高系统的整体性…

彩虹系统7.0免授权+精美WAP端模板源码

最低配置环境 PHP7.2 1、上传源码到网站根目录&#xff0c;导入数据库文件 2、修改数据库配置文件&#xff1a;/config.php 3、后台&#xff1a;/admin 账号&#xff1a; 4、前台用户&#xff1a;123456 密码&#xff1a;1234561

【lv5-7】

bootloader 在操作系统运行前的一小段代码&#xff0c;将软硬件环境初始化到一个合适的状态&#xff0c;为操作系统的加载和运行做好准备。 bootloader ->初始化软硬件环境 ->引导加载linux内核 ->给linux内核传参 ->执行用户命令 bootload是启动程序的总称&#x…