当前位置: 首页 > news >正文

java excel转图片常用的几种方法

十分想念顺店杂可。。。

在 Java 中实现 Excel 转图片,常用的方法主要分为两类:使用商业库(简单高效但可能收费)和使用开源库组合(免费但实现复杂)。以下是几种常用方案及实现思路:

一、使用商业库(推荐用于复杂场景)

商业库通常封装了完整的 Excel 渲染逻辑,支持复杂表格、公式、图表等转换,使用简单。

1. Aspose.Cells(功能最全面)

Aspose.Cells 是处理 Excel 的专业库,支持将工作表、单元格区域或图表直接转换为图片,支持多种格式(PNG/JPG/BMP 等)。

特点

  • 支持复杂表格、公式、图表、样式渲染
  • 无需安装 Office,纯 Java 实现
  • 商业付费(免费版有水印)

示例代码

import com.aspose.cells.*;
import java.io.File;public class AsposeExcelToImage {public static void main(String[] args) throws Exception {// 加载Excel文件Workbook workbook = new Workbook("input.xlsx");// 获取第一个工作表Worksheet worksheet = workbook.getWorksheets().get(0);// 配置图片选项(格式、分辨率等)ImageOrPrintOptions options = new ImageOrPrintOptions();options.setImageType(ImageType.PNG); // 输出PNG格式options.setHorizontalResolution(300); // 分辨率options.setVerticalResolution(300);// 渲染整个工作表为图片SheetRender render = new SheetRender(worksheet, options);render.toImage(0, "output_aspose.png"); // 保存图片// 也可渲染指定单元格区域(例如A1到D10)CellArea area = new CellArea();area.startRow = 0;area.startColumn = 0;area.endRow = 9;area.endColumn = 3;worksheet.setPrintArea(area); // 设置打印区域即渲染区域render.toImage(0, "output_range.png");}
}

依赖(Maven):

<dependency><groupId>com.aspose</groupId><artifactId>aspose-cells</artifactId><version>23.12</version>
</dependency>
2. Spire.XLS(性价比高)

Spire.XLS 是另一个商业库,功能类似 Aspose.Cells,免费版有页数限制(如最多转换 5 页)。

特点

  • 支持表格、图表、形状转图片
  • 免费版可满足简单需求

示例代码

import com.spire.xls.*;public class SpireExcelToImage {public static void main(String[] args) {// 加载ExcelWorkbook workbook = new Workbook();workbook.loadFromFile("input.xlsx");// 获取第一个工作表Worksheet sheet = workbook.getWorksheets().get(0);// 保存为图片(支持指定区域)sheet.saveToImage("output_spire.png");// 保存指定单元格区域(A1到C8)sheet.saveToImage(0, 0, 7, 2, "output_spire_range.png"); // 行、列起始索引及结束索引}
}

依赖(Maven):

<dependency><groupId>e-iceblue</groupId><artifactId>spire.xls</artifactId><version>14.7.0</version>
</dependency>

二、开源方案(适合简单场景,免费)

开源方案需要组合多个库实现,核心思路是:用 Excel 解析库读取内容 + 用图形库绘制图片

1. Apache POI + BufferedImage(基础实现)

Apache POI 是处理 Excel 的主流开源库,但本身不支持直接转图片,需要手动读取单元格内容、样式(边框、颜色等),再用 Java 的BufferedImage绘制。

特点

  • 完全免费,可定制化
  • 仅适合简单表格(复杂样式、公式、图表难以实现)
  • 需手动处理样式渲染,开发成本高

核心步骤

  1. 用 Apache POI 读取 Excel 内容(单元格值、字体、颜色、边框等)
  2. 计算表格宽高、单元格大小
  3. BufferedImageGraphics2D绘制单元格、文字、边框
  4. 保存为图片

示例代码片段

import org.apache.poi.ss.usermodel.*;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;public class PoiExcelToImage {public static void main(String[] args) throws Exception {Workbook workbook = WorkbookFactory.create(new File("input.xlsx"));Sheet sheet = workbook.getSheetAt(0);// 简单计算图片宽高(实际需根据单元格大小动态计算)int width = 800;int height = 600;BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics2D g = image.createGraphics();// 绘制背景g.setColor(Color.WHITE);g.fillRect(0, 0, width, height);// 绘制单元格(简化示例,仅绘制文本)int rowY = 50;for (Row row : sheet) {int colX = 50;for (Cell cell : row) {String value = cell.getStringCellValue();// 绘制文本g.setColor(Color.BLACK);g.drawString(value, colX, rowY);colX += 100; // 单元格宽度}rowY += 30; // 行高}// 保存图片ImageIO.write(image, "PNG", new File("output_poi.png"));g.dispose();}
}

依赖(Maven):

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.4</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.4</version>
</dependency>
2. Apache POI + JFreeChart(处理图表)

如果需要转换 Excel 中的图表,可结合 JFreeChart(开源图表库):

  1. 用 POI 读取图表数据
  2. 用 JFreeChart 生成对应图表图片
  3. 合并表格图片和图表图片(如需)

三、方法对比与选择建议

方法优点缺点适用场景
Aspose.Cells功能全面,支持复杂表格 / 图表,易用商业付费,免费版有水印生产环境、复杂 Excel 转换
Spire.XLS性价比高,免费版可用免费版有页数限制简单需求、小文件转换
Apache POI + 自定义免费开源,可深度定制开发复杂,不支持复杂样式 / 公式简单表格、低成本场景

总结

  • 追求效率和完整性:优先选择 Aspose.Cells 或 Spire.XLS
  • 免费且简单场景:用 Apache POI 手动绘制(仅限简单表格)
  • 避免重复造轮子:商业库是大多数企业的选择(可评估成本)
http://www.dtcms.com/a/318850.html

相关文章:

  • 分布式接口限流与防重复提交实现方案
  • 快速搭建vue3+flask实现一个异物检测项目
  • RP2040下的I2S Slave Out,PIO状态机(四)
  • MT信号四通道相关性预测的Informer模型优化研究
  • 此芯p1开发板使用OpenHarmony时llama.cpp不同优化速度对比(GPU vs CPU)
  • 掌握工程化固件烧录,开启你的技术进阶之路-FPGA ISE(xilinx)
  • 微软推出“愤怒计划“:利用AI工具实现恶意软件自主分类
  • Daemon Tools for Mac —— 专业虚拟光驱与磁盘映像工具
  • 手机控制断路器:智能家居安全用电的新篇章
  • Casrel关系抽取
  • 如何快速开发符合Matter标准的智能家居设备?
  • 在 openEuler 24.03 (LTS) 上安装 FFmpeg 的完整指南
  • 接入小甲鱼数字人API教程【详解】
  • 物联网架构全解析:华为“1+2+1”与格行随身WiFi,技术如何定义未来生活?
  • 优选算法 力扣 LCR 179. 查找总价格为目标值的两个商品 双指针降低时间复杂度 C++题解 每日一题
  • 界面组件DevExpress WPF中文教程:网格视图数据布局 - 紧凑模式
  • 代企业开发钉钉数据对接
  • hadoop HDFS 重置详细步骤
  • [bug]AttributeError: module ‘typing_extensions‘ has no attribute ‘TypeVar‘
  • 人工智能的20大应用
  • 图论(1):图数据结构
  • 第二十七天(数据结构:图)
  • uni-app vue3 小程序接入 aliyun-rtc-wx-sdk
  • Android 之 Jetpack- Room
  • 力扣238:除自身之外数组的乘积
  • 快速开发实践
  • 使用Spring Boot + Angular构建安全的登录注册系统
  • 十八、MySQL-DML-数据操作-插入(增加)、更新(修改)、删除
  • LongVie突破超长视频生成极限:1分钟电影级丝滑视频,双模态控制告别卡顿退化
  • 本地组策略编辑器无法打开(gpedit.msc命令异常)