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.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 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;

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);

			// 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;

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);

			// 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;

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);

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章