springboot利用easyexcel在瀏覽器中下載excel

前言

項目中操作excel是一種很常用的功能,比如下載一份excel的報價單。這篇文章會介紹一款excel的處理工具以及導出遇到的三個常見異常(重要)。

之前遇到一個這樣的需求:后臺管理頁面,點擊下載按鈕,下載一份excel格式的報價清單

在這里插入圖片描述

是不是讓人頭疼? 別怕,往下看,很簡單~

easyexcel

EasyExcel是一個基于Java的、快速、簡潔、解決大文件內存溢出的Excel處理工具。他能讓你在不用考慮性能、內存的等因素的情況下,快速完成Excel的讀、寫等功能,這是阿里開源項目,官方文檔:https://easyexcel.opensource.alibaba.com/docs/current/

文檔里面有"讀Excel",“寫Excel”,"填充Excel"這三個欄目,從上面的需求來看,我們導出的表格不是規則的表格,并且里面還有特定的樣式,因此我們選擇填充Excel

文檔寫得非常詳細,又是中文,大家可以自己看文檔。我這里給出一個簡單的例子

引入依賴:

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version>
</dependency>

文檔好像沒有直接給出依賴

瀏覽器下載示例:

public void down(){ExcelWriter excelWriter = null; // Ⅰtry {//boards 數據省略//access 數據省略ServletRequestAttributes servletRequestAttributes =  (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletResponse response = servletRequestAttributes.getResponse();// ⅡString fileName = URLEncoder.encode(LocalDate.now() + " 測試.xlsx", StandardCharsets.UTF_8.toString()).replace("+", "%20"); // Ⅲresponse.setContentType("application/force-download");response.setCharacterEncoding("utf-8");response.setHeader("Content-Disposition", "attachment;filename=" + fileName);InputStream inputStream = this.getClass().getResourceAsStream("/static/price-template.xlsx");// ⅣexcelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(inputStream).excelType(ExcelTypeEnum.XLSX).build();WriteSheet writeSheet = EasyExcel.writerSheet().build();//ⅤFillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();excelWriter.fill(new FillWrapper("list1", boards), fillConfig, writeSheet);excelWriter.fill(new FillWrapper("list2", access), fillConfig, writeSheet);excelWriter.fill(orderEntity, writeSheet);Map<String, BigDecimal> map = new HashMap<>();map.put("boardsTotalPrice", boardsTotalPrice);map.put("accessTotalPrice", accessTotalPrice);map.put("totalPrice", boardsTotalPrice.add(accessTotalPrice));excelWriter.fill(map, writeSheet);} catch (Exception e){e.printStackTrace();} finally {if (!Objects.isNull(excelWriter)){excelWriter.close();}}
}

**Ⅰ:**try catch之前定義一個ExcelWriter,最后在finally里面關閉,釋放資源

**Ⅱ:**HttpServletResponse response可以通過參數傳入,這里直接通過對象獲取

**Ⅲ:**輸出格式如下的文件”2023-12-11 測試.xlsx“,因為是中文,所以使用URLEncoder,因為有空格,所以有這樣的代.replace(“+”, “%20”)

**Ⅳ:**以流的形式讀取模板,注意模板是放在resource下的static目錄下

**Ⅴ:**這里就是填充數據了,因為有兩個列表,因此定義list1和list2,下面看看填充的模板

在這里插入圖片描述

總得來說大部分代碼是固定的,只有填充數據那里是動態的

遇到的問題

這里講講開發過程中遇到的問題

1.依賴沖突

先看看會報什么錯誤

com.alibaba.excel.exception.ExcelGenerateException: java.lang.NoSuchMethodError: 'void org.apache.poi.ss.usermodel.Cell.setBlank()'

com.alibaba.excel.exception.ExcelGenerateException: java.lang.NoSuchMethodError: 'javax.xml.parsers.DocumentBuilder org.apache.poi.util.XMLHelper.newDocumentBuilder()'

出現這個問題大概率就是引入了

<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.0.0</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.0</version>
</dependency>

因為

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version>
</dependency>

已經包含了上面的兩個依賴。

2.模板文件編譯后損壞

報錯:

com.alibaba.excel.exception.ExcelGenerateException: Create workbook failureCaused by: org.apache.poi.openxml4j.exceptions.NotOfficeXmlFileException: No valid entries or contents found, this is not a valid OOXML (Office Open XML) fileat org.apache.poi.openxml4j.util.ZipArchiveThresholdInputStream.getNextEntry(ZipArchiveThresholdInputStream.java:145)
Caused by: java.util.zip.ZipException: Unexpected record signature: 0X9

因為文件損壞,無法創建workbook,如遇到這個問題在pom文件添加以下插件即可

