POI Word 图表、柱状图、条形图、折线图、饼图

poi Excel 图表:https://blog.csdn.net/u014644574/article/details/105695787

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 Word生成图表-柱状图

package test;

import java.io.FileOutputStream;

import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.util.Units;
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.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.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.xddf.usermodel.chart.XDDFValueAxis;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xwpf.usermodel.XWPFChart;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

/**
 * poi Word生成图表-柱状图
 */
public class CreateWordXDDFChart {

	// Methode to set title in the data sheet without creating a Table but using the sheet data only.
	// Creating a Table is not really necessary.
	static CellReference setTitleInDataSheet(XWPFChart chart, String title, int column) throws Exception {
		XSSFWorkbook workbook = chart.getWorkbook();
		XSSFSheet sheet = workbook.getSheetAt(0);
		XSSFRow row = sheet.getRow(0);
		if (row == null)
			row = sheet.createRow(0);
		XSSFCell cell = row.getCell(column);
		if (cell == null)
			cell = row.createCell(column);
		cell.setCellValue(title);
		return new CellReference(sheet.getSheetName(), 0, column, true, true);
	}

	public static void main(String[] args) throws Exception {
		try (XWPFDocument document = new XWPFDocument()) {

			// create the data
			String[] categories = new String[] { "Lang 1", "Lang 2", "Lang 3" };
			Double[] valuesA = new Double[] { 10d, 20d, 30d };
			Double[] valuesB = new Double[] { 15d, 25d, 35d };

			// create the chart
			XWPFChart chart = document.createChart(15 * Units.EMU_PER_CENTIMETER, 10 * Units.EMU_PER_CENTIMETER);

			// create data sources
			int numOfPoints = categories.length;
			String categoryDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 0, 0));
			String valuesDataRangeA = chart.formatRange(new CellRangeAddress(1, numOfPoints, 1, 1));
			String valuesDataRangeB = chart.formatRange(new CellRangeAddress(1, numOfPoints, 2, 2));
			XDDFDataSource<String> categoriesData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange, 0);
			XDDFNumericalDataSource<Double> valuesDataA = XDDFDataSourcesFactory.fromArray(valuesA, valuesDataRangeA, 1);
			XDDFNumericalDataSource<Double> valuesDataB = XDDFDataSourcesFactory.fromArray(valuesB, valuesDataRangeB, 2);

			// create axis
			XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
			XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
			leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
			// Set AxisCrossBetween, so the left axis crosses the category axis between the categories.
			// Else first and last category is exactly on cross points and the bars are only half visible.
			leftAxis.setCrossBetween(AxisCrossBetween.BETWEEN);

			// create chart data
			XDDFChartData data = chart.createData(ChartTypes.BAR, bottomAxis, leftAxis);
			((XDDFBarChartData) data).setBarDirection(BarDirection.COL);

			// create series
			// if only one series do not vary colors for each bar
			((XDDFBarChartData) data).setVaryColors(false);
			XDDFChartData.Series series = data.addSeries(categoriesData, valuesDataA);
			// XDDFChart.setSheetTitle is buggy. It creates a Table but only half way and incomplete.
			// Excel cannot opening the workbook after creatingg that incomplete Table.
			// So updating the chart data in Word is not possible.
			// series.setTitle("a", chart.setSheetTitle("a", 1));
			series.setTitle("a", setTitleInDataSheet(chart, "a", 1));

			/*
			   // if more than one series do vary colors of the series
			   ((XDDFBarChartData)data).setVaryColors(true);
			   series = data.addSeries(categoriesData, valuesDataB);
			   //series.setTitle("b", chart.setSheetTitle("b", 2));
			   series.setTitle("b", setTitleInDataSheet(chart, "b", 2));
			*/

			// plot chart data
			chart.plot(data);

			// create legend
			XDDFChartLegend legend = chart.getOrAddLegend();
			legend.setPosition(LegendPosition.LEFT);
			legend.setOverlay(false);

			// 打印图表的xml
			// System.out.println(chart.getCTChart());

			// Write the output to a file
			try (FileOutputStream fileOut = new FileOutputStream("CreateWordXDDFChart.docx")) {
				document.write(fileOut);
			}
		}
	}
}

 

3、poi Word生成图表-折线图

package test;

import java.io.FileOutputStream;

import org.apache.poi.util.Units;
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.XDDFCategoryDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend;
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.xwpf.usermodel.XWPFChart;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

/**
 * poi Word生成图表-折线图
 */
public class CreateWordXDDFChart2 {

