简单饼图:
/**
* 创建饼图(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);// 显示图注但不与图表重叠
}
效果:
简单折线图:
未完待续
设置标题颜色、字体大小等:
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();