<!-- 避免font文件的二進制文件格式壓縮破壞 -->
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><version>3.2.0</version><configuration><nonFilteredFileExtensions><nonFilteredFileExtension>xlsx</nonFilteredFileExtension></nonFilteredFileExtensions></configuration>
</plugin>

3.線上無法讀取模板

先看看報錯

java.io.FileNotFoundException: file:/data2/xxx0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/static/template/price-template.xlsx (No such file or directory)

你本地是沒有問題的,但是部署到線上卻有問題

首先出現這樣的問題大概率是你在讀取模板的時候使用了以下的方式

ResourceUtils.getFile("classpath:static\xxx");ResourceUtils.getURL("/static/price-template.xlsx").getPath();

通過這種正常路徑訪問

比如說我上面的代碼剛開始是這樣寫的

String path = ResourceUtils.getURL("/static/price-template.xlsx").getPath();
FileInputStream inputStream = new FileInputStream(path);

本地是沒有問題的,因為price-template.xlsx文件就是真實的存儲在磁盤里面的static目錄下,但到線上就不一樣了,因為當打成jar包,該文件是存在jar包文件資源里,而不是真實存在于磁盤路徑上。

所以后面我把代碼改成

InputStream inputStream = this.getClass().getResourceAsStream("/static/price-template.xlsx");

直接獲取jar包里面的模板,并且輸出文件流

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

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

相關文章

《人工智能導論》知識思維導圖梳理【1~5章節】

文章目錄 說明第一章 緒論人工只能概述 第二章 知識表示和知識圖譜一階謂詞邏輯和知識表示法產生式表示和框架表示法 第三章 確定性推理方法推理的基本概念自然演繹推理歸結演繹推理謂詞公式化子句集魯賓孫歸結原理歸結反演歸結反演求解問題 第四章 不確定性推理方法似然推理可…

npm run build時提示vue/types/jsx.d.ts中的錯誤

解決方法一&#xff1a; 可能是因為vue版本過高引起的 我直接將package.json中vue以及vue-template-compiler的版本的前面^去掉&#xff0c;安裝指定的版本 注意&#xff1a;vue和vue-template-compiler需要版本一致 參考鏈接&#xff1a;鏈接 解決方法二&#xff1a; 如果如…

線上問題得解決

問題&#xff1a; 最近碰到一個比較棘手但是比較低級的問題&#xff0c;一直沒有找到原因&#xff0c;苦找了兩天才發現問題。場景就是訂單做了某一個操作之后&#xff08;比如揀貨完成&#xff09;然后到下一步&#xff08;下道口&#xff09;。 但是線上幾萬筆訂單 &#xf…

QT使用SQLite 超詳細(增刪改查、包括對大量數據快速存儲和更新)

QTSQLite 在QT中使用sqlite數據庫&#xff0c;有多種使用方法&#xff0c;在這里我只提供幾種簡單&#xff0c;代碼簡短的方法&#xff0c;包括一些特殊字符處理。在這里也給大家說明一下&#xff0c;如果你每次要存儲的數據量很大&#xff0c;建議使用事務&#xff08;代碼中…

canvas 有趣的彈簧效果

先上效果 兩個小球之間有一根彈簧&#xff0c;這里有一條線表示&#xff0c;其中左球固定&#xff0c;在點擊開始后&#xff0c;右球開始做自由落體 思路 先做受力分析 經過受力分析可以發現&#xff0c;整個系統一共有三個力在起作用&#xff0c;我們分別把他們求出來并合成…

控制臺打印如來佛圖像

