快速掌握EasyExcel在web场景中的应用(读和写)

news2024/11/28 5:39:45

目录

一、引入依赖

二、设置表头

三、web下载模板

四、测试下载功能

五、复杂表头

六、写入数据

七、格式优化

7.1 日期自定义转换

7.2 列宽行高注解

八、动态表头

 九、动态表格写入数据


一、引入依赖

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

二、设置表头

@ExcelProperty注解,作用在实体类属性上,用来对应Excel表头和属性。

@Data
public class SteelVarietyInfoVo {

    @ExcelProperty("品种")
    private String variety;

    @ExcelProperty("应用领域")
    private String domain;

    @ExcelProperty("板坯类型")
    private String plateType;

    @ExcelProperty("牌号(钢种)")
    private String steelGrade;

    @ExcelProperty("创建时间")
    private String createTime;

    @ExcelProperty("修改时间")
    private String updateTime;

}

三、web下载模板

@Api(tags = "excel工具")
@RestController
@RequestMapping("excel")
public class ExcelController {
    @Resource
    private SteelVarietyInfoService steelVarietyInfoService;


    @ApiOperation("下载模板")
    @GetMapping("/downloadTemplate")
    public void downloadTemplate(HttpServletResponse response) throws IOException {
        steelVarietyInfoService.downloadTemplate(response);
    }

}
@Service
public class SteelVarietyInfoServiceImpl extends ServiceImpl<SteelVarietyInfoMapper, SteelVarietyInfo> implements SteelVarietyInfoService {

    @Override
    public void downloadTemplate(HttpServletResponse response) throws IOException {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding(StandardCharsets.UTF_8.name());

        String fileName = URLEncoder.encode("品种钢导入模板", StandardCharsets.UTF_8.name());
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        ExcelWriterBuilder write = EasyExcel.write(response.getOutputStream(), SteelVarietyInfoVo.class);
        write.sheet("模板").doWrite(() -> null);
    }
}

四、测试下载功能

 下载功能测试正常。

五、复杂表头

    @ExcelProperty({"时间","创建时间"})
    private String createTime;

    @ExcelProperty({"时间","修改时间"})
    private String updateTime;

通过如上传入String数组,即可生成多级表头。

六、写入数据

我们去数据库查询出所有的数据,然后写入excel对应的表头中。

    @ApiOperation("导出全部数据到Excel")
    @GetMapping("/exportAllDataExcel")
    public void exportAllDataExcel(HttpServletResponse response) throws IOException {
        steelVarietyInfoService.exportAllDataExcel(response);
    }
    @Override
    public void exportAllDataExcel(HttpServletResponse response) throws IOException {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding(StandardCharsets.UTF_8.name());

        String fileName = URLEncoder.encode("品种钢数据", StandardCharsets.UTF_8.name());
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        ExcelWriterBuilder write = EasyExcel.write(response.getOutputStream(), SteelVarietyInfoVo.class);
        List<SteelVarietyInfoVo> list = this.findAllData();
        write.sheet("全部数据").doWrite(list);
    }

    private List<SteelVarietyInfoVo> findAllData() {
        List<SteelVarietyInfo> list = baseMapper.selectList(null);
        List<SteelVarietyInfoVo> voList = new ArrayList<>();
        for(SteelVarietyInfo item : list){
            SteelVarietyInfoVo vo = new SteelVarietyInfoVo();
            BeanUtils.copyProperties(item,vo);
            vo.setCreateTime(item.getCreateTime().toString());
            vo.setUpdateTime(item.getUpdateTime().toString());
            voList.add(vo);
        }
        return voList;
    }

七、格式优化

7.1 日期自定义转换

上面的例子中,我们发现,时间显示格式不符合日常习惯。

我们可以借助easyexcel提供的@DateTimeFormat注解来解决这个问题,但是要注意使用该注解就必须用时间类型去接收,String类型是无法完成转换的。时间类型使用Date、LocalDateTime都可以。

另外注意不要使用Spring提供的@DateTimeFormat注解,否则也无效。

    @DateTimeFormat("yyyy年MM月dd日 HH时mm分ss秒")
    @ExcelProperty({"时间","创建时间"})
    private LocalDateTime createTime;

    @DateTimeFormat("yyyy年MM月dd日 HH时mm分ss秒")
    @ExcelProperty({"时间","修改时间"})
    private LocalDateTime updateTime;
 

