Java實(shí)戰(zhàn)之利用POI生成Excel圖表
Apache POI是Java生態(tài)中處理Office文檔的核心工具,支持Excel圖表的動態(tài)生成與數(shù)據(jù)綁定。本文以POI 5.x版本為例,詳解如何在Excel中創(chuàng)建折線圖、柱狀圖、餅圖等常見圖表,并提供代碼示例與最佳實(shí)踐。
一、環(huán)境配置與依賴管理
使用POI生成圖表需引入以下核心依賴(以Maven為例):
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
注意:POI 5.x版本與舊版本(如3.x)API差異較大,需避免依賴沖突
二、數(shù)據(jù)源準(zhǔn)備與工作表構(gòu)建
創(chuàng)建工作簿與工作表
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("數(shù)據(jù)表");
填充數(shù)據(jù)
以國家GDP數(shù)據(jù)為例,首行寫入國家名稱,后續(xù)行填充數(shù)值:
// 創(chuàng)建標(biāo)題行
Row headerRow = sheet.createRow(0);
headerRow.createCell(0).setCellValue("國家");
headerRow.createCell(1).setCellValue("俄羅斯");
headerRow.createCell(2).setCellValue("中國");
// 填充數(shù)據(jù)行
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)
// 定義圖表位置與尺寸
XSSFDrawing drawing = sheet.createDrawingPatriarch();
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 20);
// 創(chuàng)建圖表對象
XSSFChart chart = drawing.createChart(anchor);
chart.setTitleText("國家GDP趨勢分析");
// 綁定數(shù)據(jù)源
XDDFDataSource<String> countries = XDDFDataSourcesFactory.fromStringCellRange(sheet, new CellRangeAddress(0, 0, 1, 2));
XDDFNumericalDataSource<Double> values = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 1, 2));
// 配置坐標(biāo)軸與樣式
XDDFCategoryAxis xAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
XDDFValueAxis yAxis = chart.createValueAxis(AxisPosition.LEFT);
XDDFLineChartData data = (XDDFLineChartData) chart.createData(ChartTypes.LINE, xAxis, yAxis);
// 添加數(shù)據(jù)系列并渲染
XDDFLineChartData.Series series = data.addSeries(countries, values);
series.setTitle("GDP", null);
chart.plot(data);
關(guān)鍵點(diǎn):通過CellRangeAddress綁定數(shù)據(jù)區(qū)域,支持動態(tài)擴(kuò)展
2. 柱狀圖(Bar Chart)
柱狀圖與折線圖代碼結(jié)構(gòu)類似,僅需修改圖表類型與樣式:
XDDFBarChartData data = (XDDFBarChartData) chart.createData(ChartTypes.BAR, xAxis, yAxis);
可通過XDDFShapeProperties自定義柱體顏色與間距
3. 餅圖(Pie Chart)
餅圖需單獨(dú)設(shè)置數(shù)據(jù)標(biāo)簽與百分比顯示:
XDDFPieChartData data = (XDDFPieChartData) chart.createData(ChartTypes.PIE, null, null); XDDFPieChartData.Series series = data.addSeries(countries, values); chart.plot(data); // 啟用百分比標(biāo)簽 chart.getCTChart().getPlotArea().getPieChartArray(0).addNewDLbls().addNewShowPercent().setVal(true);
四、常見問題與優(yōu)化
1.圖表位置偏移
通過XSSFClientAnchor參數(shù)調(diào)整坐標(biāo)(如col1, row1, col2, row2)控制圖表位置
2.數(shù)據(jù)動態(tài)更新
使用CellRangeAddress動態(tài)擴(kuò)展數(shù)據(jù)范圍,避免硬編碼。例如:
CellRangeAddress valuesRange = new CellRangeAddress(1, 1, 1, sheet.getRow(1).getLastCellNum());
3.樣式自定義
- 坐標(biāo)軸標(biāo)題:
xAxis.setTitle("國家") - 圖例位置:
chart.getOrAddLegend().setPosition(LegendPosition.TOP_RIGHT) - 顏色設(shè)置:通過
XDDFSolidFillProperties指定RGB值
五、總結(jié)
通過POI生成Excel圖表的核心在于數(shù)據(jù)綁定與API靈活調(diào)用。開發(fā)者需注意:
- 數(shù)據(jù)區(qū)域需與圖表類型匹配(如分類軸與數(shù)值軸);
- 高版本POI(≥5.0)推薦使用
XDDF系列API,兼容性更強(qiáng); - 復(fù)雜圖表建議封裝工具類(如
ChartUtils)提升代碼復(fù)用性
到此這篇關(guān)于Java實(shí)戰(zhàn)之利用POI生成Excel圖表的文章就介紹到這了,更多相關(guān)Java POI生成Excel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot在項(xiàng)目中訪問靜態(tài)資源步驟分析
今天在玩SpringBoot的demo的時(shí)候,放了張圖片在resources目錄下,啟動區(qū)訪問的時(shí)候,突然好奇是識別哪些文件夾來展示靜態(tài)資源的, 為什么有時(shí)候放的文件夾不能顯示,有的卻可以2023-01-01
java實(shí)現(xiàn)優(yōu)酷視頻地址解析示例代碼分享
最近做了一個(gè)在線視頻的下載器,需要解析youku的視頻,獲得真正的視頻地址,現(xiàn)在把解析過程記錄下來以供參考2014-01-01
springboot整合netty實(shí)現(xiàn)心跳檢測和自動重連
本文主要介紹了Spring Boot中整合Netty實(shí)現(xiàn)心跳檢測和自動重連,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11
Springboot yml如何獲取系統(tǒng)環(huán)境變量的值
這篇文章主要介紹了Springboot yml如何獲取系統(tǒng)環(huán)境變量的值,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
SpringBoot+Redis實(shí)現(xiàn)分布式鎖的深度剖析
分布式鎖是在分布式系統(tǒng)中協(xié)調(diào)多個(gè)節(jié)點(diǎn)對共享資源進(jìn)行互斥訪問的機(jī)制,這篇文章主要為大家詳細(xì)介紹了如何使用SpringBoot和Redis實(shí)現(xiàn)分布式鎖,感興趣的小伙伴可以了解下2026-01-01
java大數(shù)乘法的簡單實(shí)現(xiàn) 浮點(diǎn)數(shù)乘法運(yùn)算
大數(shù)乘法可以進(jìn)行任意大小和精度的整數(shù)和浮點(diǎn)數(shù)的乘法運(yùn)算, 精確度很高, 可以用作經(jīng)融等領(lǐng)域的計(jì)算,這個(gè)是我看了一些資料, 然后自己整理實(shí)現(xiàn)的,簡單測試了一下2014-01-01

