POI Word生成图表:POI Word 图表、柱状图、条形图、折线图、饼图_u014644574的博客-CSDN博客_poi word 图表

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.poi</groupId><artifactId>poi-scratchpad</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><dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><version>1.4</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;/*** POI EXCEL 图表-折线图*/
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行结束// 默认宽度(14-8)*12XSSFClientAnchor 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);// 图表加载数据,折线1XDDFLineChartData.Series series1 = (XDDFLineChartData.Series) data.addSeries(countries, area);// 折线图例标题series1.setTitle("面积", null);// 直线series1.setSmooth(false);// 设置标记大小series1.setMarkerSize((short) 6);// 设置标记样式,星星series1.setMarkerStyle(MarkerStyle.STAR);// 图表加载数据,折线2XDDFLineChartData.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);// 打印图表的xml// System.out.println(chart.getCTChart());// 将输出写入excel文件String filename = "排行榜前七的国家.xlsx";fileOut = new FileOutputStream(filename);wb.write(fileOut);} catch (Exception e) {e.printStackTrace();} finally {wb.close();if (fileOut != null) {fileOut.close();}}}}

单个柱状图

package com.poi.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.PresetColor;
import org.apache.poi.xddf.usermodel.XDDFColor;
import org.apache.poi.xddf.usermodel.XDDFSolidFillProperties;
import org.apache.poi.xddf.usermodel.chart.AxisCrossBetween;
import org.apache.poi.xddf.usermodel.chart.AxisPosition;
import org.apache.poi.xddf.usermodel.chart.BarDirection;
import org.apache.poi.xddf.usermodel.chart.ChartTypes;
import org.apache.poi.xddf.usermodel.chart.LegendPosition;
import org.apache.poi.xddf.usermodel.chart.XDDFBarChartData;
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.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;/*** POI EXCEL 图表-柱状图*/
public class ApachePoiBarChart5 {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行结束// 默认宽度(14-8)*12XSSFClientAnchor 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});// bar:条形图,XDDFBarChartData bar = (XDDFBarChartData) chart.createData(ChartTypes.BAR, bottomAxis, leftAxis);leftAxis.setCrossBetween(AxisCrossBetween.BETWEEN);// 设置为可变颜色bar.setVaryColors(false);// 如果需要设置成自己想要的颜色,这里可变颜色要设置成false// 条形图方向,纵向/横向:纵向bar.setBarDirection(BarDirection.COL);// 图表加载数据,条形图1XDDFBarChartData.Series series1 = (XDDFBarChartData.Series) bar.addSeries(countries, area);// 条形图例标题series1.setTitle("面积图例", null);XDDFSolidFillProperties fill = new XDDFSolidFillProperties(XDDFColor.from(PresetColor.RED));// 条形图,填充颜色series1.setFillProperties(fill);// 绘制chart.plot(bar);// CTBarSer ser = chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(0);// CTLegend legend2 = chart.getCTChartSpace().getChart().getLegend();//更详细的图例设置// 打印图表的xmlSystem.out.println(chart.getCTChart());// 将输出写入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 双Y轴

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.AxisCrossBetween;
import org.apache.poi.xddf.usermodel.chart.AxisCrosses;
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;/*** POI EXCEL 双Y轴*/
public class Test5 {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行结束// 默认宽度(14-8)*12XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 7, 26);// 创建一个chart对象XSSFChart chart = drawing.createChart(anchor);// 标题chart.setTitleText("地区排名前七的国家");// 标题覆盖chart.setTitleOverlay(false);/*双Y轴*/// X轴XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);bottomAxis.setTitle("X轴标题");// bottomAxis.setVisible(false);// 隐藏X轴// 左Y轴XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);// 左Y轴和X轴交叉点在X轴0点位置leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);leftAxis.setCrossBetween(AxisCrossBetween.BETWEEN);// 构建坐标轴leftAxis.crossAxis(bottomAxis);bottomAxis.crossAxis(leftAxis);// 设置左Y轴最大值leftAxis.setMaximum(20000000);// leftAxis.setVisible(false);// 隐藏Y轴leftAxis.setTitle("左Y轴标题");// 右Y轴XDDFValueAxis rightAxis = chart.createValueAxis(AxisPosition.RIGHT);// 右Y轴和X轴交叉点在X轴最大值位置rightAxis.setCrosses(AxisCrosses.MAX);rightAxis.setCrossBetween(AxisCrossBetween.BETWEEN);// 构建坐标轴rightAxis.crossAxis(bottomAxis);bottomAxis.crossAxis(rightAxis);// 设置左Y轴最大值rightAxis.setMaximum(40000000);// rightAxis.setVisible(false);// 隐藏Y轴rightAxis.setTitle("右Y轴标题");// 图例位置XDDFChartLegend legend = chart.getOrAddLegend();legend.setPosition(LegendPosition.TOP);// CellRangeAddress(起始行号,终止行号, 起始列号,终止列号)// X轴数据,单元格范围位置[0, 0]到[0, 6]XDDFDataSource<String> xdatas = XDDFDataSourcesFactory.fromStringCellRange(sheet, new CellRangeAddress(0, 0, 0, 6));// XDDFCategoryDataSource xdatas = XDDFDataSourcesFactory.fromArray(new String[] {"俄罗斯","加拿大","美国","中国","巴西","澳大利亚","印度"});// 左Y轴数据,单元格范围位置[1, 0]到[1, 6]XDDFNumericalDataSource<Double> leftYdatas = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, 6));// XDDFNumericalDataSource<Integer> leftYdatas = XDDFDataSourcesFactory.fromArray(new Integer[] {17098242,9984670,9826675,9596961,8514877,7741220,3287263});// 右Y轴数据,单元格范围位置[2, 0]到[2, 6]XDDFNumericalDataSource<Double> rightYdatas = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, 6));// XDDFNumericalDataSource<Integer> rightYdatas = XDDFDataSourcesFactory.fromArray(new Integer[] {17098242,9984670,9826675,9596961,8514877,7741220,3287263});// LINE:折线图,XDDFLineChartData line1 = (XDDFLineChartData) chart.createData(ChartTypes.LINE, bottomAxis, rightAxis);// 图表加载数据,折线1XDDFLineChartData.Series series1 = (XDDFLineChartData.Series) line1.addSeries(xdatas, rightYdatas);// 折线图例标题series1.setTitle("右Y轴数据的图例标题", null);// 直线series1.setSmooth(false);// 设置标记大小series1.setMarkerSize((short) 6);// 设置标记样式,星星series1.setMarkerStyle(MarkerStyle.STAR);// 绘制chart.plot(line1);// LINE:折线图,XDDFLineChartData line2 = (XDDFLineChartData) chart.createData(ChartTypes.LINE, bottomAxis, leftAxis);// 图表加载数据,折线1XDDFLineChartData.Series series2 = (XDDFLineChartData.Series) line2.addSeries(xdatas, leftYdatas);// 折线图例标题series2.setTitle("左Y轴数据的图例标题", null);// 直线series2.setSmooth(false);// 设置标记大小series2.setMarkerSize((short) 6);// 设置标记样式,星星series2.setMarkerStyle(MarkerStyle.STAR);// 绘制chart.plot(line2);// 填充与线条-标记-填充-依数据点着色(取消勾选)chart.getCTChart().getPlotArea().getLineChartArray(0).addNewVaryColors().setVal(false);// 打印图表的xml// System.out.println(chart.getCTChart());// 将输出写入excel文件String filename = "双Y轴.xlsx";fileOut = new FileOutputStream(filename);wb.write(fileOut);} catch (Exception e) {e.printStackTrace();} finally {wb.close();if (fileOut != null) {fileOut.close();}}}}

4、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.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;/*** POI EXCEL 图表-柱状图、条形图*/
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 chartCTBarChart ctBarChart = ctPlotArea.addNewBarChart();CTBoolean ctBoolean = ctBarChart.addNewVaryColors();ctBoolean.setVal(true);ctBarChart.addNewBarDir().setVal(STBarDir.COL);// the bar seriesCTBarSer 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 IdsctBarChart.addNewAxId().setVal(123456); // cat axis 1 (bars)ctBarChart.addNewAxId().setVal(123457); // val axis 1 (left)// the line chartCTLineChart ctLineChart = ctPlotArea.addNewLineChart();ctBoolean = ctLineChart.addNewVaryColors();ctBoolean.setVal(true);// the line seriesCTLineSer 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 IdsctLineChart.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 axisCTScaling 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 axisctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);// val axis 1 (left)CTValAx ctValAx = ctPlotArea.addNewValAx();ctValAx.addNewAxId().setVal(123457); // id of the val axisctScaling = 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 axisctValAx.addNewCrosses().setVal(STCrosses.AUTO_ZERO); // this val axis crosses the cat axis at zeroctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);// cat axis 2 (lines)ctCatAx = ctPlotArea.addNewCatAx();ctCatAx.addNewAxId().setVal(123458); // id of the cat axisctScaling = ctCatAx.addNewScaling();ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);ctCatAx.addNewDelete().setVal(true); // this cat axis is deletedctCatAx.addNewAxPos().setVal(STAxPos.B);ctCatAx.addNewCrossAx().setVal(123459); // id of the val axisctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);// val axis 2 (right)ctValAx = ctPlotArea.addNewValAx();ctValAx.addNewAxId().setVal(123459); // id of the val axisctScaling = 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 axisctValAx.addNewCrosses().setVal(STCrosses.MAX); // this val axis crosses the cat axis at max valuectValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);// legendCTLegend ctLegend = ctChart.addNewLegend();ctLegend.addNewLegendPos().setVal(STLegendPos.B);ctLegend.addNewOverlay().setVal(false);// 打印图表的xml// System.out.println(ctChart);FileOutputStream fileOut = new FileOutputStream("BarAndLineChart2.xlsx");wb.write(fileOut);fileOut.close();wb.close();}
}

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.PresetColor;
import org.apache.poi.xddf.usermodel.XDDFColor;
import org.apache.poi.xddf.usermodel.XDDFSolidFillProperties;
import org.apache.poi.xddf.usermodel.chart.AxisCrossBetween;
import org.apache.poi.xddf.usermodel.chart.AxisPosition;
import org.apache.poi.xddf.usermodel.chart.BarDirection;
import org.apache.poi.xddf.usermodel.chart.ChartTypes;
import org.apache.poi.xddf.usermodel.chart.LegendPosition;
import org.apache.poi.xddf.usermodel.chart.XDDFBarChartData;
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.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;/*** POI EXCEL 图表-柱状图*/
public class ApachePoiBarChart {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行结束// 默认宽度(14-8)*12XSSFClientAnchor 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});// 数据2,单元格范围位置[2, 0]到[2, 6]XDDFNumericalDataSource<Double> population = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, 6));// bar:条形图,XDDFBarChartData bar = (XDDFBarChartData) chart.createData(ChartTypes.BAR, bottomAxis, leftAxis);leftAxis.setCrossBetween(AxisCrossBetween.BETWEEN);// 设置为可变颜色bar.setVaryColors(true);// 条形图方向,纵向/横向:纵向bar.setBarDirection(BarDirection.COL);// 图表加载数据,条形图1XDDFBarChartData.Series series1 = (XDDFBarChartData.Series) bar.addSeries(countries, area);// 条形图例标题series1.setTitle("面积", null);XDDFSolidFillProperties fill = new XDDFSolidFillProperties(XDDFColor.from(PresetColor.RED));// 条形图,填充颜色series1.setFillProperties(fill);// 图表加载数据,条形图2XDDFBarChartData.Series series2 = (XDDFBarChartData.Series) bar.addSeries(countries, population);// 条形图例标题series2.setTitle("人口", null);XDDFSolidFillProperties fill2 = new XDDFSolidFillProperties(XDDFColor.from(PresetColor.BLUE));// 条形图,填充颜色series2.setFillProperties(fill2);// 绘制chart.plot(bar);// 打印图表的xml// System.out.println(chart.getCTChart());// 将输出写入excel文件String filename = "排行榜前七的国家.xlsx";fileOut = new FileOutputStream(filename);wb.write(fileOut);} catch (Exception e) {e.printStackTrace();} finally {wb.close();if (fileOut != null) {fileOut.close();}}}}

5、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;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTDLbls;/*** POI EXCEL 饼图*/
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行结束// 默认宽度(14-8)*12XSSFClientAnchor 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);CTDLbls dLbls = chart.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).addNewDLbls();dLbls.addNewShowVal().setVal(false);dLbls.addNewShowLegendKey().setVal(false);dLbls.addNewShowCatName().setVal(true);// 类别名称dLbls.addNewShowSerName().setVal(false);dLbls.addNewShowPercent().setVal(true);// 百分比dLbls.addNewShowLeaderLines().setVal(true);// 引导线dLbls.setSeparator("\n");// 分隔符为分行符dLbls.addNewDLblPos().setVal(org.openxmlformats.schemas.drawingml.x2006.chart.STDLblPos.Enum.forString("inEnd"));// 数据标签内// 打印图表的xml// System.out.println(chart.getCTChart());// 将输出写入excel文件fileOut = new FileOutputStream("pie-chart-top-seven-countries.xlsx");wb.write(fileOut);} catch (Exception e) {e.printStackTrace();} finally {wb.close();fileOut.close();}}}

6、POI EXCEL 散点图

package test;import java.awt.Color;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;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.XDDFNoFillProperties;
import org.apache.poi.xddf.usermodel.chart.AxisCrosses;
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.ScatterStyle;
import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend;
import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory;
import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFScatterChartData;
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;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTCatAx;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTDPt;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTScatterChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTScatterSer;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTValAx;
import org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties;
import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
import org.openxmlformats.schemas.drawingml.x2006.main.CTSolidColorFillProperties;
import org.openxmlformats.schemas.drawingml.x2006.main.STSchemeColorVal.Enum;/*** 散点图*/
public class ApachePoiScatterChart {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("a");cell = row.createCell(1);cell.setCellValue("b");cell = row.createCell(2);cell.setCellValue("c");// 数据1row = sheet.createRow(1);cell = row.createCell(0);cell.setCellValue(1);cell = row.createCell(1);cell.setCellValue(1);cell = row.createCell(2);cell.setCellValue(2);// 数据2row = sheet.createRow(2);cell = row.createCell(0);cell.setCellValue(2);cell = row.createCell(1);// cell.setCellValue(2);cell = row.createCell(2);cell.setCellValue(3);// 数据3row = sheet.createRow(3);cell = row.createCell(0);cell.setCellValue(3);cell = row.createCell(1);cell.setCellValue(3);cell = row.createCell(2);// cell.setCellValue(4);// 数据4row = sheet.createRow(4);cell = row.createCell(0);cell.setCellValue(4);cell = row.createCell(1);cell.setCellValue(4);cell = row.createCell(2);cell.setCellValue(5);// 数据5row = sheet.createRow(5);cell = row.createCell(0);cell.setCellValue(5);cell = row.createCell(1);cell.setCellValue(5);cell = row.createCell(2);cell.setCellValue(5);// 数据6row = sheet.createRow(6);cell = row.createCell(0);cell.setCellValue(6);cell = row.createCell(1);cell.setCellValue(6);cell = row.createCell(2);cell.setCellValue(5);// 数据7row = sheet.createRow(7);cell = row.createCell(0);cell.setCellValue(7);cell = row.createCell(1);cell.setCellValue(7);cell = row.createCell(2);cell.setCellValue(5);// 创建一个画布XSSFDrawing drawing = sheet.createDrawingPatriarch();// 前四个默认0,[8,7]:从8列7行开始;[15,22]:到15列22行结束XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 8, 7, 15, 22);// 创建一个chart对象XSSFChart chart = drawing.createChart(anchor);// 设置画布边框样式CTChartSpace space = chart.getCTChartSpace();space.addNewRoundedCorners().setVal(false);// 去掉圆角CTLineProperties ln = space.addNewSpPr().addNewLn();CTSolidColorFillProperties solidFill = ln.addNewSolidFill();Color color = new Color(217, 217, 217);// 灰色边框solidFill.addNewSrgbClr().setVal(new byte[] { (byte) color.getRed(), (byte) color.getGreen(), (byte) color.getBlue() });// 标题chart.setTitleText("图表标题");// 标题覆盖chart.setTitleOverlay(false);// 图例位置XDDFChartLegend legend = chart.getOrAddLegend();legend.setPosition(LegendPosition.TOP);// 分类轴标(X轴),标题位置,XDDFCategoryAxis会乱码XDDFValueAxis bottomAxis = chart.createValueAxis(AxisPosition.BOTTOM);// bottomAxis.setMinimum(0);// 设置左X轴最大值// bottomAxis.setMaximum(8);// bottomAxis.setTitle("X轴标题");// 值(Y轴)轴,标题位置XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);// leftAxis.setTitle("Y轴标题");// 左Y轴和X轴交叉点在X轴0点位置leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);// leftAxis.setCrossBetween(AxisCrossBetween.BETWEEN);// 构建坐标轴leftAxis.crossAxis(bottomAxis);bottomAxis.crossAxis(leftAxis);// 设置左Y轴最大值// leftAxis.setMaximum(8);// leftAxis.setVisible(false);// 隐藏Y轴// CellRangeAddress(起始行号,终止行号, 起始列号,终止列号)// 分类轴标(X轴)数据,单元格范围位置[0, 1]到[0, 7]// XDDFDataSource<Double> category = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 7, 0, 0));XDDFNumericalDataSource<Integer> category = XDDFDataSourcesFactory.fromArray(new Integer[] { 1, 2, 3, 4, 5, 6, 7 });// 数据1,单元格范围位置[1, 1]到[1, 7]XDDFNumericalDataSource<Double> data1 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 7, 1, 1));// XDDFNumericalDataSource data1 = XDDFDataSourcesFactory.fromArray(new Integer[] {1,2,3,4,5,6,7});// 数据2,单元格范围位置[2, 1]到[2, 7]XDDFNumericalDataSource<Double> data2 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 7, 2, 2));// XDDFNumericalDataSource<Integer> data2 = XDDFDataSourcesFactory.fromArray(new Integer[] {2,3,4,5,5,5,5});// Scatter:散点图XDDFScatterChartData scatter = (XDDFScatterChartData) chart.createData(ChartTypes.SCATTER, bottomAxis, leftAxis);// 设置为可变颜色// scatter.setVaryColors(true);scatter.setStyle(ScatterStyle.LINE_MARKER);// 图表加载数据,数据1XDDFScatterChartData.Series series1 = (XDDFScatterChartData.Series) scatter.addSeries(category, data1);// 散点图例标题series1.setTitle("图例标题b", null);// XDDFSolidFillProperties fill = new XDDFSolidFillProperties(XDDFColor.from(PresetColor.YELLOW));XDDFNoFillProperties fill = new XDDFNoFillProperties();// 散点图series1.setFillProperties(fill);series1.setSmooth(false);series1.setMarkerStyle(MarkerStyle.CIRCLE);series1.setMarkerSize((short) 5);// 绘制series1.plot();// 设置颜色color = new Color(255, 0, 0);// 红色byte[] colorByte = new byte[] { (byte) color.getRed(), (byte) color.getGreen(), (byte) color.getBlue() };CTScatterChart scatterChart = chart.getCTChart().getPlotArea().getScatterChartArray(0);CTScatterSer ser = scatterChart.getSerArray(0);CTShapeProperties spPr = ser.getMarker().addNewSpPr();spPr.addNewSolidFill().addNewSrgbClr().setVal(colorByte);// 无轮廓spPr.addNewLn().addNewNoFill();// 隐藏值为空或者0的点for (int i = 0; i < data1.getPointCount(); i++) {Double pointAt = data1.getPointAt(i);if (pointAt == null || pointAt == 0) {CTDPt dDPt = ser.addNewDPt();dDPt.addNewIdx().setVal(i);CTShapeProperties addNewSpPr = dDPt.addNewMarker().addNewSpPr();addNewSpPr.addNewNoFill();addNewSpPr.addNewLn().addNewNoFill();}}// 图表加载数据,数据2XDDFScatterChartData.Series series2 = (XDDFScatterChartData.Series) scatter.addSeries(category, data2);// 散点图例标题series2.setTitle("图例标题c", null);// XDDFSolidFillProperties fill2 = new XDDFSolidFillProperties(XDDFColor.from(PresetColor.RED));XDDFNoFillProperties fill2 = new XDDFNoFillProperties();// 散点图series2.setFillProperties(fill2);series2.setSmooth(false);series2.setMarkerStyle(MarkerStyle.CIRCLE);series2.setMarkerSize((short) 5);// 绘制series2.plot();// 设置颜色color = new Color(0, 0, 139);// 深蓝色colorByte = new byte[] { (byte) color.getRed(), (byte) color.getGreen(), (byte) color.getBlue() };scatterChart = chart.getCTChart().getPlotArea().getScatterChartArray(0);ser = scatterChart.getSerArray(1);spPr = ser.getMarker().addNewSpPr();spPr.addNewSolidFill().addNewSrgbClr().setVal(colorByte);// 无轮廓spPr.addNewLn().addNewNoFill();// 隐藏值为空或者0的点for (int i = 0; i < data2.getPointCount(); i++) {Double pointAt = data2.getPointAt(i);if (pointAt == null || pointAt <= 0) {CTDPt dDPt = ser.addNewDPt();dDPt.addNewIdx().setVal(i);CTShapeProperties addNewSpPr = dDPt.addNewMarker().addNewSpPr();addNewSpPr.addNewNoFill();addNewSpPr.addNewLn().addNewNoFill();}}// 绘制// chart.plot(scatter);// 去掉连接线List<CTScatterSer> serList = scatterChart.getSerList();for (CTScatterSer sser : serList) {sser.getSpPr().addNewLn().addNewNoFill();// 删掉x轴系列值sser.unsetXVal();}Enum bg2 = org.openxmlformats.schemas.drawingml.x2006.main.STSchemeColorVal.Enum.forString("bg2");// 设置网格线水平方向List<CTValAx> valAxList = chart.getCTChart().getPlotArea().getValAxList();for (CTValAx valAx : valAxList) {valAx.addNewMajorGridlines().addNewSpPr().addNewLn().addNewSolidFill().addNewSchemeClr().setVal(bg2);}// 设置网格线垂直方向List<CTCatAx> catAxList = chart.getCTChart().getPlotArea().getCatAxList();for (CTCatAx catAx : catAxList) {catAx.addNewMajorGridlines().addNewSpPr().addNewLn().addNewSolidFill().addNewSchemeClr().setVal(bg2);}// 打印图表的xmlSystem.out.println(chart.getCTChart());System.out.println();System.out.println("***********************************************************");System.out.println();System.out.println("上面打印的xml节点就是 chart.getCTChart() 方法得到的api一一对应");System.out.println();System.out.println("***********************************************************");// 将输出写入excel文件String filename = "散点图.xlsx";fileOut = new FileOutputStream(filename);wb.write(fileOut);} catch (Exception e) {e.printStackTrace();} finally {wb.close();if (fileOut != null) {fileOut.close();}}}}

7、POI api

PS:

怎么设置各种复杂的样式,查各种api?
1、新建一个excel,将需要的样式,在一个Excel中实现想要的功能,然后重命名为zip解压,打开:xl\charts\chart1.xml。
        不想解压直接打印新建excel的xml:System.out.println(chart.getCTChart())
2、CTChart ctChart = chart.getCTChart();//该类中的属性就是上面xml解压文件的节点属性一一对应。

打印poi

package com.demo.test;import java.io.FileInputStream;
import java.util.List;import org.apache.poi.xssf.usermodel.XSSFChart;
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.CTChart;public class Test {public static void main(String[] args) throws Exception {String path = "D:/已经实现了功能的excel/test.xlsx";FileInputStream fis = new FileInputStream(path);XSSFWorkbook wb = new XSSFWorkbook(fis);XSSFSheet sheet = wb.getSheetAt(0);XSSFDrawing drawing = sheet.getDrawingPatriarch();List<XSSFChart> charts = drawing.getCharts();for (int i = 0; i < charts.size(); i++) {XSSFChart chart = charts.get(i);CTChart ctChart = chart.getCTChart();System.out.println(ctChart);}fis.close();wb.close();}}

POI EXCEL 图表、折线图、条形图,柱状图、饼图、散点图相关推荐