当然了,如果你不想用注解,用String类型来接收的话,那么就需要在代码里面自行处理完成后再返回,也是可以的。

7.2 列宽行高注解

我们还发现单元格有的挤在一块儿,建议表头文字占一行显示,这样更好看一点。

注解描述
@ContentRowHeight(10)设置正文行高,作用在类上
@HeadRowHeight(20)设置表头行高,作用在类上
@ColumnWidth(25)设置列宽度,作用在类上、属性上
@Data
@HeadRowHeight(50)
@ContentRowHeight(30)
@ColumnWidth(20)
public class SteelVarietyInfoVo {

    @ExcelProperty("品种")
    private String variety;

    @ExcelProperty("应用领域")
    private String domain;

    @ExcelProperty("板坯类型")
    private String plateType;

    @ExcelProperty("牌号(钢种)")
    private String steelGrade;

    @ColumnWidth(30)
    @DateTimeFormat("yyyy年MM月dd日 HH时mm分ss秒")
    @ExcelProperty({"时间","创建时间"})
    private LocalDateTime createTime;

    @ColumnWidth(30)
    @DateTimeFormat("yyyy年MM月dd日 HH时mm分ss秒")
    @ExcelProperty({"时间","修改时间"})
    private LocalDateTime updateTime;

}

八、动态表头

某些特殊场景下,我们需要动态展示表头,如果像之前这样写死表头就不行了。EasyExcel中也提供了动态表头的使用方法。

使用方式就不再是在对应属性上加上@ExcelProperty注解了。

而是获取到ExcelWriterBuilder对象后,调用head()方法,传递一个表头集合作为参数。

    @ApiOperation("下载动态表头模板")
    @GetMapping("/downloadDynamicHeadTemplate")
    public void downloadDynamicHeadTemplate(HttpServletResponse response) throws  IOException{
        steelVarietyInfoService.downloadDynamicHeadTemplate(response);
    }
    @Override
    public void downloadDynamicHeadTemplate(HttpServletResponse response) throws IOException {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding(StandardCharsets.UTF_8.name());

        String fileName = URLEncoder.encode("动态表头演示模板", StandardCharsets.UTF_8.name());
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        ExcelWriterBuilder write = EasyExcel.write(response.getOutputStream());
        write.head(head()).sheet("模板").doWrite(()->null);

    }

    /**
     * 动态表头
     */
    private List<List<String>> head() {
        List<List<String>> header = new ArrayList<>();

        List<String> head0 = new ArrayList<>();
        head0.add("序号");
        header.add(head0);

        header.add(Arrays.asList("基本信息","姓名"));

        List<String> head2 = new ArrayList<>();
        head2.add("基本信息");
        head2.add("性别");
        List<String> head3 = new ArrayList<>();
        head3.add("基本信息");
        head3.add("联系方式");
        header.add(head2);
        header.add(head3);

        header.add(Arrays.asList("额外信息","兴趣爱好"));
        header.add(Arrays.asList("额外信息","健康状况"));
        header.add(Arrays.asList("额外信息","家庭住址"));

        ArrayList<String> headEnd = new ArrayList<>();
        headEnd.add("是否统计");
        header.add(headEnd);


        return header;
    }

这里提一嘴,表头的返回值是两层List集合   ☞   List<List<String>> head

可以这样理解:外层List表示列,内层List表示行。

 九、动态表格写入数据

    @ApiOperation("导出数据到动态Excel")
    @GetMapping("/exportDataDynamicExcel")
    public void exportDataDynamicExcel(HttpServletResponse response) throws  IOException{
        steelVarietyInfoService.exportDataDynamicExcel(response);
    }
    @Override
    public void exportDataDynamicExcel(HttpServletResponse response) throws IOException {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding(StandardCharsets.UTF_8.name());

        String fileName = URLEncoder.encode("动态表头演示导出数据", StandardCharsets.UTF_8.name());
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        ExcelWriterBuilder write = EasyExcel.write(response.getOutputStream());
        write.head(head()).sheet("清单").doWrite(dynamicData());
    }

    private List<List<String>> dynamicData() {
        List<List<String>> list = new ArrayList<>();
        list.add(Arrays.asList("1","小黑","男","15312345678","唱跳rap篮球","良好","北京市朝阳区xxx","是"));
        list.add(Arrays.asList("2","小白","男","15312341234","护花","良好","北京市朝阳区xxx","是"));
        return list;
    }

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

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

