EasyExcel 实现写入多个sheet数据进excel模板并下载

news2024/11/26 2:35:06

在这里插入图片描述

目录

  • 说明

说明

场景说明:对数据库或者其他数据源读取获取到数据,需要写入到excel完成下载功能,其中一个sheet是固定模板,只需要填充值,另一个sheet是动态的表头和数据需要填充。模板如下图,模板提前放在项目里,免得有问题。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这个案例前还写过一个批量excel打包成zip包下载的,这里的案例和代码注释说明比较清晰,重复的在这里不再多说,建议先看完上一个案例实现再来看这个实现,避免踩坑出不来,跳转链接:EasyExcel 实现 批量生成多sheet多Excel打包zip下载

不多说 直接上代码:

@GetMapping("/upload-xls")
    public void uploadXls() {
        //初始化excel的数据体
        List<Map<String, String>> maps = new LinkedList<>();
        for (int i = 6; i < 13; i++) {
            HashMap<String, String> map = new HashMap<>();
            map.put("name", "小" + i);
            map.put("age", "" + i);
            maps.add(map);
        }
        ExcelWriter excelWriter;
        try {
            // 文件名(这里URLEncoder.encode可以防止中文乱码)
            String fileName = URLEncoder.encode("四(二)班-数据导出", "UTF-8");
            // 设置返回文件信息
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        } catch (Exception e) {
            log.info(e.getMessage(), e);
        }


        //获取模板文件,模板文件需放在 resource下
        String templateExcelFileName = "upload.xlsx";
        InputStream templateExcelInputStream = this.getClass().getClassLoader().getResourceAsStream(templateExcelFileName);
        if (null == templateExcelInputStream) {
            log.error("模板文件不存在!");
        }

        ByteArrayOutputStream outputStream = null;
        ByteArrayOutputStream bos = cloneInputStream(templateExcelInputStream);

        //动态sheet1 Excel表头
        List<String> heads = Arrays.asList("name", "age");
        List<List<String>> excelHeaders = heads.stream().map(Collections::singletonList).collect(Collectors.toList());

        //动态sheet1 Excel数据
        List<List<String>> excelDatas = excelDatas(heads, maps);

        try {
            InputStream copyInputStream = new ByteArrayInputStream(bos.toByteArray());
            outputStream = new ByteArrayOutputStream();
            excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(copyInputStream).excelType(ExcelTypeEnum.XLSX).build();

            WriteSheet writeSheet = EasyExcel.writerSheet(0, "学校信息").build();
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("schoolName", "新民小学");
            map.put("className", "四(二)班");
            map.put("count", maps.size());
            map.put("uploadDate", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(System.currentTimeMillis()));
            excelWriter.fill(map, writeSheet);

            //动态填充表头和内容
            WriteSheet attrSheet = EasyExcel.writerSheet(1, "班级学生信息").build();
            attrSheet.setHead(excelHeaders);
            excelWriter.write(excelDatas, attrSheet);

            excelWriter.finish();
            outputStream.flush();
            outputStream.close();

            copyInputStream.close();
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        } finally {
            if (null != outputStream) {
                try {
                    outputStream.flush();
                    outputStream.close();
                } catch (IOException e) {
                    log.error("导出 excel 时关闭 outputStream 出现异常", e);
                }
            }
        }
    }

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