  1. Poi 如何使用Java和POI技术生成折线图,柱状图,饼状图导出到word文档

    这篇文章主要介绍POI生成图表并导出word文档的基本操作.主要介绍三种图表:折线图.柱状图.饼状图. 一.效果展示 使用Java和POI技术生成的折线图,柱状图,饼状图的效果如下图所示: 二.环境准 ...

  2. Vue + Echarts(v5.版本)的简单组件封装(折线图、柱状图、散点图、饼/环形图、仪表盘、雷达图)

    项目中展示图表的地方很多,不想每次都写一长串的 options配置,就整合了一下常用的配置项,简单封装了一下,也能保证整个系统的图表风格统一,需要调整样式的时候也不用改很多地方 2022-11-07: ...

  3. 可视化库Matplotlib 折线图 条形图 柱状图 点图 盒图

    1.折线图 #读入数据 import pandas as pd import matplotlib.pyplot as plt #导入画图 import numpy as np unrate = pd ...

  4. excel分析图表制作,如何轻松创建折线图、柱状图、饼图

    ​在Excel中通过数据间的关系选择合适的图表,轻松创建折线图.柱状图.饼图使其表达的主题和内容更加简单清晰. 下面我们通过Smartbi大数据分析工具介绍excel分析图表制作方法,如何制作常用的图 ...

