Java實(shí)戰(zhàn)之利用POI生成Excel圖表
Apache POI是Java生態(tài)中處理Office文檔的核心工具,支持Excel圖表的動(dòng)態(tài)生成與數(shù)據(jù)綁定。本文以POI 5.x版本為例,詳解如何在Excel中創(chuàng)建折線圖、柱狀圖、餅圖等常見(jiàn)圖表,并提供代碼示例與最佳實(shí)踐。
一、環(huán)境配置與依賴(lài)管理
使用POI生成圖表需引入以下核心依賴(lài)(以Maven為例):
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.3</version> </dependency>
注意:POI 5.x版本與舊版本(如3.x)API差異較大,需避免依賴(lài)沖突
二、數(shù)據(jù)源準(zhǔn)備與工作表構(gòu)建
創(chuàng)建工作簿與工作表
XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet("數(shù)據(jù)表");
填充數(shù)據(jù)
以國(guó)家GDP數(shù)據(jù)為例,首行寫(xiě)入國(guó)家名稱(chēng),后續(xù)行填充數(shù)值:
// 創(chuàng)建標(biāo)題行 Row headerRow = sheet.createRow(0); headerRow.createCell(0).setCellValue("國(guó)家"); headerRow.createCell(1).setCellValue("俄羅斯"); headerRow.createCell(2).setCellValue("中國(guó)"); // 填充數(shù)據(jù)行 Row dataRow = sheet.createRow(1); dataRow.createCell(0).setCellValue("GDP(萬(wàn)億美元)"); 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)建圖表對(duì)象 XSSFChart chart = drawing.createChart(anchor); chart.setTitleText("國(guó)家GDP趨勢(shì)分析"); // 綁定數(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):通過(guò)CellRangeAddress
綁定數(shù)據(jù)區(qū)域,支持動(dòng)態(tài)擴(kuò)展
2. 柱狀圖(Bar Chart)
柱狀圖與折線圖代碼結(jié)構(gòu)類(lèi)似,僅需修改圖表類(lèi)型與樣式:
XDDFBarChartData data = (XDDFBarChartData) chart.createData(ChartTypes.BAR, xAxis, yAxis);
可通過(guò)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);
四、常見(jiàn)問(wèn)題與優(yōu)化
1.圖表位置偏移
通過(guò)XSSFClientAnchor
參數(shù)調(diào)整坐標(biāo)(如col1, row1, col2, row2
)控制圖表位置
2.數(shù)據(jù)動(dòng)態(tài)更新
使用CellRangeAddress
動(dòng)態(tài)擴(kuò)展數(shù)據(jù)范圍,避免硬編碼。例如:
CellRangeAddress valuesRange = new CellRangeAddress(1, 1, 1, sheet.getRow(1).getLastCellNum());
3.樣式自定義
- 坐標(biāo)軸標(biāo)題:
xAxis.setTitle("國(guó)家")
- 圖例位置:
chart.getOrAddLegend().setPosition(LegendPosition.TOP_RIGHT)
- 顏色設(shè)置:通過(guò)
XDDFSolidFillProperties
指定RGB值
五、總結(jié)
通過(guò)POI生成Excel圖表的核心在于數(shù)據(jù)綁定與API靈活調(diào)用。開(kāi)發(fā)者需注意:
- 數(shù)據(jù)區(qū)域需與圖表類(lèi)型匹配(如分類(lèi)軸與數(shù)值軸);
- 高版本POI(≥5.0)推薦使用
XDDF
系列API,兼容性更強(qiáng); - 復(fù)雜圖表建議封裝工具類(lèi)(如
ChartUtils
)提升代碼復(fù)用性
到此這篇關(guān)于Java實(shí)戰(zhàn)之利用POI生成Excel圖表的文章就介紹到這了,更多相關(guān)Java POI生成Excel內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)八個(gè)常用的排序算法:插入排序、冒泡排序、選擇排序、希爾排序等
這篇文章主要介紹了Java如何實(shí)現(xiàn)八個(gè)常用的排序算法:插入排序、冒泡排序、選擇排序、希爾排序 、快速排序、歸并排序、堆排序和LST基數(shù)排序,需要的朋友可以參考下2015-07-07SpringBoot + Spring Cloud Consul 服務(wù)注冊(cè)和發(fā)現(xiàn)詳細(xì)解析
這篇文章主要介紹了SpringBoot + Spring Cloud Consul 服務(wù)注冊(cè)和發(fā)現(xiàn),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Java實(shí)現(xiàn)的DES加密解密工具類(lèi)實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)的DES加密解密工具類(lèi),結(jié)合具體實(shí)例形式分析了Java實(shí)現(xiàn)的DES加密解密工具類(lèi)定義與使用方法,需要的朋友可以參考下2017-09-09Java詳細(xì)分析sleep和wait方法有哪些區(qū)別
這篇文章主要介紹了Java中wait與sleep的講解(wait有參及無(wú)參區(qū)別),通過(guò)代碼介紹了wait()?與wait(?long?timeout?)?區(qū)別,wait(0)?與?sleep(0)區(qū)別,需要的朋友可以參考下2022-04-04Spring注解@Resource和@Autowired區(qū)別對(duì)比詳解
這篇文章主要介紹了Spring注解@Resource和@Autowired區(qū)別對(duì)比詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09使用Servlet Filter實(shí)現(xiàn)系統(tǒng)登錄權(quán)限
這篇文章主要為大家詳細(xì)介紹了使用Servlet Filter實(shí)現(xiàn)系統(tǒng)登錄權(quán)限,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10當(dāng)Mybatis遇上目錄樹(shù)超全完美解決方案
這篇文章主要介紹了當(dāng)Mybatis遇上目錄樹(shù)有哪些解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04Springboot如何使用Aspectj實(shí)現(xiàn)AOP面向切面編程
這篇文章主要介紹了Springboot如何使用Aspectj實(shí)現(xiàn)AOP面向切面編程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01