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

mac2024-07-06  53

简单饼图:

/** * 创建饼图(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();

 

最新回复(0)