就先说到这 \color{#008B8B}{ 就先说到这} 就先说到这
在下 A p o l l o \color{#008B8B}{在下Apollo} 在下Apollo
一个爱分享 J a v a 、生活的小人物, \color{#008B8B}{一个爱分享Java、生活的小人物,} 一个爱分享Java、生活的小人物,
咱们来日方长,有缘江湖再见,告辞! \color{#008B8B}{咱们来日方长,有缘江湖再见,告辞!} 咱们来日方长,有缘江湖再见,告辞!

在这里插入图片描述

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

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

相关文章

【简单DP】Children’s Queue

哈哈&#xff0c;独立做出来了&#xff0c;不错感觉这种暴力DP还是很好做的Problem - 1297 (hdu.edu.cn)题意&#xff1a;思路&#xff1a;写了这么多DP&#xff0c;我认识到DP的状态设计是最难的首先看阶段&#xff0c;就是第i个人然后影响决策的因素就是&#xff0c;女生不能…

【docker mysql】docker 快速安装mysql和redis

docker_hub 官网&#xff1a;点击docker_hub仓库地址 docker run --name mysql-bear -p 3307:3306 -e MYSQL_ROOT_PASSWORDmysql-bear -d mysql:latestdocker run --name redis-bear -p 6479:6379 -d redis再次使用docker ps 命令查看即可。 我这里把端口映射到主机上了&…

【Axure教程】橡皮擦的擦除效果——刮奖原型

橡皮擦的擦除效果是系统常见的效果&#xff0c;在可以画图编辑的系统中或者是在抽奖刮奖的系统中非常常见。所以今天和大家分享在Axure中如何制作橡皮刷的效果&#xff0c;我们会议刮奖原型为案例&#xff0c;教大家制作出一个刮奖效果的高保真原型模板。一、效果展示1、鼠标移…

做测试一定要知道的——软件测试流程和测试规范标准文档

目录 1、目的 2、工作范围 3、工作职责 4、测试的流程 5、测试准备阶段 6、测试方法制定阶段 7、测试执行阶段 8、bug管理 9、标准文档 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;配套学习资料和视频教学 1、目的 通…

关于Thread.start()后的困惑、imap

在for循环中&#xff0c;接着开thread&#xff0c;开完就start&#xff0c;当时有个困惑&#xff0c;就是比如开的一个thread的这个start执行完&#xff0c;但是这个for循环还没执行完&#xff0c;那程序会跑到for循环的后面逻辑吗&#xff1f;比如下面13行for循环开始开第一个…

浅谈子网掩码、IP地址、网络地址之间关系

文章目录一、什么是子网掩码二、给定IP地址&#xff0c;如何求网络地址网络标识&#xff08;net-id&#xff09;和主机标识&#xff08;host-id&#xff09;计算步骤三、CIDR地址表示方法(Classless Inter Domain Routing)四、IP地址与MAC地址一、什么是子网掩码 在TCP/IP协议…

阿里云云原生每月动态 | 聚焦实战,面向开发者的系列课程全新上线

作者&#xff1a;云原生内容小组 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》&#xff0c;从趋势热点、产品新功能、服务客户、开源与开发者动态等方面&#xff0c;为企业提供数字化的路径与指南。 本栏目每月更新。 趋势热点 《云原生实战指南》白皮书发布 …

如何使用金山轻维表发送生日祝福、入职纪念日祝福

作为企业HR或行政&#xff0c;如果能在员工生日当天发送一份生日祝福生日礼物&#xff0c;是不是可以给员工强烈的归属感和惊喜&#xff0c;但核查员工生日需要每天对着花名册查询&#xff0c;或单独设置提醒&#xff0c;对HR行政来说又比较繁琐复杂&#xff0c;还经常容易忘&a…

matlab - 特殊矩阵、矩阵求值、稀疏矩阵

学习视频1.特殊矩阵1.1 通用特殊矩阵format % 零矩阵(全0) 幺矩阵(全1) 单位矩阵 % zeros ones eye rand(生成0~1的随机元素) randn(生成均值为1&#xff0c;方差为0的符合正太分布的随机阵)zeros(3) % 3x3的全0方阵 zeros(3, 4) % 3x4的全0矩阵 exA ones(3, 5) % 3x5的…

mapbox-gl实现 2.5D 图层高度编辑器

文章目录前言表达式逻辑mapbox表达式转数学表达式数学表达式转mapbox表达式实现效果前言 mapbox-gl 支持表达式编辑 2.5D 建筑物高度&#xff0c;但是 style 文件原生的表达式很不直观&#xff0c;本文实现一个简单的 2.5D高度图层编辑器&#xff0c;核心是理解mapbox表达式规…

【Sentence Simplification via Large Language Models 论文精读】

Sentence Simplification via Large Language Models 论文精读InformationAbstract1 Introduction2 Related Work3 Sentence Simplification via LLMs4 Experiments4.1 Evaluation Settings4.2 Automatic Evaluation4.3 Human Evaluation4.4 Qualitative Study4.5 Ablation Stu…

开发同城外卖系统源码时应配置哪些功能?外卖系统源码分析

外卖系统大家都不会陌生&#xff0c;我们都会想到某团、某饿这两个行业top&#xff0c;他们已经成为了年轻人手机必备软件之一&#xff0c;而且除了app端外&#xff0c;他们还很贴心开发了微信小程序的版本&#xff0c;免去了下载app的繁琐&#xff0c;打开微信就能使用。那么&…

阿里开源自研高性能核心搜索引擎 Havenask

去年12月&#xff0c;阿里开源了自研的大规模分布式搜索引擎 Havenask&#xff08;内部代号 HA3&#xff09;。 &#xfeff; Havenask 是阿里巴巴内部广泛使用的大规模分布式检索系统&#xff0c;支持了淘宝、天猫、菜鸟、优酷、高德、饿了么等在内整个阿里的搜索业务&#…

点击糖化学试剂361154-30-5,Ac4ManNAz,1,3,4,6-四-O-乙酰基-N-叠氮乙酰基氨基甘露糖

Ac4ManNAz产品描述&#xff1a;N-叠氮乙酰基甘露糖胺-三酰化&#xff08;AC4MANAZ&#xff09;可用作标记试剂&#xff0c;点击糖化学试剂&#xff0c;叠氮化物基团允许它与炔烃反应&#xff0c;是一种含叠氮的代谢糖蛋白标记试剂&#xff0c;叠氮化物修饰的蛋白质可以通过与炔…

webman apidoc安装、生成接口文档

1 npm install apidoc -g 2 apidoc -h 3 新建 apidoc.json { "name": "demo", "version": "1.0.0", "description": apidoc demo", "title": "demo",…

如何提高大数据传输的安全性

面对大数据传输安全相关的挑战和威胁&#xff0c;业界针对安全防护技术进行了针对性的实践和调研。本文主要从平台安全、数据安全、隐私保护三个方面对大数据传输安全技术的发展进行阐述。 如何安全地改进大数据传输&#xff1f; 平台安全、数据安全、隐私保护等相关技术不断完…

springboot原项目配置文件迁移至nacos

目录一、配置文件迁移nacos1.安装nacos2.添加依赖3.改造service-product3.改造server-gateway一、配置文件迁移nacos 1.安装nacos 1&#xff0c;如果之前安装过nacos&#xff0c;nacos数据保存至mysql&#xff0c;先删除已安装的nacos&#xff0c;再安装 docker stop nacos …

自动化测试——多窗口切换和切换frame

这里写目录标题一、多窗口切换1、base.py&#xff1a;公共代码2、切换句柄的方式1&#xff0c;通过for循环3、切换句柄的方式2&#xff0c;通过索引切换4、源代码二、frame窗口1、什么是frame?2、Frame 分类3、判断要定位的元素在不在frame中两种方式方式一&#xff1a;鼠标选…

【Linux】P1 Linux 基础命令(3月3日完成)

Linux 基础命令Linux 目录结构Linux 命令ls 展示命令cd 目录切换命令pwd 查看当前工作目录mkdir 创建新的文件夹其他补充知识前言 本节内容&#xff1a; Linux 基本命令 下节内容&#xff1a; Linux vi 编辑器。 链接&#xff1a; 正文 Linux 目录结构 在耳熟能详的 Windows …

openpnp - error - 吸嘴没下降到板子上, 就将元件松开

文章目录openpnp - error - 吸嘴没下降到板子上, 就将元件松开概述笔记ENDopenpnp - error - 吸嘴没下降到板子上, 就将元件松开 概述 以前用过国内一家openpnp厂家出的设备, 他们家的openpnp是自己改过的. 贴片流程已经走过一遍. 这次还是按照以前记录的笔记, 按照国内那家的…