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
绘制。
特点:
- 完全免费,可定制化
- 仅适合简单表格(复杂样式、公式、图表难以实现)
- 需手动处理样式渲染,开发成本高
核心步骤:
- 用 Apache POI 读取 Excel 内容(单元格值、字体、颜色、边框等)
- 计算表格宽高、单元格大小
- 用
BufferedImage
和Graphics2D
绘制单元格、文字、边框 - 保存为图片
示例代码片段:
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(开源图表库):
- 用 POI 读取图表数据
- 用 JFreeChart 生成对应图表图片
- 合并表格图片和图表图片(如需)
三、方法对比与选择建议
方法 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
Aspose.Cells | 功能全面,支持复杂表格 / 图表,易用 | 商业付费,免费版有水印 | 生产环境、复杂 Excel 转换 |
Spire.XLS | 性价比高,免费版可用 | 免费版有页数限制 | 简单需求、小文件转换 |
Apache POI + 自定义 | 免费开源,可深度定制 | 开发复杂,不支持复杂样式 / 公式 | 简单表格、低成本场景 |
总结:
- 追求效率和完整性:优先选择 Aspose.Cells 或 Spire.XLS
- 免费且简单场景:用 Apache POI 手动绘制(仅限简单表格)
- 避免重复造轮子:商业库是大多数企业的选择(可评估成本)