  5. Java使用Poi实现导出Word段落以及表格,XWPFParagraph和XWPFRun详解,生成目录,生成折线图、柱状图、饼状图

    导出段落 public void exportSummarizeWord(HttpServletResponse response, Integer id) {Summarize summarize ...

  6. Vue中引入echarts的步骤,折线图、柱状图、饼图的常用配置项

    vue中引入echarts 一.安装echarts 二.引入echarts 1.全局引入 2.局部引入 三.vue中使用echarts 1.准备好函数 2.准备一个容器来放echarts 3.初始化容 ...

  7. 使用Telerik控件库制作WPF项目中的折线图、柱状图、饼图和甜甜圈图

    本博客是基于 .Net Framework 4.6.2 的WPF(MVVM)项目,Telerik版本为 2016.2.613.40.其他版本是否可用不详. 本文章所使用数据均为测试数据,无任何意义. ...

  8. python画柱状图和折线图-Python读取Excel表格,并同时画折线图和柱状图的方法

    今日给大家分享一个Python读取Excel表格,同时采用表格中的数值画图柱状图和折线图,这里只需要几行代码便可以实. 首先我们需要安装一个Excel操作的库xlrd,这个很简单,在安装Python后 ...

  9. python雷达和柱形图_Python Pygal常见数据图(折线图、柱状图、饼图、点图、仪表图和雷达图)详解...

    Pygal 同样支持各种不同的数据图,比如饼图.折线图等.Pygal 的设计很好,不管是创建哪种数据图,Pygal 的创建方式基本是一样的,都是先创建对应的数据图对象,然后添加数据,最后对数据图进行配 ...

最新文章

  1. 《Unity 游戏案例开发大全》一6.5 游戏主场景
  2. Galaxy 生信平台(四):邮件与管理员配置
  3. 如何查看python安装了什么库-怎么看python安装了哪些库
  4. Memcached安装和基本使用
  5. 使Docker搭建Java Web运行环境
  6. CSDN在文章头部添加目录
  7. Linux信号量之内核信号量
  8. 在业务层实现校验请求参数
  9. [转]tensorflow中的gather
  10. Shiro 单点登录
  11. 【Java愚公】gitlab关闭注册功能
  12. 笔记本风扇噪音大的解决方法
  13. js和css动态画出一只安卓机器人,附代码
  14. OpengL消除锯齿
  15. 【嵌入式】上学期末整理的一些知识点
  16. 什么是java枚举_java枚举的概念是什么?有哪些方法?
  17. python利用turtle库绘制正方形绕一个顶点旋转
  18. IDEA安装教程及插件推荐
  19. 第一章 企业管理概论
  20. osgearth仿真平台之特效(4)

热门文章

  1. 一对一、一对多、多对多模型关系的建立和增删改查要注意的问题
  2. 算法:整数转罗马数字(integer-to-roman)。
  3. 在2019年的Vue.js和ReactJS之间进行选择:什么最适合您的项目?
  4. 跨部门沟通有哪些坑?
  5. BM算法的改进的算法SUNDAY--Boyer-Moore-Horspool-Sunday Aglorithm
  6. 联想昭阳E52-80 ubuntu18 升级后无线网不可用
  7. PDF拆分成多个页面怎么办?这三个方法让你实现将文件拆分成多页
  8. 双显卡双显示器的情况下,一个显示器清晰一个显示器模糊的情况解决方法
  9. vuejs 原生JS 拖拽事件案例
  10. OSC 十月新增开源项目:号称最快的 Node.js 应用框架来了