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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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:面向对象电商系统…