【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);}
}

最后

以上是一個簡單操作下載導出模板并填充數據后下載模板接口,經供參考!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895986.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895986.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895986.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【深度學習】計算機視覺(CV)-目標檢測-DETR(DEtection TRansformer)—— 基于 Transformer 的端到端目標檢測

1.什么是 DETR&#xff1f; DETR&#xff08;DEtection TRansformer&#xff09; 是 Facebook AI&#xff08;FAIR&#xff09;于 2020 年提出的 端到端目標檢測算法&#xff0c;它基于 Transformer 架構&#xff0c;消除了 Faster R-CNN、YOLO 等方法中的 候選框&#xff08;…

IDEA + 通義靈碼AI程序員:快速構建DDD后端工程模板

作者&#xff1a;陳榮健 IDEA 通義靈碼AI程序員&#xff1a;快速構建DDD后端工程模板 在軟件開發過程中&#xff0c;一個清晰、可維護、可擴展的架構至關重要。領域驅動設計 (DDD) 是一種軟件開發方法&#xff0c;它強調將軟件模型與業務領域緊密結合&#xff0c;從而構建更…

責任鏈模式原理詳解和源碼實例以及Spring AOP攔截器鏈的執行源碼如何使用責任鏈模式?

前言 本文首先介紹了責任鏈的基本原理&#xff0c;并附帶一個例子說明責任鏈模式&#xff0c;確保能夠理解責任鏈的前提下&#xff0c;在進行Spring AOP執行責任鏈的源碼分析。責任鏈模式允許將多個處理對象連接成鏈&#xff0c;請求沿著鏈傳遞&#xff0c;直到被處理或結束。每…

React 與 Vue 對比指南 - 上

React 與 Vue 對比指南 - 上 本文將展示如何在 React 和 Vue 中實現常見功能&#xff0c;從基礎渲染到高級狀態管理 Hello 分別使用 react 和 vue 寫一個 Hello World&#xff01; react export default () > {return <div>Hello World!</div>; }vue <…

大模型開發實戰篇7:語音識別-語音轉文字

語音識別大模型&#xff0c;是人工智能領域的一項重要技術&#xff0c;它能夠將人類的語音轉換為文本。近年來&#xff0c;隨著深度學習技術的不斷發展&#xff0c;語音識別大模型取得了顯著的進展&#xff0c;并在各個領域得到了廣泛應用。 主流語音識別大模型 目前&#xf…

向量的點乘的幾何意義

源自AI 向量的點乘&#xff08;Dot Product&#xff09;在幾何和圖形學中有重要的意義。它不僅是數學運算&#xff0c;還可以用來描述向量之間的關系。以下是點乘的幾何意義及其應用&#xff1a; 1. 點乘的定義 對于兩個向量 a 和 b&#xff0c;它們的點乘定義為&#xff1a;…

國產芯片汽車氣壓表pcba方案

汽車氣壓表的基本原理是利用氣壓傳感器將氣體氣壓轉換為電信號&#xff0c;再通過電子芯片電路進行處理傳輸&#xff0c;再將這些信息轉發給顯示屏顯示。常見的傳感器包括模擬氣壓傳感器和數字氣壓傳感器。其中&#xff0c;模擬氣壓傳感器是目前應用最廣泛的傳感器之一&#xf…

解鎖機器學習核心算法 | K -近鄰算法:機器學習的神奇鑰匙

一、引言 今天我們繼續學習機器學習核心算法 —— K - 近鄰&#xff08;K-Nearest Neighbors&#xff0c;簡稱 KNN&#xff09;算法。它就像是一位經驗豐富的 “老江湖”&#xff0c;以其簡單而又強大的方式&#xff0c;在眾多機器學習任務中占據著不可或缺的地位。 K - 近鄰…

如何在Windows 10操作系統中安裝并配置PHP集成軟件XAMPP

步驟1&#xff1a;下載XAMPP安裝包 訪問XAMPP官網&#xff1a; 打開瀏覽器&#xff0c;進入XAMPP官方網站&#xff1a;https://www.apachefriends.org/index.html 選擇XAMPP版本&#xff1a; 在XAMPP的下載頁面上&#xff0c;選擇適合Windows的最新穩定版本下載&#xff08;例…

【DeepSeek】本地部署,保姆級教程

