POI EXCEL 图表、折线图、条形图,柱状图、饼图
1、POM.XML
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.4</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.13</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-compress</artifactId> <version>1.19</version> </dependency> <dependency> <groupId>org.apache.xmlbeans</groupId> <artifactId>xmlbeans</artifactId> <version>3.1.0</version> </dependency>
2、POI EXCEL 图表-折线图
package test; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xddf.usermodel.PresetLineDash; import org.apache.poi.xddf.usermodel.XDDFLineProperties; import org.apache.poi.xddf.usermodel.XDDFPresetLineDash; import org.apache.poi.xddf.usermodel.chart.AxisPosition; import org.apache.poi.xddf.usermodel.chart.ChartTypes; import org.apache.poi.xddf.usermodel.chart.LegendPosition; import org.apache.poi.xddf.usermodel.chart.MarkerStyle; import org.apache.poi.xddf.usermodel.chart.XDDFCategoryAxis; import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend; import org.apache.poi.xddf.usermodel.chart.XDDFDataSource; import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory; import org.apache.poi.xddf.usermodel.chart.XDDFLineChartData; import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource; import org.apache.poi.xddf.usermodel.chart.XDDFValueAxis; import org.apache.poi.xssf.usermodel.XSSFChart; import org.apache.poi.xssf.usermodel.XSSFClientAnchor; import org.apache.poi.xssf.usermodel.XSSFDrawing; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ApachePoiLineChart4 { public static void main(String[] args) throws IOException { XSSFWorkbook wb = new XSSFWorkbook(); String sheetName = "Sheet1"; FileOutputStream fileOut = null; try { XSSFSheet sheet = wb.createSheet(sheetName); //第一行,国家名称 Row row = sheet.createRow(0); Cell cell = row.createCell(0); cell.setCellValue("俄罗斯"); cell = row.createCell(1); cell.setCellValue("加拿大"); cell = row.createCell(2); cell.setCellValue("美国"); cell = row.createCell(3); cell.setCellValue("中国"); cell = row.createCell(4); cell.setCellValue("巴西"); cell = row.createCell(5); cell.setCellValue("澳大利亚"); cell = row.createCell(6); cell.setCellValue("印度"); // 第二行,乡村地区 row = sheet.createRow(1); cell = row.createCell(0); cell.setCellValue(17098242); cell = row.createCell(1); cell.setCellValue(9984670); cell = row.createCell(2); cell.setCellValue(9826675); cell = row.createCell(3); cell.setCellValue(9596961); cell = row.createCell(4); cell.setCellValue(8514877); cell = row.createCell(5); cell.setCellValue(7741220); cell = row.createCell(6); cell.setCellValue(3287263); // 第三行,农村人口 row = sheet.createRow(2); cell = row.createCell(0); cell.setCellValue(14590041); cell = row.createCell(1); cell.setCellValue(35151728); cell = row.createCell(2); cell.setCellValue(32993302); cell = row.createCell(3); cell.setCellValue(14362887); cell = row.createCell(4); cell.setCellValue(21172141); cell = row.createCell(5); cell.setCellValue(25335727); cell = row.createCell(6); cell.setCellValue(13724923); // 第四行,面积平局 row = sheet.createRow(3); cell = row.createCell(0); cell.setCellValue(9435701.143); cell = row.createCell(1); cell.setCellValue(9435701.143); cell = row.createCell(2); cell.setCellValue(9435701.143); cell = row.createCell(3); cell.setCellValue(9435701.143); cell = row.createCell(4); cell.setCellValue(9435701.143); cell = row.createCell(5); cell.setCellValue(9435701.143); cell = row.createCell(6); cell.setCellValue(9435701.143); // 第四行,人口平局 row = sheet.createRow(4); cell = row.createCell(0); cell.setCellValue(22475821.29); cell = row.createCell(1); cell.setCellValue(22475821.29); cell = row.createCell(2); cell.setCellValue(22475821.29); cell = row.createCell(3); cell.setCellValue(22475821.29); cell = row.createCell(4); cell.setCellValue(22475821.29); cell = row.createCell(5); cell.setCellValue(22475821.29); cell = row.createCell(6); cell.setCellValue(22475821.29); //创建一个画布 XSSFDrawing drawing = sheet.createDrawingPatriarch(); //前四个默认0,[0,5]:从0列5行开始;[7,26]:宽度7个单元格,26向下扩展到26行 //默认宽度(14-8)*12 XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 7, 26); //创建一个chart对象 XSSFChart chart = drawing.createChart(anchor); //标题 chart.setTitleText("地区排名前七的国家"); //标题覆盖 chart.setTitleOverlay(false); //图例位置 XDDFChartLegend legend = chart.getOrAddLegend(); legend.setPosition(LegendPosition.TOP); //分类轴标(X轴),标题位置 XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM); bottomAxis.setTitle("国家"); //值(Y轴)轴,标题位置 XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT); leftAxis.setTitle("面积和人口"); //CellRangeAddress(起始行号,终止行号, 起始列号,终止列号) //分类轴标(X轴)数据,单元格范围位置[0, 0]到[0, 6] XDDFDataSource<String> countries = XDDFDataSourcesFactory.fromStringCellRange(sheet, new CellRangeAddress(0, 0, 0, 6)); // XDDFCategoryDataSource countries = XDDFDataSourcesFactory.fromArray(new String[] {"俄罗斯","加拿大","美国","中国","巴西","澳大利亚","印度"}); //数据1,单元格范围位置[1, 0]到[1, 6] XDDFNumericalDataSource<Double> area = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, 6)); // XDDFNumericalDataSource<Integer> area = XDDFDataSourcesFactory.fromArray(new Integer[] {17098242,9984670,9826675,9596961,8514877,7741220,3287263}); //数据1,单元格范围位置[2, 0]到[2, 6] XDDFNumericalDataSource<Double> population = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, 6)); //LINE:折线图, XDDFLineChartData data = (XDDFLineChartData) chart.createData(ChartTypes.LINE, bottomAxis, leftAxis); //图表加载数据,折线1 XDDFLineChartData.Series series1 = (XDDFLineChartData.Series) data.addSeries(countries, area); //折线图例标题 series1.setTitle("面积", null); //直线 series1.setSmooth(false); //设置标记大小 series1.setMarkerSize((short) 6); //设置标记样式,星星 series1.setMarkerStyle(MarkerStyle.STAR); //图表加载数据,折线2 XDDFLineChartData.Series series2 = (XDDFLineChartData.Series) data.addSeries(countries, population); //折线图例标题 series2.setTitle("人口", null); //曲线 series2.setSmooth(true); //设置标记大小 series2.setMarkerSize((short) 6); //设置标记样式,正方形 series2.setMarkerStyle(MarkerStyle.SQUARE); //图表加载数据,平均线3 //数据1,单元格范围位置[2, 0]到[2, 6] XDDFNumericalDataSource<Double> population3 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(3, 3, 0, 6)); XDDFLineChartData.Series series3 = (XDDFLineChartData.Series) data.addSeries(countries, population3); //折线图例标题 series3.setTitle("面积平均", null); //直线 series3.setSmooth(false); //设置标记大小 // series3.setMarkerSize((short) 3); //设置标记样式,正方形 series3.setMarkerStyle(MarkerStyle.NONE); //折线图LineChart // XDDFSolidFillProperties fill = new XDDFSolidFillProperties(XDDFColor.from(PresetColor.CHARTREUSE)); XDDFLineProperties line = new XDDFLineProperties(); // line.setFillProperties(fill); // line.setLineCap(LineCap.ROUND); line.setPresetDash(new XDDFPresetLineDash(PresetLineDash.DOT));//虚线 // XDDFShapeProperties shapeProperties = new XDDFShapeProperties(); // shapeProperties.setLineProperties(line); // series3.setShapeProperties(shapeProperties); series3.setLineProperties(line); //图表加载数据,平均线3 //数据1,单元格范围位置[2, 0]到[2, 6] XDDFNumericalDataSource<Double> population4 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(4, 4, 0, 6)); XDDFLineChartData.Series series4 = (XDDFLineChartData.Series) data.addSeries(countries, population4); //折线图例标题 series4.setTitle("人口平均", null); //直线 series4.setSmooth(false); //设置标记大小 // series4.setMarkerSize((short) 3); //设置标记样式,正方形 series4.setMarkerStyle(MarkerStyle.NONE); XDDFLineProperties line4 = new XDDFLineProperties(); line4.setPresetDash(new XDDFPresetLineDash(PresetLineDash.DOT));//虚线 series4.setLineProperties(line); //绘制 chart.plot(data); // 将输出写入excel文件 String filename = "排行榜前七的国家.xlsx"; fileOut = new FileOutputStream(filename); wb.write(fileOut); } catch (Exception e) { e.printStackTrace(); } finally { wb.close(); if (fileOut != null) { fileOut.close(); } } } }
3、POI EXCEL 图表-柱状图、条形图
package test; import java.io.FileOutputStream; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Chart; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFChart; import org.apache.poi.xssf.usermodel.XSSFClientAnchor; import org.apache.poi.xssf.usermodel.XSSFDrawing; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource; import org.openxmlformats.schemas.drawingml.x2006.chart.CTBarChart; import org.openxmlformats.schemas.drawingml.x2006.chart.CTBarSer; import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean; import org.openxmlformats.schemas.drawingml.x2006.chart.CTCatAx; import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart; import org.openxmlformats.schemas.drawingml.x2006.chart.CTLegend; import org.openxmlformats.schemas.drawingml.x2006.chart.CTLineChart; import org.openxmlformats.schemas.drawingml.x2006.chart.CTLineSer; import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource; import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumRef; import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea; import org.openxmlformats.schemas.drawingml.x2006.chart.CTScaling; import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx; import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrRef; import org.openxmlformats.schemas.drawingml.x2006.chart.CTValAx; import org.openxmlformats.schemas.drawingml.x2006.chart.STAxPos; import org.openxmlformats.schemas.drawingml.x2006.chart.STBarDir; import org.openxmlformats.schemas.drawingml.x2006.chart.STCrosses; import org.openxmlformats.schemas.drawingml.x2006.chart.STLegendPos; import org.openxmlformats.schemas.drawingml.x2006.chart.STOrientation; import org.openxmlformats.schemas.drawingml.x2006.chart.STTickLblPos; public class BarAndLineChart2 { public static void main(String[] args) throws Exception { XSSFWorkbook wb = new XSSFWorkbook(); XSSFSheet sheet = wb.createSheet("Sheet1"); Row row; Cell cell; row = sheet.createRow(0); row.createCell(0); row.createCell(1).setCellValue("Bars"); row.createCell(2).setCellValue("Lines"); for (int r = 1; r < 7; r++) { row = sheet.createRow(r); cell = row.createCell(0); cell.setCellValue("C" + r); cell = row.createCell(1); cell.setCellValue(new java.util.Random().nextDouble()); cell = row.createCell(2); cell.setCellValue(new java.util.Random().nextDouble()*10d); } XSSFDrawing drawing = sheet.createDrawingPatriarch(); // ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 4, 0, 11, 15); XSSFClientAnchor anchor = (XSSFClientAnchor) drawing.createAnchor(0, 0, 0, 0, 4, 0, 11, 15); Chart chart = drawing.createChart(anchor); CTChart ctChart = ((XSSFChart)chart).getCTChart(); CTPlotArea ctPlotArea = ctChart.getPlotArea(); //the bar chart CTBarChart ctBarChart = ctPlotArea.addNewBarChart(); CTBoolean ctBoolean = ctBarChart.addNewVaryColors(); ctBoolean.setVal(true); ctBarChart.addNewBarDir().setVal(STBarDir.COL); //the bar series CTBarSer ctBarSer = ctBarChart.addNewSer(); CTSerTx ctSerTx = ctBarSer.addNewTx(); CTStrRef ctStrRef = ctSerTx.addNewStrRef(); ctStrRef.setF("Sheet1!$B$1"); ctBarSer.addNewIdx().setVal(0); CTAxDataSource cttAxDataSource = ctBarSer.addNewCat(); ctStrRef = cttAxDataSource.addNewStrRef(); ctStrRef.setF("Sheet1!$A$2:$A$7"); CTNumDataSource ctNumDataSource = ctBarSer.addNewVal(); CTNumRef ctNumRef = ctNumDataSource.addNewNumRef(); ctNumRef.setF("Sheet1!$B$2:$B$7"); //at least the border lines in Libreoffice Calc ;-) ctBarSer.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[] {0,0,0}); //telling the BarChart that it has axes and giving them Ids ctBarChart.addNewAxId().setVal(123456); //cat axis 1 (bars) ctBarChart.addNewAxId().setVal(123457); //val axis 1 (left) //the line chart CTLineChart ctLineChart = ctPlotArea.addNewLineChart(); ctBoolean = ctLineChart.addNewVaryColors(); ctBoolean.setVal(true); //the line series CTLineSer ctLineSer = ctLineChart.addNewSer(); ctSerTx = ctLineSer.addNewTx(); ctStrRef = ctSerTx.addNewStrRef(); ctStrRef.setF("Sheet1!$C$1"); ctLineSer.addNewIdx().setVal(1); cttAxDataSource = ctLineSer.addNewCat(); ctStrRef = cttAxDataSource.addNewStrRef(); ctStrRef.setF("Sheet1!$A$2:$A$7"); ctNumDataSource = ctLineSer.addNewVal(); ctNumRef = ctNumDataSource.addNewNumRef(); ctNumRef.setF("Sheet1!$C$2:$C$7"); //at least the border lines in Libreoffice Calc ;-) ctLineSer.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[] {0,0,0}); //telling the LineChart that it has axes and giving them Ids ctLineChart.addNewAxId().setVal(123458); //cat axis 2 (lines) ctLineChart.addNewAxId().setVal(123459); //val axis 2 (right) //cat axis 1 (bars) CTCatAx ctCatAx = ctPlotArea.addNewCatAx(); ctCatAx.addNewAxId().setVal(123456); //id of the cat axis CTScaling ctScaling = ctCatAx.addNewScaling(); ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX); ctCatAx.addNewDelete().setVal(false); ctCatAx.addNewAxPos().setVal(STAxPos.B); ctCatAx.addNewCrossAx().setVal(123457); //id of the val axis ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO); //val axis 1 (left) CTValAx ctValAx = ctPlotArea.addNewValAx(); ctValAx.addNewAxId().setVal(123457); //id of the val axis ctScaling = ctValAx.addNewScaling(); ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX); ctValAx.addNewDelete().setVal(false); ctValAx.addNewAxPos().setVal(STAxPos.L); ctValAx.addNewCrossAx().setVal(123456); //id of the cat axis ctValAx.addNewCrosses().setVal(STCrosses.AUTO_ZERO); //this val axis crosses the cat axis at zero ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO); //cat axis 2 (lines) ctCatAx = ctPlotArea.addNewCatAx(); ctCatAx.addNewAxId().setVal(123458); //id of the cat axis ctScaling = ctCatAx.addNewScaling(); ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX); ctCatAx.addNewDelete().setVal(true); //this cat axis is deleted ctCatAx.addNewAxPos().setVal(STAxPos.B); ctCatAx.addNewCrossAx().setVal(123459); //id of the val axis ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO); //val axis 2 (right) ctValAx = ctPlotArea.addNewValAx(); ctValAx.addNewAxId().setVal(123459); //id of the val axis ctScaling = ctValAx.addNewScaling(); ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX); ctValAx.addNewDelete().setVal(false); ctValAx.addNewAxPos().setVal(STAxPos.R); ctValAx.addNewCrossAx().setVal(123458); //id of the cat axis ctValAx.addNewCrosses().setVal(STCrosses.MAX); //this val axis crosses the cat axis at max value ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO); //legend CTLegend ctLegend = ctChart.addNewLegend(); ctLegend.addNewLegendPos().setVal(STLegendPos.B); ctLegend.addNewOverlay().setVal(false); FileOutputStream fileOut = new FileOutputStream("BarAndLineChart2.xlsx"); wb.write(fileOut); fileOut.close(); } }
4、POI EXCEL 饼图
package test; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xddf.usermodel.chart.ChartTypes; import org.apache.poi.xddf.usermodel.chart.LegendPosition; import org.apache.poi.xddf.usermodel.chart.XDDFChartData; import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend; import org.apache.poi.xddf.usermodel.chart.XDDFDataSource; import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory; import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource; import org.apache.poi.xssf.usermodel.XSSFChart; import org.apache.poi.xssf.usermodel.XSSFClientAnchor; import org.apache.poi.xssf.usermodel.XSSFDrawing; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ApachePoiPieChart { public static void main(String[] args) throws IOException { XSSFWorkbook wb = new XSSFWorkbook(); FileOutputStream fileOut = null; try { XSSFSheet sheet = wb.createSheet("Sheet1"); //第一行,国家名称 Row row = sheet.createRow(0); Cell cell = row.createCell(0); cell.setCellValue("俄罗斯"); cell = row.createCell(1); cell.setCellValue("加拿大"); cell = row.createCell(2); cell.setCellValue("美国"); cell = row.createCell(3); cell.setCellValue("中国"); cell = row.createCell(4); cell.setCellValue("巴西"); cell = row.createCell(5); cell.setCellValue("澳大利亚"); cell = row.createCell(6); cell.setCellValue("印度"); // 第二行,乡村地区 row = sheet.createRow(1); cell = row.createCell(0); cell.setCellValue(17098242); cell = row.createCell(1); cell.setCellValue(9984670); cell = row.createCell(2); cell.setCellValue(9826675); cell = row.createCell(3); cell.setCellValue(9596961); cell = row.createCell(4); cell.setCellValue(8514877); cell = row.createCell(5); cell.setCellValue(7741220); cell = row.createCell(6); cell.setCellValue(3287263); // 第三行,农村人口 row = sheet.createRow(2); cell = row.createCell(0); cell.setCellValue(14590041); cell = row.createCell(1); cell.setCellValue(35151728); cell = row.createCell(2); cell.setCellValue(32993302); cell = row.createCell(3); cell.setCellValue(14362887); cell = row.createCell(4); cell.setCellValue(21172141); cell = row.createCell(5); cell.setCellValue(25335727); cell = row.createCell(6); cell.setCellValue(13724923); //创建一个画布 XSSFDrawing drawing = sheet.createDrawingPatriarch(); //前四个默认0,[0,4]:从0列4行开始;[7,20]:宽度7个单元格,20向下扩展到20行 //默认宽度(14-8)*12 XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 4, 7, 20); //创建一个chart对象 XSSFChart chart = drawing.createChart(anchor); //标题 chart.setTitleText("地区排名前七的国家"); //标题是否覆盖图表 chart.setTitleOverlay(false); //图例位置 XDDFChartLegend legend = chart.getOrAddLegend(); legend.setPosition(LegendPosition.TOP_RIGHT); //CellRangeAddress(起始行号,终止行号, 起始列号,终止列号) //分类轴标数据, XDDFDataSource<String> countries = XDDFDataSourcesFactory.fromStringCellRange(sheet, new CellRangeAddress(0, 0, 0, 6)); //数据1, XDDFNumericalDataSource<Double> values = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, 6)); //XDDFChartData data = chart.createData(ChartTypes.PIE3D, null, null); XDDFChartData data = chart.createData(ChartTypes.PIE, null, null); //设置为可变颜色 data.setVaryColors(true); //图表加载数据 data.addSeries(countries, values); //绘制 chart.plot(data); // 将输出写入excel文件 fileOut = new FileOutputStream("pie-chart-top-seven-countries.xlsx"); wb.write(fileOut); } catch (Exception e) { e.printStackTrace(); } finally { wb.close(); fileOut.close(); } } }
参考链接:https://www.freesion.com/article/3914537989/