	public static void main(String[] args) throws Exception {
		try (XWPFDocument document = new XWPFDocument()) {

			// create the chart
			XWPFChart chart = document.createChart(15 * Units.EMU_PER_CENTIMETER, 10 * Units.EMU_PER_CENTIMETER);

			// 标题
			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);

			// 绘制
			chart.plot(data);

			// 打印图表的xml
			// System.out.println(chart.getCTChart());

			// Write the output to a file
			try (FileOutputStream fileOut = new FileOutputStream("CreateWordXDDFChart.docx")) {
				document.write(fileOut);
			}
		}
	}
}

 

4、poi Word生成图表-饼图

package test;

import java.io.FileOutputStream;

import org.apache.poi.util.Units;
import org.apache.poi.xddf.usermodel.chart.ChartTypes;
import org.apache.poi.xddf.usermodel.chart.LegendPosition;
import org.apache.poi.xddf.usermodel.chart.XDDFCategoryDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
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.xwpf.usermodel.XWPFChart;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

/**
 * poi Word生成图表-饼图
 */
public class CreateWordXDDFChart2 {

	public static void main(String[] args) throws Exception {
		try (XWPFDocument document = new XWPFDocument()) {

			// create the chart
			XWPFChart chart = document.createChart(15 * Units.EMU_PER_CENTIMETER, 10 * Units.EMU_PER_CENTIMETER);

			// 标题
			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));
			XDDFCategoryDataSource countries = XDDFDataSourcesFactory.fromArray(new String[] { "俄罗斯", "加拿大", "美国", "中国", "巴西", "澳大利亚", "印度" });
			// 数据1,
			// XDDFNumericalDataSource<Double> values = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, 6));
			XDDFNumericalDataSource<Integer> values = XDDFDataSourcesFactory.fromArray(new Integer[] { 17098242, 9984670, 9826675, 9596961, 8514877, 7741220, 3287263 });
			// 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);

			// 打印图表的xml
			// System.out.println(chart.getCTChart());

			// Write the output to a file
			try (FileOutputStream fileOut = new FileOutputStream("CreateWordXDDFChart.docx")) {
				document.write(fileOut);
			}
		}
	}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 6
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 44
    评论
对于poi折线图的生成,可以使用Apache POI提供的XSSFChart和XDDFChart类进行操作。 首先,我们需要创建一个工作簿对象,然后在工作簿中创建一个工作表对象。接着,我们可以创建一个图表对象,并将其添加到工作表中。然后,我们可以使用XSSFChart和XDDFChart类的方法来定义图表的数据和样式。 具体实现步骤如下: 1. 创建一个工作簿对象 ``` XSSFWorkbook workbook = new XSSFWorkbook(); ``` 2. 创建一个工作表对象 ``` XSSFSheet sheet = workbook.createSheet("Chart"); ``` 3. 创建一个图表对象 ``` XSSFChart chart = sheet.createDrawingPatriarch().createChart(anchor); ``` 其中,anchor是图表的位置和大小,可以使用XSSFClientAnchor类来定义。 4. 定义图表的数据和样式 对于折线图和树,数据一般是通过一个数据源来提供的。我们可以使用XDDFDataSource类来创建数据源,并将其添加到图表中。样式方面,可以使用XDDFChartLegend和XDDFChartData类来定义图表的标题、例、颜色等属性。 下面是一个生成的示例代码: ``` // 创建一个工作簿对象 XSSFWorkbook workbook = new XSSFWorkbook(); // 创建一个工作表对象 XSSFSheet sheet = workbook.createSheet("Chart"); // 创建一个图表对象 XSSFChart chart = sheet.createDrawingPatriarch().createChart(anchor); // 创建一个数据源 XDDFDataSource<String> categoryDataSource = XDDFDataSourcesFactory.fromStringCellRange(sheet, new CellRangeAddress(1, 4, 0, 0)); XDDFNumericalDataSource<Double> dataDataSource = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 4, 1, 1)); // 创建一个数据对象 XDDFPieChartData data = (XDDFPieChartData) chart.createData(ChartTypes.PIE, null, null); // 添加数据源到数据对象中 data.setCategoryData(categoryDataSource); data.setValues(dataDataSource); // 创建一个样式对象 XDDFChartLegend legend = chart.getOrAddLegend(); legend.setPosition(LegendPosition.TOP_RIGHT); XDDFPieChartSeries series = (XDDFPieChartSeries) data.getSeries().get(0); series.setTitle("Pie Chart"); XDDFShapeProperties shapeProperties = series.getShapeProperties(); shapeProperties.setFillProperties(new XDDFSolidFillProperties(XDDFColor.from(PresetColor.BLUE))); ``` 这样,就可以在Excel文档中生成一个了。其他类型的图表生成也是类似的,只需要根据需要调用不同的类和方法即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 44
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值