相关文章

Linux——生产者消费者模型和信号量

目录​​​​​​​ 基于BlockingQueue的生产者消费者模型 概念 条件变量的第二个参数的作用 锁的作用 生产者消费者模型的高效性 生产者而言&#xff0c;向blockqueue里面放置任务 消费者而言&#xff0c;从blockqueue里面拿取任务&#xff1a; 总结 完整代码(不含存储…

从零开始搭建一个moveit2简单机械臂模型

文章目录 前言一、设计一个简单机械臂二、构造创建文件关系CMakeLists.txt 修改增加如下&#xff1a;package.xml 修改增加如下&#xff1a;urdf.rviz 全文如下&#xff1a;demo.launch.py 全文如下&#xff1a; launch rviz构造link构造joint 总结 前言 在网上搜了许多文章&a…

游戏互动,用Python点燃【儿童节】的欢乐!

当孩子们踏入人生的旅途时&#xff0c;他们需要的并不仅仅是学习知识&#xff0c;更需要的是在快乐的氛围中成长。六一儿童节即将来临&#xff0c;让我们用Python代码为孩子们送去一份特别的礼物吧&#xff01; 在本篇文章中&#xff0c;我会带领大家一起探索如何利用Python代…

php中文字符串提取方法,preg_replace 和preg_match_all区别

在php中&#xff0c;可以利用以下两种函数来只提取字符串的中文字符 preg_replace()函数 preg_match_all()函数 方法1&#xff1a;使用preg_match_all()函数 preg_match_all()函数配合正则表达式“/[\x{4e00}-\x{9fff}]/u”可以过滤字符串&#xff0c;只获取中文字符。 会…

chatgpt赋能python:Python中[:3]的用法介绍

Python中[:3]的用法介绍 Python是一种高级编程语言&#xff0c;经常被用于数据科学、机器学习、人工智能和Web应用程序开发。在Python中&#xff0c;有许多有用的编程技巧和语法&#xff0c;其中之一就是[:3]。 什么是[:3]&#xff1f; 在Python中&#xff0c;[:3]是一种称为…

研发工程师玩转Kubernetes——使用Ingress进行路由

依据微服务理念&#xff0c;我们希望每个独立的功能由一个服务支持。比如有两个接口&#xff1a;http://www.xxx.com/plus和http://www.xxx.com/minus&#xff0c;前者由一个叫plus-service的服务支持&#xff0c;后者由一个叫minus-service的服务支持。这样就需要一个路由层&a…

华为OD机试真题B卷 Java 实现【查找两个字符串a,b中的最长公共子串】,附详细解题思路

一、题目描述 查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。 注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开! 数据范围:字符串长度1≤length≤300 。 二、输入描述 输入两个字符串…

牛客网刷题学习SQL(五)

SQL25 查找山东大学或者性别为男生的信息 分析&#xff1a; 查看学校为山东大学或者性别为男性的用户的device_id、gender、age和gpa数据&#xff0c;结果不去重。 山东大学 --》 where university“山东大学” 男性—》where gender “male” 结果不去重 所以上面不能使用or&…

改进的yolo目标检测(yolo创新与改进)

目标检测是计算机视觉领域中的一个重要问题,它需要从图像或视频中检测出物体的位置和类别。近年来,深度学习技术在目标检测领域取得了显著的进展,其中一个重要的方法是基于YOLO(You Only Look Once)算法的目标检测。 YOLO算法的优点是速度快,但是在检测小物体和密集物体…

SAP-MM-发票-采购附加成本处理简介

一&#xff0e;采购附加成本处理&#xff1a; 原材料的采购成本包括采购成本&#xff08;采购单价*采购数量&#xff09;和相关采购附加成本&#xff08;运输费、保险费、报关费、仓储费、滞期费、租船费、码头费及代理费等费用&#xff09;&#xff0c;对于采购附加成本主要有…

