【JAVA实战】JAVA实现Excel模板下载并填充模板下拉选项数据
背景
有这样一个场景:前端下载Excel模板,进行数据导入,这个下载模板过程需要经过后端接口去数据库查询数据进行某些列的下拉数据填充,下拉填充的数据过程中会出现错误String literals in formulas can’t be bigger than 255 characters ASCII,超过字符限制。
那么,如何解决?
解决方案
引入隐藏区域方式,比如 可以创建一个隐藏Sheet专门存储该下拉填充数据,需要使用到的地方进行引用该Sheet区域范围内容。
实现过程
下载接口
@ApiOperation(value = "下载EXCEL文件模板", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)@GetMapping("/download/{bizType}")public void downloadExcel(HttpServletResponse response, @PathVariable("bizType") String bizType) throws IOException {if (Arrays.stream(AliYunOssBizTypeEnum.values()).noneMatch(x -> x.getCode().equals(bizType))) {throw new RuntimeException("类型有误!");}String fileName = bizType + ".xls";InputStream inputStream = aliYunOssService.download("template/" + fileName);if (inputStream == null) {throw new RuntimeException("获取阿里云文件模板失败,请检查是否上传到阿里云OSS");}HSSFWorkbook wb = new HSSFWorkbook(inputStream);Sheet sheet = wb.getSheetAt(0);ExcelAbstractHandler handler = ExcelHandlerFactory.getHandler(bizType);if (Objects.nonNull(handler)) {// 3. 创建隐藏工作表存储选项Sheet hiddenSheet = wb.createSheet("HiddenSheet");wb.setSheetHidden(wb.getSheetIndex(hiddenSheet), true); // 隐藏工作表handler.handle(hiddenSheet, sheet, bizType);}ServletOutputStream output = response.getOutputStream();response.setContentType("application/vnd.ms-excel");String desc = Arrays.stream(AliYunOssBizTypeEnum.values()).filter(x -> x.getCode().equals(bizType)).findFirst().get().getDesc();fileName = URLEncoder.encode(desc, "UTF-8");response.setHeader("Content-Disposition", "attachment;filename=" + fileName);wb.write(output);output.flush();output.close();wb.close();}
抽象处理器
public abstract class ExcelAbstractHandler {public abstract void handle(Sheet hiddenSheet, Sheet sheet, String bizType);protected void buildDropdownData(Sheet mainSheet, List<String> list, int col, String referenceRange) {if (CollectionUtil.isEmpty(list)) {return;}DataValidationHelper dvHelper = mainSheet.getDataValidationHelper();DataValidationConstraint dvConstraint = dvHelper.createFormulaListConstraint(referenceRange);CellRangeAddressList addressList = new CellRangeAddressList(1, 2000, col, col);DataValidation validation = dvHelper.createValidation(dvConstraint, addressList);mainSheet.addValidationData(validation);}
}
处理工厂类
public class ExcelHandlerFactory {private static final Map<String, ExcelAbstractHandler> handlerMap = new ConcurrentHashMap<>();public static ExcelAbstractHandler getHandler(String type) {return handlerMap.get(type);}public static void register(String type, ExcelAbstractHandler handler) {Assert.notNull(type, "type can't be null");handlerMap.put(type, handler);}
}
产品标准价格模板
@Component
@Slf4j
@RequiredArgsConstructor
public class ExcelProductPlatformPriceHandler extends ExcelAbstractHandler implements InitializingBean {private final BusinessBaseCountryMapper businessBaseCountryMapper;private final BusinessBaseShopPlatformMapper businessBaseShopPlatformMapper;@Overridepublic void afterPropertiesSet() throws Exception {ExcelHandlerFactory.register(AliYunOssBizTypeEnum.PRODUCT_PLATFORM_PRICE.getCode(), this);}@Overridepublic void handle(Sheet hiddenSheet, Sheet sheet, String bizType) {// 1.平台数据List<BusinessBaseShopPlatform> platforms = businessBaseShopPlatformMapper.selectList(Wrappers.lambdaQuery());List<String> platformList = platforms.stream().map(BusinessBaseShopPlatform::getPlatformName).collect(Collectors.toList());// 写入选项到隐藏工作表(逐行填充)for (int i = 0; i < platformList.size(); i++) {Row row = hiddenSheet.createRow(i);Cell cell = row.createCell(0);cell.setCellValue(platformList.get(i));}// 定义引用区域(例如:Hidden!A1:A100)String referenceRange = hiddenSheet.getSheetName() + "!$A$1:$A$" + platformList.size();buildDropdownData( sheet, platformList, 1, referenceRange);// 2.国家数据List<BusinessBaseCountry> countries = businessBaseCountryMapper.selectList(Wrappers.lambdaQuery());List<String> countryList = countries.stream().map(BusinessBaseCountry::getCountryName).collect(Collectors.toList());// 写入选项到隐藏工作表(逐行填充)int preCount = platformList.size();for (int i = preCount; i < (preCount + countryList.size()); i++) {Row row = hiddenSheet.createRow(i);Cell cell = row.createCell(0);cell.setCellValue(countryList.get(i - preCount));}// 定义引用区域(例如:Hidden!A1:A100)referenceRange = hiddenSheet.getSheetName() + "!$A$" + (preCount + 1) + ":$A$" + (preCount + countryList.size());buildDropdownData(sheet, countryList, 2 , referenceRange);}
}
最后
以上是一个简单操作下载导出模板并填充数据后下载模板接口,经供参考!
相关文章:
【JAVA实战】JAVA实现Excel模板下载并填充模板下拉选项数据
背景 有这样一个场景:前端下载Excel模板,进行数据导入,这个下载模板过程需要经过后端接口去数据库查询数据进行某些列的下拉数据填充,下拉填充的数据过程中会出现错误String literals in formulas can’t be bigger than 255 cha…...
java面试笔记(一)
1. 一万个string类型的数据,设计一个算法如何按照String长度来排序 以使用 Arrays.sort() 方法,并结合一个自定义的比较器。以下是实现的示例代码: public class StringLengthSort {public static void main(String[] args) {// 定义一万个字符串的示例…...
【C++】36.C++IO流
文章目录 1. C语言的输入与输出2. 流是什么3. CIO流3.1 C标准IO流3.2 C文件IO流 4. stringstream的简单介绍 1. C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据,并将值存放在变量中。pri…...
Qt5开发入门指南:从零开始掌握跨平台开发
目录 Qt框架概述 开发环境搭建 基础语法与核心机制 第一个Qt窗口程序 常见问题解答 一、Qt框架概述 1.1 什么是Qt? Qt是一个1995年由挪威Trolltech公司开发的跨平台C图形用户界面应用程序框架。最新Qt5版本主要包含: GUI模块:支持Wind…...
Rook-ceph(1.92最新版)
安装前准备 #确认安装lvm2 yum install lvm2 -y #启用rbd模块 modprobe rbd cat > /etc/rc.sysinit << EOF #!/bin/bash for file in /etc/sysconfig/modules/*.modules do[ -x \$file ] && \$file done EOF cat > /etc/sysconfig/modules/rbd.modules &l…...
深度学习在蛋白质-蛋白质相互作用(PPI)领域的研究进展(2022-2025)
一、蛋白质-蛋白质相互作用(PPI)的定义与生物学意义 蛋白质-蛋白质相互作用(Protein-Protein Interaction, PPI)是指两个或多个蛋白质通过物理结合形成复合物,进而调控细胞信号传导、代谢、免疫应答等生命活动的过程。PPI是生物体内复杂功能网络的核心,例如酶与底物的结…...
网络安全学习架构 网络安全架构内容
网上买的《信息安全原理及应用》的书还没到,就找了一本《密码编码学与网络安全》的电子书,写的也不错,计划今天和明天把第一章绪论和第二章的数论给看完 1. 计算机网络安全概念 计算机安全的三个核心是:完整性(只要特…...
硕成C语言24
不管风吹浪打,胜似闲庭信步! 1.选择排序: 不管风吹浪打,胜似闲庭信步!1.选择排序: // 这个宏定义用于忽略 Visual Studio 中一些安全相关的警告,使得可以使用像 scanf 这样的函数而不产生警告…...
《Stable Diffusion绘画完全指南:从入门到精通的Prompt设计艺术》-配套代码示例
第一章:模型加载与基础生成 1.1 基础模型加载 from diffusers import StableDiffusionPipeline import torch# 加载SD 1.5基础模型(FP32精度) pipe StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5",…...
Linux下为Intel核显安装OpenCL
实验环境 CPU:N5105运行内存:32G系统:almalinux 8 (类似CentOS系统) 安装过程 检查i915驱动 输入命令dmesg | grep i915查看驱动的加载信息。 我这里没接显示器,输出正确的驱动加载信息如下图所示&…...
用deepseek学大模型04-机器学习建模过程
https://metaso.cn/s/7tEmBHr 目前已经学完深度学习的数学基础,给出机器学习建模的基本过程 好的,我现在需要回答用户的问题:已经学完深度学习的数学基础,现在要给出机器学习建模的基本过程。我需要结合我搜索到的资料来构建一个详…...
【ClickHouse】Ubuntu下离线安装ClickHouse数据库并使用DBeaver连接
目录 0. 安装前准备1 安装ClickHouse1.1 下载安装包1.2 离线安装1.3 配置密码1.4 启动ClickHouse服务 2 DBeaver连接配置2.1 下载ClickHouse驱动2.2 DBeaver配置2.2.1 配置主要参数2.2.2 配置驱动 2.3 常见问题处理2.3.1 修改远程登录配置2.3.2 更新驱动配置 0. 安装前准备 有…...
Unity3D实现接入DeepSeek对话
系列文章目录 unity知识点 文章目录 系列文章目录👉前言👉一、使用第一步👉1-1、登录注册DeepSeek👉1-2、创建API-key👉二、使用第二步👉三、使用第三步👉壁纸分享👉总结👉前言 随着人工智能和机器学习技术的不断进步,DeepSeek的未来发展趋势充满了无限可能…...
【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析②】
ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase02 作者:车端域控测试工程师 更新日期:2025年02月15日 关键词:UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023 TC10-002测试用例 用例ID测试场景验证要点参考条款预期…...
前端新手必看:10 大 UI 组件库全面解析,快速搭建高质量 Web 应用」 「从零开始:Vue 和 React 最受欢迎的 UI 组件库入门指南」 「超实用!PC 端和移动端 UI 组件库推荐与实战
前端新手必看:10 大 UI 组件库全面解析,快速搭建高质量 Web 应用 目录 什么是 UI 组件库?为什么需要 UI 组件库?PC 端 UI 组件库推荐 Ant DesignElement UIVuetifyBootstrapVueiView (View UI)Quasar FrameworkMaterial-UI (MUI…...
【MySQL高级】17 - MySQL中常用工具
1. mysql 该mysql不是指mysql服务,而是指mysql的客户端工具。语法: mysql [options] [database]1.1 连接选项 参数 : -u, --username 指定用户名-p, --password[name] 指定密码-h, --hostname 指定服务器IP或域名-P, --por…...
【Linux】Linux 文件系统——有关 inode 不足的案例
ℹ️大家好,我是练小杰,今天周二了,明天星期三,还有三天就是星期五了,坚持住啊各位!!!😆 本文是对之前Linux文件权限中的inode号进行实例讨论,看到博客有错误…...
计算机视觉:卷积神经网络(CNN)基本概念(二)
第一章:计算机视觉中图像的基础认知 第二章:计算机视觉:卷积神经网络(CNN)基本概念(一) 第三章:计算机视觉:卷积神经网络(CNN)基本概念(二) 第四章:搭建一个经典的LeNet5神经网络(附代码) 第五章࿱…...
【第7章:注意力机制与Transformer模型—7.4 NLP领域的BERT、GPT系列模型】
当你在2017年第一次听说Transformer时,可能不会想到这个模型会在短短三年内彻底改变NLP领域。想象一下,原本需要数周训练的翻译模型,现在用Transformer架构几天就能达到更好的效果;那些让程序员们头疼的梯度消失问题,突然变得不再重要。这一切的魔法钥匙,都藏在一个叫做&…...
[代码调试]安装Text2Image(stable diffusion)模型环境的踩坑记录
文章目录 一、xFormers版本问题1、先确认下自己torch版本所对应的cuda版本2.安装对应版本(1) 到对应官网下载包本地安装(2)代码安装 二、attn_mask尺寸错误三、diffusers四、Huggingface 配置基于stable diffusion预训练模型的环境,记录踩坑记录 一、xFormers版本问…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
