XSSFWorkbook读取模板,批量填充并导出文件

news2024/12/1 0:33:16

1、pom文件导入

<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi</artifactId>
   <version>4.1.0</version>
</dependency>
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml</artifactId>
   <version>4.1.0</version>
</dependency>
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-scratchpad</artifactId>
   <version>4.1.0</version>
</dependency>
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml-schemas</artifactId>
   <version>4.1.0</version>
</dependency>

2、读取模板并导出

@Data
    public static final class Example {
        private List<ExampleChild> child;
        private String orderNum;
        private String sortNum;
        private String barCode;
    }
    @Data
    public static final class ExampleChild {
        private String length;
        private String width;
        private String high;
    }

    //一个Example就是一个sheet
    private void handleData(HttpServletResponse response, List<Example> list) throws IOException {
        //读取模板
        String lastSheetName = list.get(0).getBarCode();
        //模板放在项目的 resource/templates/example.xlsx
        XSSFWorkbook workbook = new XSSFWorkbook(new ClassPathResource("templates/example.xlsx").getInputStream());
        //修改模板第一个sheet名称
        workbook.setSheetName(0, lastSheetName);
        //一个list就是一个sheet
        for (int i = 1; i < list.size(); i++) {
            if(!lastSheetName.equals(list.get(i).getBarCode())){
                workbook.cloneSheet(0, list.get(i).getBarCode());
                lastSheetName = list.get(i).getBarCode();
            }else{
                workbook.cloneSheet(i-1);
            }
        }

        //模板转成存本地的临时文件
        String userHome = System.getProperties().getProperty("user.home") + "/example.xlsx";
        FileOutputStream fos = new FileOutputStream(userHome);
        workbook.write(fos);

        // 加载导出模板,excel模板的项目中路径
        ExcelTemplate excel = new ExcelTemplate(userHome);
        if (!excel.examine()) {
            return;
        }

        for (int l = 0; l < list.size(); l++) {
            LinkedHashMap<Integer, LinkedList<String>> rows = new LinkedHashMap<>();
            Map<String, String> fill = new HashMap<>();
            fill.put("barcode", "1");
            fill.put("sortNum", "2");
            fill.put("width", "3");
            fill.put("length", "4");
            fill.put("range", "5");
            fill.put("name", "6");

            try {
                // 第一个参数,需要操作的sheet的索引
                // 第二个参数,需要复制的区域的第一行索引
                // 第三个参数,需要复制的区域的最后一行索引
                // 第四个参数,需要插入的位置的索引
                // 第五个参数,填充行区域中${}的值
                // 第六个参数,是否需要删除原来的区域
                // 需要注意的是,行的索引一般要减一
                excel.addRowByExist(l, 3, 4, 5, rows, true);
                // 第一个参数,需要操作的sheet的索引
                // 第二个参数,替换sheet当中${<变量的值>}的值
                excel.fillVariable(l, fill);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        String fileName = "样例文件"+new Date().getTime()+".xlsx";
        String fileNameURL = URLEncoder.encode(fileName, "UTF-8");
        response.setContentType("octets/stream");
        response.setHeader("Content-disposition", "attachment;filename=" + fileNameURL + ";" + "filename*=utf-8''" + fileNameURL);
        response.addHeader("Pargam", "no-cache");
        response.addHeader("Cache-Control", "no-cache");
        try (OutputStream os = response.getOutputStream()) {
            // 删除临时文件
            File file = new File(userHome);
            file.deleteOnExit();
            os.write(excel.getBytes());
            os.flush();
        }

    }

示例:

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

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

相关文章

AoMao Editor (angular) 使用 window.print() 实现 html 导出 PDF 记录

目录 一、需求描述 二、使用 jspdf html2canvas 导出遇到的问题 三、window.print() 导出具体实现 【api: toHtml】 一、需求描述 将 AoMao Editor 富文本插件中的内容导出为PDF。 二、使用 jspdf html2canvas 导出遇到的问题 试了很多插件&#xff0c;但 angular 能用的…

NHANES | Roc曲线评估胰岛素抵抗替代物与育龄女性不孕症之间的关联

郑老师统计课程&#xff0c;欢迎点击报名&#xff1a;Nhanes公共数据库挖掘 课程 2023年10月12日&#xff0c;温州医科大学育英儿童医院附属第二医院妇产科学者在《BMC Public Health》&#xff08;三区&#xff0c;IF4.5&#xff09;发表题为&#xff1a;" Association b…

PXI-6608 185745H-02 PXI-6527 185633D-01

PXI-6608 185745H-02 PXI-6527 185633D-01 人工智能技术并不新鲜&#xff0c;但运行它的数据和计算却很新鲜 对于那些对人工智能技术历史感兴趣的人来说&#xff0c;一些今天正在使用的技术从20世纪50年代和60年代就已经存在了。 但是&#xff0c;如果人工智能已经存在了这么…

Linux学习第31天:Linux MISC 驱动实验:温故知新

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 学习是一个不断重复的过程。只有不断的使用、修正&#xff0c;才能越记越牢。将学习到的新的知识点应用到以往的项目经验中&#xff0c;才能不断提升自我&#x…

编译替换内核_设备树_驱动_IMX6ULL

前言&#xff1a; 使用的开发板为韦东山老师的 IMX6ULL 目录 为什么编译驱动程序之前要先编译内核&#xff1f; 1.驱动程序要用到内核文件&#xff1a; 2.编译驱动时用的内核、开发板上运行到内核&#xff0c;要一致&#xff1a; 3.更换板子上的内核后&#xff0c;板子上…

【使用Python编写游戏辅助工具】第五篇:打造交互式游戏工具界面:PySide6/PyQT高效构建GUI工具

前言 这里是【使用Python编写游戏辅助工具】的第五篇&#xff1a;打造交互式游戏工具界面&#xff1a;PySide6/PyQT高效构建GUI工具。本文主要介绍使用PySide6来实现构建GUI工具。 在前面&#xff0c;我们实现了两个实用的游戏辅助功能&#xff1a; 由键盘监听事件触发的鼠标连…

XSAN数据恢复-存储空间架构迁移时误格式化存储系统的XSAN数据恢复案例

XSAN数据恢复环境&#xff1a; 昆腾存储&#xff0c;MAC OS操作系统&#xff0c;存放视频类数据&#xff08;MXF、MOV等格式文件&#xff09;。 XSAN故障&检测&#xff1a; 将存储空间从XSAN架构迁移到STORNEXT架构后&#xff0c;存储空间中数据全部丢失。 故障存储中一共…

【3D图像分割】基于 Pytorch 的 VNet 3D 图像分割3(3D UNet 模型篇)

在本文中&#xff0c;主要是对3D UNet 进行一个学习和梳理。对于3D UNet 网上的资料和GitHub直接获取的代码很多&#xff0c;不需要自己从0开始。那么本文的目的是啥呢&#xff1f; 本文就是想拆解下其中的结构&#xff0c;看看对于一个3D的UNet&#xff0c;和2D的UNet&#x…

QCC TX 音频输入切换+提示声音

QCC TX 音频输入切换提示声音 QCC蓝牙芯片&#xff08;QCC3040 QCC3056 等等&#xff09;&#xff0c;AUX、I2S、USB输入 蓝牙音频输入&#xff0c;模拟输出是最常见的方式。 也可以再此基础上动态切换输入方式。 针对TX切换EQ,调节音量不能出提示声音问题&#xff0c;可以增…

Spring底层原理(五)

Spring底层原理(五) 本章内容 介绍Aware接口与InitializingBean接口、Bean的初始化与销毁、Scope Aware接口 作用:用于注入一些与容器相关的信息 类名作用BeanNameAware注入Bean的名称BeanFactoryAware注入BeanFactory容器ApplicationContextAware注入ApplicationContext容…

Pycharm 对容器中的 Python 程序断点远程调试

pycharm如何连接远程服务器的docker容器有两种方法&#xff1a; 第一种&#xff1a;pycharm通过ssh连接已在运行中的docker容器 第二种&#xff1a;pycharm连接docker镜像&#xff0c;pycharm运行代码再自动创建容器 本文是第一种方法的教程&#xff0c;第二种请点击以上的链接…

JavaScript中BOM与DOM

BOM window对象 所有的浏览器都支持window对象&#xff0c;他表示浏览器窗口&#xff0c; 所有 JavaScript 全局对象、函数以及变量均自动成为 window 对象的成员。 全局变量是 window 对象的属性。全局函数是 window 对象的方法。 接下来要讲的HTML DOM 的 document 也是…

遥遥领先,免费开源的django4-vue3前后端分离项目

星域后台管理系统前端介绍 &#x1f33f;项目简介 本项目前端基于当下流行且常用的vue3作为主要技术栈进行开发&#xff0c;融合了typescript和element-plus-ui&#xff0c;提供暗黑模式和白昼模式两种主题以及全屏切换&#xff0c;开发bug少&#xff0c;简单易学&#xff0c…

攻略合集!游戏要领你一定要知道!

大家好&#xff01;作为游戏玩家&#xff0c;我们都希望在游戏中能够成为顶尖的高手。为了帮助大家更好地掌握游戏的要领&#xff0c;我要分享一些实用的攻略和技巧。 首先&#xff0c;不同游戏有不同的技巧和要领。对于《绝地求生》来说&#xff0c;我们需要注重观察和战略规划…

C++和 C 混合编程处理

原因是因为有很多功能是用 C 语言开发的&#xff0c;而 C是兼容 C 的&#xff0c;C应该能直接使用这些功能&#xff0c;那么我们把 C调用 C 实现的功能的这个做法&#xff0c;称为混合编程 但是用 C 开发的功能&#xff0c;很可能已经用 C 编译器编程成目标文件(或打包成库了)…

Zinx框架-游戏服务器开发001:zinx框架的安装

文章目录 1 zinx下载地址1.1 zinx框架的源码路径&#xff1a;1.2 安装好之后动态库的位置 2 Zinx框架运行的基本概况3 测试Zinx-框架的基本使用3.0 流程预览3.1 初始化框架3.2 标准输入回显标准输出的编写思路3.2.1 回显Echo3.2.2 写标准输入stdin通道类&#xff0c;用通道输入…

协同办公系统:企业提质增效的利器

随着科技的不断发展&#xff0c;企业对于提高工作效率、优化管理流程、降低成本的需求日益迫切。协同办公系统应运而生&#xff0c;成为了许多企业提质增效的利器。那么&#xff0c;协同办公系统究竟是如何帮助企业实现这些目标的呢&#xff1f;本文将从以下几个方面进行详细阐…

【基于MRA:自适应高频融合和注入系数优化:Pansharpening】

Pansharpening Based on Adaptive High-Frequency Fusion and Injection Coefficients Optimization &#xff08;基于自适应高频融合和注入系数优化的全色锐化&#xff09; 全色锐化的目的是将多光谱&#xff08;MS&#xff09;图像与全色&#xff08;PAN&#xff09;图像融…

【实战Flask API项目指南】之六 数据库集成 SQLAlchemy

实战Flask API项目指南之 数据库集成 本系列文章将带你深入探索实战Flask API项目指南&#xff0c;通过跟随小菜的学习之旅&#xff0c;你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧&#xff01; 前言 在上一篇文章中&#xff0c;我们实现了…

私有化部署即时通讯软件WorkPlus,全面适配信创环境

对于企业而言&#xff0c;保护数据的安全至关重要。WorkPlus即时通讯软件允许企业在自己的服务器上部署一套私有化的聊天工具&#xff0c;确保数据完全受控于企业内部。通过私有化部署&#xff0c;企业可以有效地管理和保护敏感信息&#xff0c;防止数据泄露和滥用。 另外&…