Excel 操作 轉圖片,轉pdf等

方式一 spire.xls.free(沒找設置分辨率的方法)

macOs開發Java GUI程序提示缺少字體問題解決?

?Spire.XLS:一款Excel處理神器_spire.xls免費版和收費版的區別-CSDN博客

官方文檔?

Spire.XLS for Java 中文教程

        <dependency><groupId>e-iceblue</groupId><artifactId>spire.xls.free</artifactId><version>5.1.0</version></dependency><repositories><repository><id>e-iceblue</id><name>e-iceblue</name><url>https://repo.e-iceblue.cn/repository/maven-public/</url></repository></repositories>
/*** 功能描述: 處理將Excel文件轉換為圖片并提供下載的請求。* 參數說明:*   excelFilePath: 存儲在服務器上的Excel文件的絕對路徑。* 返回值說明: ResponseEntity 包含圖片文件流,供瀏覽器下載。* 使用示例:*   GET /downloadExcelAsImage?excelFilePath=/path/to/your/excel.xlsx*/@GetMapping( "/downloadImage/{id}")public ResponseEntity<InputStreamResource> downloadExcelAsImage(@PathVariable("id") String id) throws IOException {// 調用服務層方法將Excel轉換為圖片File imageFile = resultHistoryService.convertFromFilePath(id);// 設置HTTP頭,用于文件下載HttpHeaders headers = new HttpHeaders();headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + imageFile.getName());headers.add(HttpHeaders.CACHE_CONTROL, "no-cache, no-store, must-revalidate");headers.add(HttpHeaders.PRAGMA, "no-cache");headers.add(HttpHeaders.EXPIRES, "0");InputStreamResource resource = new InputStreamResource(new FileInputStream(imageFile));return ResponseEntity.ok().headers(headers).contentLength(imageFile.length())// 或者根據實際生成的圖片類型調整 MediaType.IMAGE_JPEG 等.contentType(MediaType.IMAGE_PNG).body(resource);}
public File convertFromFilePath(String id) throws IOException {ResultHistoryDO resultHistoryDO = resultHistoryDao.get(id);String uploadPath = bootdoConfig.getUploadPath();String fileurl = resultHistoryDO.getFileurl();String[] split = fileurl.split("/files/");String fileName =uploadPath+ split[1] ;Workbook workbook = new Workbook();// 加載Excel文檔workbook.loadFromFile(fileName);// 獲取第一個工作表 (您可以根據需要選擇特定的工作表)Worksheet sheet = workbook.getWorksheets().get(0);// 定義輸出圖片的文件名和路徑 (這里我們將其保存在臨時目錄)// 您可以根據需要更改保存路徑和文件名邏輯File outputFile = File.createTempFile("excel_image_", ".png");// 將工作表保存為圖片sheet.saveToImage(outputFile.getAbsolutePath());return outputFile;}

方式二aspose-cells(推薦設置分辨率轉出的圖片更清晰)

?

<dependency><groupId>com.luhuiguo</groupId><artifactId>aspose-cells</artifactId><version>23.1</version></dependency>

?

package com.charsming.common.domain;/*** 功能描述: 用于封裝圖片數據及其元數據的包裝類。*/
public class ImageDataWrapper {// 圖片的字節數組private byte[] data;// 建議的下載文件名private String fileName;// 圖片的MIME類型 (例如 "image/png")private String contentType;/*** 功能描述: ImageDataWrapper的構造函數。* 參數: data - 圖片的字節數組。* 參數: fileName - 建議的下載文件名。* 參數: contentType - 圖片的MIME類型。*/public ImageDataWrapper(byte[] data, String fileName, String contentType) {this.data = data;this.fileName = fileName;this.contentType = contentType;}// Getter 方法public byte[] getData() {return data;}public String getFileName() {return fileName;}public String getContentType() {return contentType;}
}
@GetMapping("/downloadImage/{id}")public ResponseEntity<InputStreamResource> downloadExcelAsImage(@PathVariable("id") String id, HttpServletResponse response) throws Exception {try {// logger.info("請求下載圖片,ID: {}", id); // 日志記錄ImageDataWrapper imageData = resultHistoryService.convertExcelToImageData(id);HttpHeaders headers = new HttpHeaders();// 設置Content-Disposition,提示瀏覽器下載并指定文件名headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + imageData.getFileName() + "\"");// 其他緩存控制相關的頭信息 (可選,但推薦)headers.add(HttpHeaders.CACHE_CONTROL, "no-cache, no-store, must-revalidate");headers.add(HttpHeaders.PRAGMA, "no-cache");headers.add(HttpHeaders.EXPIRES, "0");InputStreamResource resource = new InputStreamResource(new ByteArrayInputStream(imageData.getData()));// logger.info("成功生成圖片: {}, 大小: {} bytes", imageData.getFileName(), imageData.getData().length); // 日志記錄return ResponseEntity.ok().headers(headers).contentLength(imageData.getData().length).contentType(MediaType.parseMediaType(imageData.getContentType())).body(resource);} catch (Exception e) {// logger.error("下載圖片失敗,ID: {}. 錯誤: {}", id, e.getMessage(), e); // 記錄異常堆棧// 在發生錯誤時,返回一個帶有錯誤信息的ResponseEntity// 您可以根據需要定制錯誤響應的格式,例如返回一個JSON對象String errorMessage = "下載圖片失敗: " + e.getMessage();InputStreamResource errorResource = new InputStreamResource(new ByteArrayInputStream(errorMessage.getBytes(java.nio.charset.StandardCharsets.UTF_8)));return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).contentType(MediaType.TEXT_PLAIN).body(errorResource);}
@Overridepublic ImageDataWrapper convertExcelToImageData(String id) throws Exception {ResultHistoryDO resultHistoryDO = resultHistoryDao.get(id);if (resultHistoryDO == null || resultHistoryDO.getFileurl() == null) {throw new Exception("未找到ID為 " + id + " 的結果歷史記錄或文件路徑為空。");}String uploadPath = bootdoConfig.getUploadPath();String fileurl = resultHistoryDO.getFileurl();// 注意:此處的分割邏輯可能需要根據您的實際fileurl格式調整String[] split = fileurl.split("/files/");if (split.length < 2) {throw new Exception("文件路徑格式不正確,無法提取文件名: " + fileurl);}String excelFilePath = uploadPath + split[1];Workbook workbook = null;// 使用try-with-resources確保baos關閉try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {workbook = new Workbook(excelFilePath);Worksheet worksheet = workbook.getWorksheets().get(0);// --- 全局修改默認字體 開始 ---Style defaultStyle = workbook.getDefaultStyle();Font defaultFont = defaultStyle.getFont();defaultFont.setName("Times New Roman"); // 設置全局默認字體名稱defaultFont.setSize(11);   // 設置全局默認字體大小// defaultFont.setBold(false); // 根據需要設置其他屬性workbook.setDefaultStyle(defaultStyle); // 應用修改后的默認樣式到整個工作簿ImageOrPrintOptions imgOptions = new ImageOrPrintOptions();imgOptions.setImageType(ImageType.PNG);imgOptions.setHorizontalResolution(800);imgOptions.setVerticalResolution(800);SheetRender sr = new SheetRender(worksheet, imgOptions);if (sr.getPageCount() > 0) {// 渲染第一頁int pageIndexToRender = 0;sr.toImage(pageIndexToRender, baos);// baos.flush(); // ByteArrayOutputStream的flush是空操作,可以省略byte[] imageBytes = baos.toByteArray();String originalFileName = new File(excelFilePath).getName();String baseName = originalFileName.contains(".") ? originalFileName.substring(0, originalFileName.lastIndexOf('.')) : originalFileName;String suggestedFileName = baseName  + (pageIndexToRender + 1) + ".png";String contentType = "image/png";return new ImageDataWrapper(imageBytes, suggestedFileName, contentType);} else {throw new Exception("Excel工作表 " + excelFilePath + " 為空或無法渲染成圖片。");}} finally {if (workbook != null) {// 根據Aspose.Cells文檔,Workbook類實現了IDisposable接口,// 在.NET中通常用using語句處理。在Java中,如果它有close()或dispose()方法,應在此調用。// 查閱文檔,Aspose.Cells for Java 通常不需要顯式調用 workbook.dispose(),垃圾回收器會處理。// 但如果遇到內存問題,可以檢查是否有相關API。}}}
async function downloadImage(imageId) {// 構建下載文件的 URLconst downloadUrl = `${prefix}/downloadImage/${imageId}`;let loadingIndex; // 用于存儲 Layui 加載層的索引try {loadingIndex = layer.load(1);// 使用 fetch API 發送 GET 請求const response = await fetch(downloadUrl, {method: 'GET', // 后端是 @GetMapping,所以前端也用 GETcache: 'no-cache', // 根據你的后端設置,這里也禁用緩存});// 檢查響應是否成功if (!response.ok) {// 如果服務器返回錯誤狀態 (如 404, 500)// 你可以根據 response.status 和 response.statusText 來處理不同類型的錯誤const errorText = await response.text(); // 嘗試獲取錯誤信息文本throw new Error(`服務器錯誤: ${response.status} ${response.statusText}. ${errorText}`);}// 從響應頭中獲取文件名// 后端設置了 Content-Disposition: attachment; filename=...const contentDisposition = response.headers.get('content-disposition');let filename = `image_${imageId}.png`; // 默認文件名,如果無法從頭部獲取if (contentDisposition) {const filenameMatch = contentDisposition.match(/filename\*?=['"]?(?:UTF-\d['"]*)?([^;"\n]*)/i);if (filenameMatch && filenameMatch[1]) {filename = decodeURIComponent(filenameMatch[1]);}}// 將響應體轉換為 Blob 對象const blob = await response.blob();// 創建一個指向 Blob 的 URLconst objectUrl = window.URL.createObjectURL(blob);// 創建一個臨時的 <a> 標簽用于觸發下載const link = document.createElement('a');link.href = objectUrl;link.setAttribute('download', filename); // 設置下載的文件名document.body.appendChild(link);// 觸發點擊link.click();// 清理:移除 <a> 標簽并釋放 Object URLdocument.body.removeChild(link);window.URL.revokeObjectURL(objectUrl);// 如果你使用了 parent.layer.alert,可以在這里提示成功if (parent && parent.layer) {parent.layer.alert("圖片下載成功!");}} catch (error) {console.error('下載圖片時發生錯誤:', error);// 如果你使用了 parent.layer.alert,可以在這里提示錯誤if (parent && parent.layer) {parent.layer.alert(`連接或下載錯誤: ${error.message}`);}throw error; // 重新拋出錯誤,以便調用者可以進一步處理}finally {layer.close(loadingIndex);}
}// 如果你仍然想在類似 $.ajax 的結構中使用,可以這樣包裝:
function triggerDownloadWithAjaxLikeStructure(imageId) {// 這里不再需要 $('#signupForm').serialize(),因為 ID 是直接傳遞的// 也不再需要 type: "POST",因為下載是 GET// async: false 非常不推薦,fetch 默認就是異步的,應該使用 Promise 處理downloadImage(imageId).then(() => {// 成功回調,提示已經在 downloadImage 函數內部處理// 你可以在這里添加額外的成功邏輯console.log('圖片下載流程成功完成。');}).catch(error => {// 錯誤回調,提示已經在 downloadImage 函數內部處理// 你可以在這里添加額外的錯誤處理邏輯console.error('圖片下載流程發生錯誤。', error);});
}
 triggerDownloadWithAjaxLikeStructure(id)

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

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

相關文章

oracle goldengate實現遠程抽取postgresql 到 postgresql的實時同步【絕對無坑版,親測流程驗證】

oracle goldengate實現postgresql 到 postgresql的實時同步 源端&#xff1a;postgresql1 -> postgresql2 流復制主備同步 目標端&#xff1a;postgresql 數據庫版本&#xff1a;postgresql 12.14 ogg版本&#xff1a;21.3 架構圖&#xff1a; 數據庫安裝以及流復制主備…

2.從0開始搭建vue項目(node.js,vue3,Ts,ES6)

從“0到跑起來一個 Vue 項目”&#xff0c;重點是各個工具之間的關聯關系、職責邊界和技術演化脈絡。 從你寫代碼 → 到代碼能跑起來 → 再到代碼可以部署上線&#xff0c;每一步都有不同的工具參與。 &#x1f63a;&#x1f63a;1. 安裝 Node.js —— 萬事的根基 Node.js 是…

MQTT的Thingsboards的使用

訪問云服務 https://thingsboard.cloud/ 新建一個設備 彈出 默認是mosquittor的客戶端。 curl -v -X POST http://thingsboard.cloud/api/v1/tnPrO76AxF3TAyOblf9x/telemetry --header Content-Type:application/json --data "{temperature:25}" 換成MQTTX的客戶…

金磚國家人工智能高級別論壇在巴西召開,華院計算應邀出席并發表主題演講

當地時間5月20日&#xff0c;由中華人民共和國工業和信息化部&#xff0c;巴西發展、工業、貿易與服務部&#xff0c;巴西公共服務管理和創新部以及巴西科技創新部聯合舉辦的金磚國家人工智能高級別論壇&#xff0c;在巴西首都巴西利亞舉行。 中華人民共和國工業和信息化部副部…

BLE協議全景圖:從0開始理解低功耗藍牙

BLE(Bluetooth Low Energy)作為一種針對低功耗場景優化的通信協議,已經廣泛應用于智能穿戴、工業追蹤、智能家居、醫療設備等領域。 本文是《BLE 協議實戰詳解》系列的第一篇,將從 BLE 的發展歷史、協議棧結構、核心機制和應用領域出發,為后續工程實戰打下全面認知基礎。 …

表單校驗代碼和樹形結構值傳遞錯誤解決

表單校驗代碼&#xff0c;兩種方式校驗&#xff0c;自定義的一種校驗&#xff0c;與element-ui組件原始的el-form表單的校驗不一樣&#xff0c;需要傳遞props和rules過去校驗 const nextStep () > {const data taskMsgInstance.value.formDataif(data.upGradeOrg ) {elm…

vscode 配置 QtCreat Cmake項目

1.vscode安裝CmakeTool插件并配置QT中cmake的路徑&#xff0c;不止這一處 2.cmake生成器使用Ninja&#xff08;Ninja在安裝QT時需要勾選&#xff09;&#xff0c;可以解決[build] cc1plus.exe: error: too many filenames given; type ‘cc1plus.exe --help’ for usage 編譯時…

關于數據倉庫、數據湖、數據平臺、數據中臺和湖倉一體的概念和區別

我們談論數據中臺之前&#xff0c; 我們也聽到過數據平臺、數據倉庫、數據湖、湖倉一體的相關概念&#xff0c;它們都與數據有關系&#xff0c;但他們和數據中臺有什么樣的區別&#xff0c; 下面我們將圍繞數據平臺、數據倉庫、數據湖和數據中臺的區別進行介紹。 一、相關概念…

WIN11+eclipse搭建java開發環境

環境搭建&#xff08;WIN11ECLIPSE&#xff09; 安裝JAVA JDK https://www.oracle.com/cn/java/technologies/downloads/#jdk24安裝eclipse https://www.eclipse.org/downloads/ 注意&#xff1a;eclipse下載時指定aliyun的軟件源&#xff0c;后面安裝會快一些。默認是jp漢化e…

通義靈碼深度實戰測評:從零構建智能家居控制中樞,體驗AI編程新范式

一、項目背景&#xff1a;零基礎挑戰全棧智能家居系統 目標&#xff1a;開發具備設備控制、環境感知、用戶習慣學習的智能家居控制中樞&#xff08;PythonFlaskMQTTReact&#xff09; 挑戰點&#xff1a; 需集成硬件通信(MQTT)、Web服務(Flask)、前端交互(React) 調用天氣AP…

【Python進階】CPython

目錄 ?? 前言??? 技術背景與價值?? 當前技術痛點??? 解決方案概述?? 目標讀者說明?? 一、技術原理剖析?? 核心架構圖解?? 核心作用講解?? 關鍵技術模塊說明?? Python實現對比??? 二、實戰演示?? 環境配置要求?? 核心代碼實現案例1:查看字節碼案例…

Hive中資源優化方法的詳細說明

在Hive中&#xff0c;資源優化的核心目標是合理分配集群資源&#xff08;如內存、CPU、任務并行度等&#xff09;&#xff0c;避免資源競爭和浪費&#xff0c;提升查詢效率。以下是資源優化的具體方法&#xff0c;涵蓋 YARN資源配置、任務并行度、內存管理、JVM重用、推測執行 …

流媒體協議分析:流媒體傳輸的基石

在流媒體傳輸過程中&#xff0c;協議的選擇至關重要&#xff0c;它決定了數據如何封裝、傳輸和解析&#xff0c;直接影響著視頻的播放質量和用戶體驗。本文將深入分析幾種常見的流媒體傳輸協議&#xff0c;探討它們的特點、應用場景及優缺點。 協議分類概述 流媒體傳輸協議根據…

GitHub 趨勢日報 (2025年05月29日)

&#x1f4ca; 由 TrendForge 系統生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日獲星趨勢圖 今日獲星趨勢圖 1864 agenticSeek 753 langflow 749 n8n 736 prompt-eng-interactive-tutorial 42…

Jenkins-Pipeline:學習筆記

Jenkins-Pipeline:學習筆記 在 DevOps 領域中,Pipeline(流水線) 是實現持續集成(CI)和持續部署(CD)的核心機制。學習 Pipeline 通常需要從以下幾個方面入手,涵蓋基礎概念、工具使用、語法規則、實踐優化等 一、Pipeline 基礎概念 什么是 Pipeline? 流水線是將軟件交…

內存管理 : 04段頁結合的實際內存管理

一、課程核心主題引入 這一講&#xff0c;我要給大家講的是真正的內存管理&#xff0c;也就是段和頁結合在一起的內存管理方式。之前提到過&#xff0c;我們先學習了分段管理內存的工作原理&#xff0c;知道操作系統采用分段的方式&#xff0c;讓用戶程序能以分段的結構進行編…

RAID磁盤陣列配置

RAID磁盤陣列配置 文章目錄 RAID磁盤陣列配置一、磁盤管理其他相關命令1.fsck-檢查文件的正確性2.dd-建立和使用交換文件3.mkswap-建立和設置SWAP交換分區 二、RAID配置 一、磁盤管理其他相關命令 1.fsck-檢查文件的正確性 [rootlocalhost ~]# fsck -aC /dev/sda1 //檢查文…

網站服務器出現異常的原因是什么?

網站時企業和個人用戶進行提供信息和服務的重要平臺&#xff0c;隨著時間的推移&#xff0c;網站服務器出現異常情況也是常見的問題之一&#xff0c;這可能會導致網站無法正常訪問或者是運行緩慢&#xff0c;會嚴重影響到用戶的體驗感&#xff0c;本文就來介紹一下網站服務器出…

LINUX528 重定向

2>&1 我的理解&#xff1a; 2>&1&#xff0c;2stderr錯誤輸出&#xff0c;1stdout輸出&#xff0c;stderr一般和stdout是分別輸出&#xff08;管道符只傳遞stdout&#xff0c;據元寶&#xff0c;stderr默認輸出到終端&#xff1b;如果重定向符不進行2顯示重定向&…

【Python高階】面向對象

目錄 ?? 前言??? 技術背景與價值?? 當前技術痛點??? 解決方案概述?? 目標讀者說明?? 一、技術原理剖析?? 核心知識圖譜?? 核心作用講解?? 關鍵技術模塊說明?? 技術選型對比??? 二、實戰演示?? 環境配置要求?? 核心代碼實現案例1:面向對象電商系統…