Easy Excel生成复杂下Excel模板(下拉框)给用户下载

引言

文件的下载是一个非常常见的功能,也有一些非常好的框架可以使用,这里我们就介绍一种比较常见的场景,下载Excel模版,导入功能通常会配有一个模版下载的功能,根据下载的模版,填充数据然后再上传。

需求

如图所示用户下载如下模版,模版中的地区是从数据库中读出来的。
在这里插入图片描述

分析

如果模版都是固定的内容,这种比较简单,我们可以直接把模版上传到我们的文件服务器,用户下载的时候可以直接在文件服务器上下载,或者是把文件放到我们的工程里面,直接读取文件然后以流的方式返回给前端,用户直接下载。
这里比较麻烦点的就是这个模版的内容不是固定的,需要在库里查询出来,写到excel然后在返给前端。同时这个文件又有一定的样式,一般有样式的文件,我们可以根据模版填充,而不是把说有的样式都用程序代码写,程序代码写这种样式会很麻烦。所以我们这里用的方式就是填充模版

准备模版

把准备好的模版放到我们工程里面,创建文件夹template 并把文件夹设置为resource,设置为resoucre后该文件夹下面的文件在mvn打包的时候回合我们的java类打在同一个路径下,方便我们获取文件
在这里插入图片描述
在这里插入图片描述

编写下拉选项的handler

public class SelectSheetWriteHandler implements SheetWriteHandler {private String[] list;private int firstRow;private int lastRow;private int firstCol;private int lastCol;public SelectSheetWriteHandler(String[] list, int firstRow, int lastRow, int firstCol, int lastCol) {this.list = list;this.firstRow = firstRow;this.lastRow = lastRow;this.firstCol = firstCol;this.lastCol = lastCol;}@Overridepublic void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {}@Overridepublic void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {// 区间设置 第一列第一行和第二行的数据。由于第一行是头,所以第一、二行的数据实际上是第二三行CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol);DataValidationHelper helper = writeSheetHolder.getSheet().getDataValidationHelper();DataValidationConstraint constraint = helper.createExplicitListConstraint(list);DataValidation dataValidation = helper.createValidation(constraint, cellRangeAddressList);dataValidation.setShowErrorBox(true);writeSheetHolder.getSheet().addValidationData(dataValidation);}
}

下载的方法