覆盖标准(白盒、黑盒和灰盒)

覆盖标准(白盒、黑盒和灰盒) 覆盖标准Coverage Criteria 覆盖标准采用软件的抽象表示并将其划分为可测试的功能。 每个功能构成了测试需求的基础——需要由软件的测试套件进行测试的东西。 当测试套件的一个测试用例满足测试要求时&#xff0c;我们说测试要求被覆盖。测试套件…

四、机器人整体结构的稳定性

结构的稳定性是指结构在外界载荷作用下&#xff0c;能否维持自己的形状和位置。如果结构在外界载荷作用下能够维持自己的形状和位置&#xff0c;则称为稳定&#xff1b;如果结构在外界载荷作用下无法维持自己的形状和位置&#xff0c;则称为不稳定。 结构的稳定性是一个相对概念…

管理系统总结(前端:Vue-cli, 后端Jdbc连接mysql数据库,项目部署tomcat里)

根据所学的知识, 写一个管理系统, 顺便总结一些知识点 准备: 前端用vue-cli的框架, 后端用jdbc连接数据库, 项目部署tomcat服务器来完成交互 ●前端的vue-cli框架搭建可以看 点击跳转 的第二小结 ●后端的tomcat在idea里的相关的配置与集成,可以看 点击跳跃 文章目录 一、 前段…

机智云物联网低功耗转接板GE211+机智云APP遥控灯

要实现硬件的智能化&#xff0c;除了硬件本身外&#xff0c;还需要实现&#xff1a;智能云平台、手机 APP、联网模块&#xff0c;每 一个领域都需要专业的团队来支撑。机智云提供完整的解决方案&#xff0c;让厂商或开发者只需要专 注于自身产品硬件。以最小的成本和风险实现硬…

【网络】路由器和无线路由器就这么配置

目录 &#x1f352;常见的接入互联网方式 &#x1f353;WAN配置 &#x1f353;LAN口配置 &#x1f353;WLAN配置 &#x1f353;WLAN安全 &#x1f352;路由设备管理 &#x1f353;路由器内部组件 &#x1f353;Cisco路由器的启动过程 &#x1f353;基础命令 &#x1f34e;show …

数据库中的DDL、DQL、DML、DCL 和 TCL 命令

数据库中的DDL、DQL、DML、DCL 和 TCL 命令 SQLDDL&#xff08;Data Definition Language&#xff09;数据库定义语言DML&#xff08;Data Manipulation Language&#xff09;数据操纵语言TCL&#xff08;Transaction Control Language&#xff09;事务控制语言DQL (Data Query…

UEFI开发环境搭建(Windows)

重拾UEFI学习。 第一步是搭建开发环境&#xff0c;记录如下&#xff1a; 1. 安装开发工具 Visual Studio 2017 python/ASL/NASM 安装到如下目录&#xff1a; c:\Python310 c:\ASL c:\NASM 更新系统变量Path: 新建系统变量PYTHON_HOME 下载EDK2 创建工作目录&#xff…

一个技巧,让ChatGPT学会复杂编程,编程水平逼近人类程序员!

夕小瑶科技说 原创 作者 | 智商掉了一地、Python 随着 AIGC 技术迈出了一大步&#xff0c;ChatGPT 等聊天机器人被频繁地使用在生活和工作中的各个场景。想象一下&#xff0c;当你写代码陷入没有头绪的境地或者无法解决 Bug 时&#xff0c;这种基于大型语言模型&#xff08;LL…

ROS:发布者Publisher的编程实现(C++)

目录 一、话题模型二、创建功能包三、创建Publisher代码四、编译代码五、运行 一、话题模型 图中&#xff0c;我们使用ROS Master管理节点。 有两个主要节点&#xff1a; Publisher&#xff0c;名为Turtle Velocity&#xff08;即海龟的速度&#xff09; Subscriber&#xff0c…

STM32H723ZGT6 LAN8720A LWIP

Stm32CubeMX 版本&#xff1a;6.8.1 硬件库版本&#xff1a;STM32Cube FW_H7 V1.11.0 usart.c#include <stdio.h> #if 1//标准库需要的支持函数 struct __FILE { int handle; }; FILE __stdout; //定义_sys_exit()以避免使用半主机模式 void _…