poi画饼图、折线图等图表和设置颜色字体等

简单饼图:

    /**
	 * 创建饼图(xlsx格式excel)
	 * @param sheetAt 工作表
	 */
	private void createPie(XSSFSheet sheetAt) {
		// 创建一个画布
		Drawing<?> drawing = sheetAt.createDrawingPatriarch();
		//设置画布在excel工作表的位置
		ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 4, 2, 8, 15);
		// 创建一个chart对象
		Chart chart = drawing.createChart(anchor);
		CTChart ctChart = ((XSSFChart) chart).getCTChart();
		CTPlotArea ctPlotArea = ctChart.getPlotArea();
		// 创建圆环图
		CTPieChart ctPieChart = ctPlotArea.addNewPieChart();
		CTBoolean ctBoolean = ctPieChart.addNewVaryColors();
		// 允许自定义颜色
		ctBoolean.setVal(true);
		// 设置图表标题
		CTTitle title = ctChart.addNewTitle();
		//选择图表标题所在位置,此时titleRange不是单元格内容,而是 --》 '工作表名'!$A$2
		String titleRange = new CellRangeAddress(0, 0, 0, 0).formatAsString(sheetAt.getSheetName(), true);
		title.addNewTx().addNewStrRef().setF(titleRange);
		// 创建序列,并且设置选中区域
		CTPieSer ctPieSer = ctPieChart.addNewSer();
		// 设置横坐标区
		CTAxDataSource cttAxDataSource = ctPieSer.addNewCat();
		CTStrRef ctStrRef = cttAxDataSource.addNewStrRef();
		String axisDataRange = new CellRangeAddress(1, 4, 0, 0).formatAsString(sheetAt.getSheetName(), true);
		ctStrRef.setF(axisDataRange);
		// 数据区域
		CTNumDataSource ctNumDataSource = ctPieSer.addNewVal();
		CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
		// 选第1-6行,第1-3列作为数据区域 //1 2 3
		String numDataRange = new CellRangeAddress(1, 4, 1, 1).formatAsString(sheetAt.getSheetName(),
				true);
		ctNumRef.setF(numDataRange);
		// 设置标签格式
		CTDLbls newDLbls = ctPieSer.addNewDLbls();
//		newDLbls.setShowLegendKey(ctBoolean);
		newDLbls.setShowVal(ctBoolean);
//		newDLbls.setShowCatName(ctBoolean);//显示横坐标(图注)
		newDLbls.setShowPercent(ctBoolean);// 显示百分比
		newDLbls.setShowBubbleSize(ctBoolean);// 显示纵坐标(数量)
		newDLbls.setShowLeaderLines(ctBoolean);// 显示线
		// legend图注
		CTLegend ctLegend = ctChart.addNewLegend();
		ctLegend.addNewLegendPos().setVal(STLegendPos.B);//将图注放在下面(Bottom)
		ctLegend.addNewOverlay().setVal(false);// 显示图注但不与图表重叠
	}

 效果:

《poi画饼图、折线图等图表和设置颜色字体等》

简单折线图:

未完待续

设置标题颜色、字体大小等:

CTTitle ctTitle = ctChart.addNewTitle();
ctTitle.addNewOverlay().setVal(false);// true时与饼图重叠
ctTitle.addNewTx().addNewRich().addNewBodyPr();
CTTextBody rich = ctTitle.getTx().getRich();
rich.addNewLstStyle();
CTRegularTextRun newR = rich.addNewP().addNewR();
newR.setT(sheetName);
newR.addNewRPr().setB(false);
XmlBoolean xmlBoolean = XmlBoolean.Factory.newInstance();
xmlBoolean.setStringValue("0");
newR.getRPr().xsetB(xmlBoolean);//是否加粗
//newR.getRPr().setLang("zh-CN");
//newR.getRPr().setAltLang("en-US");
newR.getRPr().setSz(1400);//字体大小

 设置饼图的每个块的颜色:

// 创建序列,并且设置选中区域
CTPieSer ctPieSer = ctPieChart.addNewSer();
// 设置区域颜色
for(int i=0;i<pies.size();i++) {
	CTDPt dPt = ctPieSer.addNewDPt();
	STHexBinary3 hex=STHexBinary3.Factory.newInstance();
	if(i==0) {
		hex.setStringValue("5B9BD5");
	}else {
		hex.setStringValue(pies.get(i).getColor());//color为颜色的十六进制去除#
	}
	dPt.addNewIdx().setVal(i);
	dPt.addNewSpPr().addNewSolidFill().addNewSrgbClr().xsetVal(hex);
}

设置折线的颜色:

CTLineSer ctLineSer = ctLineChart.addNewSer();
STHexBinary3 hex = STHexBinary3.Factory.newInstance();
if (i == 0) {//我这里是画了三条折线所以设置了三种颜色
	hex.setStringValue("92D050");
} else if (i == 1) {
	hex.setStringValue("FFFF00");
} else if (i == 2) {
	hex.setStringValue("FF0000");
}
ctLineSer.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().xsetVal(hex);

设置纵坐标

// val axis
CTValAx ctValAx = ctPlotArea.addNewValAx();
ctValAx.addNewAxId().setVal(123457); // id of the val axis
ctScaling = ctValAx.addNewScaling();
ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);// 设置坐标轴从小到大从下往上排列
ctScaling.addNewMin().setVal(minDiameter);// 设置纵坐标最小值
ctScaling.addNewMax().setVal(maxDiameter);// 设置纵坐标最大值
ctValAx.addNewAxPos().setVal(STAxPos.L);
ctValAx.addNewCrossAx().setVal(123456); // id of the cat axis
ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
ctValAx.addNewMajorGridlines().addNewSpPr();// 设置网格
//ctValAx.addNewMajorUnit().setVal(0.01);//设置主要刻度线之间距离为0.01
ctValAx.addNewMajorTickMark().setVal(STTickMark.NONE);// 设置主要刻度线类型无;(Major:主要刻度线 Minor:次要刻度线)
//设置纵坐标标题
//ctValAx.addNewTitle().addNewTx().addNewStrRef()
//.setF(new CellRangeAddress(1, 1, 6, 6).formatAsString(sheetAt.getSheetName(), true));
		ctValAx.addNewSpPr().addNewLn().addNewNoFill();

    原文作者:abcdefg*
    原文地址: https://blog.csdn.net/woshihm/article/details/102843191
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