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)提升代码复用性
相关推荐
Lost of 程序猿8 分钟前
ASP.NET Core API 版本管理与契约演进:船岸版本碎片化下的兼容性工程
后端·asp.net
吃饱了得干活18 分钟前
Redis 从单机到集群:持久化、主从复制、哨兵与集群完全指南
redis·后端
老孙讲技术25 分钟前
【监控开发】把车间未戴帽和烟火报警接进安监值班群:workwearDetect 对图与 setMessageCallback 订 smokeAlarm
后端·物联网·音视频开发
计算机毕设定制辅导-无忧学长26 分钟前
基于Spring Boot的玄幻小说个性化推荐平台设计与实现
java·vue.js·spring boot·后端·mysql·推荐算法
码路漫漫27 分钟前
LRU 真的能解决日志按业务 Key 分文件的落地瓶颈吗?
java·后端
小满zs28 分钟前
Go语言第十一章(协程)
后端·go
1001101_QIA2 小时前
从 CPU 到 GPU:高速缓存、指令并行与 CUDA 执行原理入门
java·后端·spring
2501_928996222 小时前
信创备份一体机性能焦虑根源与中科热备国产CPU平台实测拆解
后端·数据安全·测试
程序员清风3 小时前
聊聊怎么缓解找工作的焦虑感?
java·后端·面试
不一样的少年_3 小时前
明明做了很多事,为什么简历看起来还是没含金量?
前端·后端·招聘