Java POI生成Excel图表实战指南

Apache POI是Java生态中处理Office文档的核心工具,支持Excel图表的动态生成与数据绑定。本文以POI 5.x版本为例,详解如何在Excel中创建折线图、柱状图、饼图等常见图表,并提供代码示例与最佳实践。


一、环境配置与依赖管理

使用POI生成图表需引入以下核心依赖(以Maven为例):

xml 复制代码
XML
<dependency>  
    <groupId>org.apache.poi</groupId>  
    <artifactId>poi-ooxml</artifactId>  
    <version>5.2.3</version>  
</dependency>  

注意:POI 5.x版本与旧版本(如3.x)API差异较大,需避免依赖冲突


二、数据源准备与工作表构建

  1. 创建工作簿与工作表
ini 复制代码
Java
XSSFWorkbook workbook = new XSSFWorkbook();  
XSSFSheet sheet = workbook.createSheet("数据表");  
  1. 填充数据
    以国家GDP数据为例,首行写入国家名称,后续行填充数值:
scss 复制代码
Java
// 创建标题行  
Row headerRow = sheet.createRow(0);  
headerRow.createCell(0).setCellValue("国家");  
headerRow.createCell(1).setCellValue("俄罗斯");  
headerRow.createCell(2).setCellValue("中国");  
// 填充数据行  
Row dataRow = sheet.createRow(1);  
dataRow.createCell(0).setCellValue("GDP(万亿美元)");  
dataRow.createCell(1).setCellValue(1.78);  
dataRow.createCell(2).setCellValue(17.96);  

三、图表生成核心步骤

1. 折线图(Line Chart)
ini 复制代码
Java
// 定义图表位置与尺寸  
XSSFDrawing drawing = sheet.createDrawingPatriarch();  
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 20);  

// 创建图表对象  
XSSFChart chart = drawing.createChart(anchor);  
chart.setTitleText("国家GDP趋势分析");  

// 绑定数据源  
XDDFDataSource<String> countries = XDDFDataSourcesFactory.fromStringCellRange(sheet, new CellRangeAddress(0, 0, 1, 2));  
XDDFNumericalDataSource<Double> values = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 1, 2));  

// 配置坐标轴与样式  
XDDFCategoryAxis xAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);  
XDDFValueAxis yAxis = chart.createValueAxis(AxisPosition.LEFT);  
XDDFLineChartData data = (XDDFLineChartData) chart.createData(ChartTypes.LINE, xAxis, yAxis);  

// 添加数据系列并渲染  
XDDFLineChartData.Series series = data.addSeries(countries, values);  
series.setTitle("GDP", null);  
chart.plot(data);  

关键点 :通过CellRangeAddress绑定数据区域,支持动态扩展

2. 柱状图(Bar Chart)

柱状图与折线图代码结构类似,仅需修改图表类型与样式:

ini 复制代码
Java
XDDFBarChartData data = (XDDFBarChartData) chart.createData(ChartTypes.BAR, xAxis, yAxis);  

可通过XDDFShapeProperties自定义柱体颜色与间距

3. 饼图(Pie Chart)

饼图需单独设置数据标签与百分比显示:

scss 复制代码
Java
XDDFPieChartData data = (XDDFPieChartData) chart.createData(ChartTypes.PIE, null, null);  
XDDFPieChartData.Series series = data.addSeries(countries, values);  
chart.plot(data);  
// 启用百分比标签  
chart.getCTChart().getPlotArea().getPieChartArray(0).addNewDLbls().addNewShowPercent().setVal(true);  

四、常见问题与优化

  1. 图表位置偏移

    通过XSSFClientAnchor参数调整坐标(如col1, row1, col2, row2)控制图表位置

  2. 数据动态更新

    使用CellRangeAddress动态扩展数据范围,避免硬编码。例如:

ini 复制代码
Java
CellRangeAddress valuesRange = new CellRangeAddress(1, 1, 1, sheet.getRow(1).getLastCellNum());  
  1. 样式自定义
  • 坐标轴标题xAxis.setTitle("国家")

  • 图例位置chart.getOrAddLegend().setPosition(LegendPosition.TOP_RIGHT)

  • 颜色设置 :通过XDDFSolidFillProperties指定RGB值


五、总结

通过POI生成Excel图表的核心在于数据绑定API灵活调用。开发者需注意:

  1. 数据区域需与图表类型匹配(如分类轴与数值轴);
  2. 高版本POI(≥5.0)推荐使用XDDF系列API,兼容性更强;
  3. 复杂图表建议封装工具类(如ChartUtils)提升代码复用性
相关推荐
石榴树下5 分钟前
00. 马里奥的 OAuth 2 和 OIDC 历险记
后端
uhakadotcom5 分钟前
开源:subdomainpy快速高效的 Python 子域名检测工具
前端·后端·面试
似水流年流不尽思念22 分钟前
容器化技术了解吗?主要解决什么问题?原理是什么?
后端
Java水解23 分钟前
Java中的四种引用类型详解:强引用、软引用、弱引用和虚引用
java·后端
i听风逝夜24 分钟前
看好了,第二遍,SpringBoot单体应用真正的零停机无缝更新代码
后端
柏油1 小时前
可视化 MySQL binlog 监听方案
数据库·后端·mysql
舒一笑2 小时前
Started TttttApplication in 0.257 seconds (没有 Web 依赖导致 JVM 正常退出)
jvm·spring boot·后端
M1A12 小时前
Java Enum 类:优雅的常量定义与管理方式(深度解析)
后端
AAA修煤气灶刘哥3 小时前
别再懵了!Spring、Spring Boot、Spring MVC 的区别,一篇讲透
后端·面试
柏油3 小时前
MySQL 字符集 utf8 与 utf8mb4
数据库·后端·mysql