deepseek網站鏈接傳送門&#xff1a;DeepSeek 在這里主要介紹DeepSeek的兩種部署方法&#xff0c;一種是調用API&#xff0c;一種是本地部署。 一、API調用 1.進入網址Cherry Studio - 全能的AI助手選擇立即下載 2.安裝時位置建議放在其他盤&#xff0c;不要放c盤 3.進入軟件后…

Python 入門教程(2)搭建環境 | 2.3、VSCode配置Python開發環境

文章目錄 一、VSCode配置Python開發環境1、軟件安裝2、安裝Python插件3、配置Python環境4、包管理5、調試程序 前言 Visual Studio Code&#xff08;簡稱VSCode&#xff09;以其強大的功能和靈活的擴展性&#xff0c;成為了許多開發者的首選。本文將詳細介紹如何在VSCode中配置…

Oracle EBS 12.1和APEX 集成時 Apache的配置代理

在有些場景下&#xff0c;apex的前端服務不是和oracle EBS 應用部署在同一個服務器上或者要求apex和訪問地址和EBS公用同一個域名同一個端口&#xff0c;那么怎么才能做到用EBS 的域名和端口來實現對apex的訪問呢 通過配置代理規則解決&#xff0c;以Oracle EBS 12.1.3 為例&am…

【第二節】C++設計模式(創建型模式)-抽象工廠模式

目錄 引言 一、抽象工廠模式概述 二、抽象工廠模式的應用 三、抽象工廠模式的適用場景 四、抽象工廠模式的優缺點 五、總結 引言 抽象工廠設計模式是一種創建型設計模式&#xff0c;旨在解決一系列相互依賴對象的創建問題。它與工廠方法模式密切相關&#xff0c;但在應用…

ubuntu20.04重啟后不顯示共享文件夾

ubuntu20.04重啟后不顯示共享文件夾 主要參見這兩篇博客 Ubuntu重啟后不顯示共享文件夾_ubuntu 20.04 共享目錄無法使用-CSDN博客 ubuntu22.04 配置共享文件夾 找不到/mnt/hgfs_ubuntu安裝tools 后mnt文件夾在哪-CSDN博客 重啟Ubuntu20.04后&#xff0c;發現共享文件夾進不去…

halcon機器視覺深度學習對象檢測,物體檢測

目錄 效果圖操作步驟軟件版本halcon參考代碼本地函數 get_distinct_colors()本地函數 make_neighboring_colors_distinguishable() 效果圖 操作步驟 首先要在Deep Learning Tool工具里面把圖片打上標注文本&#xff0c; 然后訓練模型&#xff0c;導出模型文件 這個是模型 mod…

9.PG數據庫層權限管理(pg系列課程)第2遍

一、PostgreSQL數據庫屬主 Postgres中的數據庫屬主屬于創建者&#xff0c;只要有createdb的權限就可以創建數據庫&#xff0c;數據庫屬主不一定擁有存放在該數據庫中其它用戶創建的對象的訪問權限。數據庫在創建后&#xff0c;允許public角色連接&#xff0c;即允許任何人連接…

2.19學習(php文件后綴)

misc buu-后門查殺 下載附件&#xff0c;我們用火絨安全掃一下然后點擊詳情進入該文件所在文件夾&#xff0c;再用記事本打開該文件&#xff0c;搜索flag無果&#xff0c;再試試pass&#xff08;由題目中的密碼聯系到pass&#xff0c;password&#xff0c;key等&#xff09;&a…

PMBOK第7版整體架構全面詳解

1. 引言 7月1日對于項目管理從業者和研究者而言&#xff0c;是個非凡意義的一個時間&#xff0c;這一天&#xff0c;翹首以待的《 項 目管理知識體系指南 》&#xff08;PMBOK&#xff09;第七版終于發布了。 總體而言&#xff0c;PMBOK第七版集百家之所長&#xff0c;成一…

C++:類與對象,定義類和構造函數

#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> using namespace std; //如何讓定義一個類 // 封裝 // 1、將數據和方法定義到一起。 // 2、把想給你看的數據給你看&#xff0c;不想給你看的封裝起來。 通過訪問限定符來實現 class Stack { public: //1.成…

nginx 部署前端vue項目

?? 主頁&#xff1a; ?? 感謝各位大佬 點贊?? 收藏 留言?? 加關注! ?? 收錄于專欄&#xff1a;前端工程師 文章目錄 一、??什么是nginx&#xff1f;二、??nginx 部署前端vue項目步驟 2.1 ??安裝nginx 2.1.1 ??windows環境安裝2.1.2 ??linux環境安裝 2.2 …