代碼 System.out.println(" _ooOoo_ \n"" o8888888o \n"" 88 \".\" 88 …

python——第十七天

方法重寫(overwrite) 、方法覆蓋(override )&#xff1a;在繼承的基礎上&#xff0c;子類繼承了父類的方法&#xff0c;如果不能滿足自己使用&#xff0c;我們就可以重寫或覆蓋該方法 函數重載(overload)&#xff1a; 在強數據類型的編程語言中(如Java、C、C等等): 函數名稱…

轉換 pytorch 格式模型為 caffe格式模型 pth2caffemodel

基于 GitHub xxradon/PytorchToCaffe 源碼&#xff0c;修改 example\resnet_pytorch_2_caffe.py 如下 import os import sys sys.path.insert(0, .)import torch from torch.autograd import Variable from torchvision.models import resnet import pytorch_to_caffe"&q…

PDI/Kettle-9.4.0.0-343源碼下載及編譯

目錄 &#x1f351;一、概要&#x1f34a;最新版本10.x&#xff08;2023-11-30&#xff09; &#x1f351;二、下載&#x1f351;三、編譯&#x1f34a;3.1、導入開發工具&#x1f34a;3.2、開始編譯&#x1f34a;3.3、編譯報錯&#x1f34a;3.4、報錯原因&#xff1a;jdk版本低…

centos7安全防護_CPU占用率超過百分之300_centos7.4中毒CPU百分之百_清理毒源---Linux工作筆記068

執行top命令的時候看到有個進程: sshd占用cpu百分之300多...而且就算是kill -9 殺掉進程以后,進程又會自動啟動 ll /proc/7298 我們執行這個命令,可以看到有個/var/tmp/sshd的文件 我們進入cd /var/tmp 然后我們執行 rm -rf sshd刪除這個文件,然后我們再去top可以看到 cpu就…

【數倉理論】

一、數倉建模方法論 1.1 ER模型&#xff08;Entity Relationship、實體關系模型、范式模型&#xff09; ER模型是Bill Inmon提出的一種建模方法&#xff0c;實體關系模型將復雜的數據抽象為兩個概念 ---- 實體和關系 該模型在范式理論上符合3NF&#xff0c;這種模型目的是減少…

測距傳感器

測距傳感器 電子元器件百科 文章目錄 測距傳感器前言一、測距傳感器是什么二、測距傳感器的類別三、測距傳感器的應用實例四、測距傳感器的作用原理總結前言 測距傳感器廣泛應用于自動化控制、機器人導航、無人駕駛、測量儀器等領域。不同類型的測距傳感器具有不同的測距范圍、…

xtu oj 1178 Rectangle

題目描述 給你兩個平行于坐標軸的矩形&#xff0c;請判斷兩者是不是相交&#xff08;面積有重合的部分&#xff09;&#xff1f; 輸入 第一行是一個整數K&#xff0c;表示樣例數。 每個樣例占兩行&#xff0c;每行是4個整數&#xff0c;表示一個矩形的對角線點的坐標&#x…

重磅!2023中國高校計算機大賽-人工智能創意賽結果出爐

目錄 中國計算機大賽-人工智能創意賽現場C4-AI大賽頒獎及留影800個AI應用&#xff1f;這屆大學生真能“搞事情”AI原生時代&#xff0c;百度要再培養500萬大模型人才 中國計算機大賽-人工智能創意賽現場 12月8日&#xff0c;杭州&#xff0c;一位“白發老人”突然摔倒在地&…

[基礎IO]文件描述符{C庫函數\系統接口\初識fd}

文章目錄 1.基礎知識1.1對文件的認識1.2對系統調用接口的認識1.3如何理解LInux下一切皆文件? 2.C語言的庫函數2.1FILE *fopen(const char *path, const char *mode);2.2對fopen()的mode的w/a的深層認識2.3fclose()2.4size_t fwrite(const void *ptr, size_t size, size_t nmem…

測試經理主管面試題

測試專業技能 請談談您對軟件測試生命周期&#xff08;STLC&#xff09;的理解 需求分析&#xff1a;在這個階段&#xff0c;測試團隊仔細分析項目需求&#xff0c;理解產品功能和非功能需求。這有助于確定測試的范圍和目標&#xff0c;為后續階段奠定基礎。測試計劃&#xf…

【桌面應用開發】Tauri是什么?基于Rust的桌面應用

自我介紹 做一個簡單介紹&#xff0c;酒架年近48 &#xff0c;有20多年IT工作經歷&#xff0c;目前在一家500強做企業架構&#xff0e;因為工作需要&#xff0c;另外也因為興趣涉獵比較廣&#xff0c;為了自己學習建立了三個博客&#xff0c;分別是【全球IT瞭望】&#xff0c;【…

深入.NET平臺和C#編程總結大全

第一章 簡單認識.NET框架 &#xff08;1&#xff09;首先我們得知道 .NET框架具有兩個主要組件&#xff1a;公共語言進行時CLR&#xff08;Common Language Runtime&#xff09;和框架類庫FCL&#xff08;Framework Class Library&#xff09; 配圖&#xff1a; &#xff08;…

JSON

JSON指的是 JavaScript 對象表示法&#xff08;JavaScript Object Notation&#xff09; javascript對象&#xff1a;javascript中&#xff0c;除開JavaScript原始值(字符串&#xff0c;數字&#xff0c;布爾值&#xff0c;null&#xff0c;正則表達式)的都是javascript對象 JS…

Java - JVM內存區域的劃分

Java 程序運行時&#xff0c;需要在內存中分配空間。為了提高運算效率&#xff0c;就對空間進行了不同區域的劃分&#xff0c;因為每一片區域都有特定的處理數據方式和內存管理方式。 分配&#xff1a;通過關鍵字new創建對象分配內存空間&#xff0c;對象存在堆中。 釋放 &…