 public void export(HttpServletResponse response) throws IOException {//模板文件InputStream templateFile = TenantInsuranceFundServiceImpl.class.getResourceAsStream("/五险一金导入模板.xlsx");//导出后的文件名String fileName =  "五险一金导入模板";List<BaseDictionaryVO> baseDictionaryVOS = dictionaryService.queryDictionaryDetail(DictionaryEnum.AREA.getCode(), DictionaryEnum.AREA.getName());Set<String> areaNameList = new HashSet<>();if(!CollectionUtils.isEmpty(baseDictionaryVOS)){areaNameList = baseDictionaryVOS.stream().map(BaseDictionaryVO::getName).collect(Collectors.toSet());}SelectSheetWriteHandler selectSheetWriteHandler = new SelectSheetWriteHandler(areaNameList.toArray(new String[areaNameList.size()]), 2, 5000, 0, 0);//写入ExcelWriter excelWriter = null;try {//流输出excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(templateFile).registerWriteHandler(selectSheetWriteHandler).build();WriteSheet writeSheet = EasyExcel.writerSheet().build();// 直接写入list数据 这里没有数据需要填写直接一个空集合excelWriter.fill(Arrays.asList(),  writeSheet);//浏览器下载操作response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");excelWriter.finish();} catch (Exception e) {// 重置responseresponse.reset();response.setContentType("application/json");response.setCharacterEncoding("utf-8");Map<String, String> map = new HashMap<String, String>();map.put("code", "1");map.put("message", "下载模板失败" + e.getMessage());response.getWriter().println(JSON.toJSONString(map));} finally {// 千万别忘记关闭流if (excelWriter != null) {excelWriter.finish();}}}

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

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

相关文章

TrustGeo代码理解(七)preprocess.py

代码链接:https://github.com/ICDM-UESTC/TrustGeo 一、导入各种模块和数据库 # Load data and IP clusteringimport math import random import pandas as pd import numpy as np import argparse from sklearn import preprocessing from lib.utils import MaxMinScaler …

设计模式——外观模式(结构型)

引言 外观模式是一种结构型设计模式&#xff0c; 能为程序库、 框架或其他复杂类提供一个简单的接口。 ​ 问题 假设你必须在代码中使用某个复杂的库或框架中的众多对象。 正常情况下&#xff0c; 你需要负责所有对象的初始化工作、 管理其依赖关系并按正确的顺序执行方法等。…

C#动态生成带参数的小程序二维码

应用场景 在微信小程序管理后台&#xff0c;我们可以生成下载标准的小程序二维码&#xff0c;提供主程序入口功能。在实际应用开发中&#xff0c;小程序二维码是可以携带参数的&#xff0c;可以动态进行生成&#xff0c;如如下场景&#xff1a; 1、不同参数决定的显示界面不同…

MQTT中的保留消息(Retained Message)

一条保留消息是MQTT中保留标志设置为true的一条普通消息。代理&#xff08;broker&#xff09;为对应的主题保留最后的保留消息及对应的QoS。每一个订阅了该主题的客户端在订阅之后会马上收到这个保留消息。代理&#xff08;broker&#xff09;为每个主题只存储一条保留消息。本…

Docker本地镜像发布到阿里云或私有库

本地镜像发布到阿里云流程 &#xff1a; 1.自己生成个要传的镜像 2.将本地镜像推送到阿里云: 阿里云开发者平台:开放云原生应用-云原生&#xff08;Cloud Native&#xff09;-云原生介绍 - 阿里云 2.1.创建仓库镜像&#xff1a; 2.1.1 选择控制台&#xff0c;进入容器镜像服…

MQTT的奇妙之旅:探索RabbitMQ Web MQTT插件的威力【RabbitMQ 十一】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 MQTT的奇妙之旅&#xff1a;探索RabbitMQ Web MQTT插件的威力 前言第一&#xff1a;揭秘RabbitMQ Web MQTT插件背景和目的&#xff1a;MQTT 协议简介&#xff1a;WebSockets 和 MQTT 的融合&#xff1…

谣言检测常用数据集汇总

Pheme-R 获取地址&#xff1a;https://figshare.com/articles/dataset/PHEME_rumour_scheme_dataset_journalism_use_case/2068650 PHEME社交媒体谣言数据集:这些谣言与9条不同的突发新闻有关。它是为分析社交媒体谣言而创建的&#xff0c;并包含由谣言推文发起的推特对话;这些…

竞赛保研 python区块链实现 - proof of work工作量证明共识算法

文章目录 0 前言1 区块链基础1.1 比特币内部结构1.2 实现的区块链数据结构1.3 注意点1.4 区块链的核心-工作量证明算法1.4.1 拜占庭将军问题1.4.2 解决办法1.4.3 代码实现 2 快速实现一个区块链2.1 什么是区块链2.2 一个完整的快包含什么2.3 什么是挖矿2.4 工作量证明算法&…

flink安装

什么是flink flink是一个分布式&#xff0c;高性能&#xff0c;随时可用的以及准确的流处理计算框架&#xff0c; flink可以对无界数据&#xff08;流处理&#xff09;和有界数据&#xff08;批处理&#xff09;进行有状态计算&#xff08;flink天生支持状态计算&#xff09;…

开源 CAD 计算机辅助设计软件,基于 Node.js 开发,使用浏览器进行访问-供大家学习研究参考

下载&#xff1a;开源CAD计算机辅助设计软件&#xff0c;基于Node.js开发&#xff0c;使用浏览器进行访问-供大家学习研究参考资源-CSDN文库 https://download.csdn.net/download/weixin_43097956/88623022

Web开发:ibatis的使用笔记

一、简介 ibatis是一个基于SQL映射支持Java和.NET的持久层框架&#xff1a; 1.如下所示id是对应程序的statement&#xff0c;resultClass需要填写SQL查询到的字段对应的类的命名空间类名&#xff08;DAO.QueryForList<实体类>&#xff09;&#xff0c;以此完成持久层和…

Redis新数据类型-Bitmaps

目录 Bitmaps 简介 命令 1. setbit (1) 格式 (2) 实例 2. getbit (1) 格式 (2) 实例 3. bitcount (1) 格式 (2) 实例 4. bitop (1) 格式 (2) 实例 我的其他博客 Bitmaps 简介 Bitmaps 是 Redis 的一种新数据类型&#xff0c;它是一种用于存储位信息的数据结构&…

【FPGA】Verilog:解码器 | 实现 2-4 解码器

实践内容&#xff1a;解释 2 至 4 解码器的结果和仿真过程 (包括真值表创建和 k 映射、AND 门&#xff09;。 0x00 解码器&#xff08;Decoder&#xff09; 解码器是一种根据输入信号从多个输出 bit 中只选择一个的设备。 例如&#xff0c;如果有一个解码器接收一个 2 位二进…

基于spacy的句法依存、实体识别、分析

文章目录 简介spaCy特性&#xff1a; 系统环境与版本安装应用示例参考文献 简介 spaCy spaCy 是一个 Python 和 CPython 的 NLP 自然语言文本处理库。因此它是一个非常快的库。它建立在最新的研究基础上&#xff0c;从设计的第一天起就被用于实际产品中。 spaCy 自带预训练的…

好用的硬盘分区工具,傲梅分区助手 V10.2

傲梅分区助手软件可以帮助用户在硬盘上创建、调整、合并、删除分区&#xff0c;以及管理磁盘空间等操作。它可以帮助你进行硬盘无损分区操作。 支持系统 目前这款软件支持 Windows 7、Windows 8、Windows 10、Windows 11 等个人系统&#xff0c;还支持 Windows 2012/2016/2019…

五金品牌网站建设的效果如何

五金产品多而广&#xff0c;无论零售还是批发&#xff0c;都有很高需求&#xff0c;市场中也林立着众多大小品牌&#xff0c;在实际经营中&#xff0c;五金也分为多个类目&#xff0c;同时高需求下相关企业也面临着一些痛点&#xff1a; 1、品牌传播难 对普通消费者来说&…

android下的app性能测试应主要针对那些方面,如何开展?

如何开展安卓手机下的App性能测试&#xff0c;对于优秀的测试人员而言&#xff0c;除了要懂得性能测试的步骤流程外&#xff0c;还应该懂的性能测试的一些其他知识&#xff0c;比如性能测试指标、各指标的意义&#xff0c;常用的性能测试工具、如何查看结果分析等等知识。所以本…

linux空洞文件以及多线程写入

介绍空洞文件 Linux空洞文件&#xff08;hole file&#xff09;是一种特殊类型的文件&#xff0c;其大小可能超过实际存储的数据量。在空洞文件中&#xff0c;文件系统会为文件分配磁盘空间&#xff0c;但实际上只在文件中存储了部分数据&#xff0c;其余部分被称为"空洞…

linux应用程序直接return与exit的区别

在Linux应用程序中&#xff0c;可以使用return语句直接从main函数返回。这将导致程序终止并返回给操作系统。然而&#xff0c;有时候使用exit函数比直接使用return语句更有优势&#xff0c;以下是一些原因&#xff1a; 清理资源&#xff1a;exit函数可以确保在程序终止之前执行…

C/C++常见面试知识总结(三)

C语言是一种通用计算机&#xff08;高级&#xff09;编程语言&#xff1b;面向过程&#xff1b;广泛应用于计算机系统设计以及应用程序编写&#xff1b;设计目标&#xff0c;是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行…