java使用poi操作world生成饼图,柱状图,折线图,组合图:二

*/

private String sheetName;

/**

  • 图表

*/

private XWPFChart xwpfChart;

/**

  • 具体图

*/

private List xmlObjectList = new ArrayList<>();

/**

  • 绘制区域图

*/

private CTChart ctChart;

/**

  • 标题

*/

private List titleList;

/**

  • 数据源对应的key

*/

private List numberList;

/**

  • 填充的数据源

*/

private List<Map<String, String>> sourceModelList;

/**

  • 目标数据

*/

private List chartsEnumList;

/**

  • 赋值 替换目标

  • @param numberList

*/

public void setNumberList(List numberList){

this.numberList = numberList;

}

/**

  • 赋值 数据源

  • @param sourceModelList

*/

public void setSourceModelList(List<Map<String, String>> sourceModelList){

this.sourceModelList = sourceModelList;

}

/**

  • 赋值 标题

  • @param titleList

*/

public void setTitleList(List titleList){

this.titleList = titleList;

}

/**

  • 单个赋值 图表

  • @param charts 所有可绘制区域

  • @param chartSeat 要操作的图表中可绘制区域位置

  • @param xmlObjSeat 图表在可绘制区域中的位置

  • @param chartsEnum 目标的表格类型

*/

public void setSingleChart(List charts,int chartSeat,int xmlObjSeat,ChartsEnum chartsEnum){

List chartsEnumList = Arrays.asList(chartsEnum);

/**

  • 封装基础数据

*/

this.packageBasic(charts, chartSeat,chartsEnumList);

/**

  • 获得目标图表

*/

XmlObject targetChart = chartsEnum.getTargetChart(chartSeat, this.ctChart, xmlObjSeat);

this.xmlObjectList = Arrays.asList(targetChart);

//当前是单元素

this.isSingle = true;

}

/**

  • 组合赋值 图表

  • @param charts 所有可绘制区域

  • @param chartSeat 要操作的图表中可绘制区域位置

  • @param xmlObjSeat 图表在可绘制区域中的位置

  • @param chartsEnumList 目标的表格类型

*/

public void setComBiChart(List charts,int chartSeat,int xmlObjSeat,List chartsEnumList){

/**

  • 封装基础数据

*/

this.packageBasic(charts, chartSeat,chartsEnumList);

/**

  • 获得目标图表

*/

this.xmlObjectList.clear();

chartsEnumList.stream().forEach(x->{

XmlObject targetChart = x.getTargetChart(chartSeat,this.ctChart, xmlObjSeat);

this.xmlObjectList.add(targetChart);

});

//当前不是单元素

this.isSingle = false;

}

/**

  • 封装部分基础数据

  • @param charts

  • @param chartSeat

  • @param chartsEnumList

*/

private void packageBasic(List charts, int chartSeat,List chartsEnumList) {

if(CollectionUtils.isEmpty(charts)){

throw new RuntimeException(“模板中图表元素为null; !!!ctChart:null”);

}

if(CollectionUtils.isEmpty(chartsEnumList)){

throw new RuntimeException(“图表目标为null;!!!chartsEnum:null”);

}

/**

  • 目标

*/

this.chartsEnumList = chartsEnumList;

/**

  • 第N个位置图表

*/

this.xwpfChart = charts.get(chartSeat);

/**

  • 第N个位置可绘制区域的图表

*/

this.ctChart = this.xwpfChart.getCTChart();

}

/**

  • 执行模板数据源填充

  • @param sheetName 展示数据excel页名字

*/

public void executeFillModel(String sheetName) throws IOException, InvalidFormatException {

this.sheetName = sheetName;

//异常校验

String s = this.isSingle ? this.abnormalCheckSingle() : this.abnormalCheckComBi();

//执行填充数据

ChartsEnum.refreshExcel(this);

for (int i = 0; i < chartsEnumList.size(); i++) {

ChartsEnum chartsEnum = chartsEnumList.get(i);

chartsEnum.fillModel(this,this.getXmlObjectList().get(i),i);

}

}

/**

  • 异常校验

*/

private String abnormalCheckSingle() {

if(CollectionUtils.isEmpty(this.numberList)){

throw new RuntimeException(“数据源比对为null; !!!numberList:null”);

}

if(CollectionUtils.isEmpty(this.titleList)){

throw new RuntimeException(“标题为null; !!!titleList:null”);

}

if(CollectionUtils.isEmpty(this.sourceModelList)){

throw new RuntimeException(“数据源为null; !!!sourceModelList:null”);

}

if(Objects.isNull(this.xwpfChart)){

throw new RuntimeException(“模板中图表元素为null; !!!xwpfChart:null”);

}

if(CollectionUtils.isEmpty(this.xmlObjectList)){

throw new RuntimeException(“模板中具体图表为null;!!!xmlObjectList:null”);

}

if(CollectionUtils.isEmpty(this.chartsEnumList)){

throw new RuntimeException(“图表目标为null;!!!chartsEnum:null”);

}

if(Objects.isNull(this.ctChart)){

throw new RuntimeException(“图表绘制区域为null;!!!chartsEnum:null”);

}

if(StringUtils.isEmpty(this.sheetName)){

throw new RuntimeException(“内置excel页名为null;!!!sheetName:null”);

}

return null;

}

/**

  • 异常校验

*/

private String abnormalCheckComBi() {

this.abnormalCheckSingle();

if (this.xmlObjectList.size() < 2) {

throw new RuntimeException(“组合图中【图表】元素不足两个; !!!xmlObjectList.size !> 2”);

}

if (this.sourceModelList.stream().filter(x->{return x.keySet().size() >= 3;}).collect(Collectors.toList()).size() < 0) {

throw new RuntimeException(“组合图中【数据源】元素不足两个; !!!sourceModelList.map.keySet.size !>= 3”);

}

if (this.numberList.size() < 3) {

throw new RuntimeException(“组合图中【数据源对应的key】元素不足两个; !!!numberList.size !>= 3”);

}

return null;

}

}

工具类:枚举解析图表类


package com.wyz.world.utils;

import lombok.Getter;

import lombok.extern.slf4j.Slf4j;

import org.apache.poi.ooxml.POIXMLDocumentPart;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;

import org.apache.poi.ss.usermodel.Sheet;

import org.apache.poi.ss.usermodel.Workbook;

import org.apache.poi.ss.util.CellRangeAddress;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import org.apache.poi.xwpf.usermodel.XWPFChart;

import org.apache.xmlbeans.XmlObject;

import org.apache.xmlbeans.impl.values.XmlComplexContentImpl;

import org.openxmlformats.schemas.drawingml.x2006.chart.*;

import org.openxmlformats.schemas.drawingml.x2006.chart.impl.CTBarChartImpl;

import org.openxmlformats.schemas.drawingml.x2006.chart.impl.CTLineChartImpl;

import org.openxmlformats.schemas.drawingml.x2006.chart.impl.CTPieChartImpl;

import org.openxmlformats.schemas.drawingml.x2006.chart.impl.CTScatterChartImpl;

import java.io.IOException;

import java.io.OutputStream;

import java.math.BigDecimal;

import java.util.List;

import java.util.Map;

/**

  • @author BM_hyjw

  • 解析world 中图表

*/

@Slf4j

@Getter

public enum ChartsEnum {

/**

  • 饼图

*/

PIE(CTPieChart.class, CTPieChartImpl.class){

/**

  • 填充模板数据

  • @param chartModel 图表和数据源

  • @param xmlObject 当前元素

  • @param bias 偏向值

*/

@Override

public void fillModel(ChartModel chartModel,XmlObject xmlObject,int bias) {

if (!this.chartImplClazz.getName().equals(xmlObject.getClass().getName())) {

//当前循环中图表操作不属于当前枚举

ChartsEnum.getEnumByChartImplClazz(((XmlComplexContentImpl)xmlObject).getClass())

.fillModel(chartModel, xmlObject, bias);

return;

}

CTPieChart pieChart = (CTPieChart)xmlObject;

List serList = pieChart.getSerList();

//更新数据区域

for (int i = 0; i < serList.size(); i++) {

//数据填充

//

CTPieSer ser = pieChart.getSerArray(i);

CTAxDataSource cat = ser.getCat();

CTNumDataSource val = ser.getVal();

this.dataAnalysisFill(chartModel,i,bias,cat,val);

}

}

/**

  • 得到目标位置的图表

  • @param ctChart 可绘制区域图表

  • @param xmlObjSeat 目标图标位置位置

  • @return

*/

@Override

public XmlObject getTargetChart(int chartSeat, CTChart ctChart, int xmlObjSeat) {

try {

CTPieChart pieChart = ctChart.getPlotArea().getPieChartArray(xmlObjSeat);

return pieChart;

}catch (Exception e){

throw new RuntimeException(“当前位置【” + chartSeat + “】不存在【饼图】!!!”);

}

}

},

/**

  • 柱图

*/

COLUMN(CTBarChart.class, CTBarChartImpl.class) {

/**

  • 填充模板数据

  • @param chartModel 图表和数据源

  • @param bias 偏向值

*/

@Override

public void fillModel(ChartModel chartModel,XmlObject xmlObject,int bias) {

if (!this.chartImplClazz.getName().equals(xmlObject.getClass().getName())) {

//当前循环中图表操作不属于当前枚举

ChartsEnum.getEnumByChartImplClazz(((XmlComplexContentImpl)xmlObject).getClass())

.fillModel(chartModel, xmlObject, bias);

return;

}

CTBarChart chart = (CTBarChart)xmlObject;

List serList = chart.getSerList();

//更新数据区域

for (int i = 0; i < serList.size(); i++) {

//数据填充

//

CTBarSer ser = chart.getSerArray(i);

CTAxDataSource cat = ser.getCat();

CTNumDataSource val = ser.getVal();

this.dataAnalysisFill(chartModel,i,bias,cat,val);

}

}

/**

  • 得到目标位置的图表

  • @param ctChart 可绘制区域图表

  • @param xmlObjSeat 目标图标位置位置

  • @return

*/

@Override

public XmlObject getTargetChart(int chartSeat, CTChart ctChart, int xmlObjSeat) {

try {

CTBarChart barChart = ctChart.getPlotArea().getBarChartArray(xmlObjSeat);

return barChart;

}catch (Exception e){

throw new RuntimeException(“当前位置【” + chartSeat + “】不存在【柱状图】!!!”);

}

}

},

/**

  • 折线图

*/

LINE_CHART(CTLineChart.class, CTLineChartImpl.class){

/**

  • 填充模板数据

  • @param chartModel 图表和数据源

  • @param xmlObject 当前元素

  • @param bias 偏向值

*/

@Override

public void fillModel(ChartModel chartModel,XmlObject xmlObject,int bias) {

if (!this.chartImplClazz.getName().equals(xmlObject.getClass().getName())) {

//当前循环中图表操作不属于当前枚举

ChartsEnum.getEnumByChartImplClazz(((XmlComplexContentImpl)xmlObject).getClass())

.fillModel(chartModel, xmlObject, bias);

return;

}

CTLineChart chart = (CTLineChart)xmlObject;

List serList = chart.getSerList();

//更新数据区域

for (int i = 0; i < serList.size(); i++) {

//数据填充

//

CTLineSer ser = chart.getSerArray(i);

CTAxDataSource cat = ser.getCat();

CTNumDataSource val = ser.getVal();

this.dataAnalysisFill(chartModel,i,bias,cat,val);

}

}

/**

  • 得到目标位置的图表

  • @param ctChart 可绘制区域图表

  • @param xmlObjSeat 目标图标位置位置

  • @return

*/

@Override

public XmlObject getTargetChart(int chartSeat, CTChart ctChart, int xmlObjSeat) {

try {

CTLineChart lineChart = ctChart.getPlotArea().getLineChartArray(xmlObjSeat);

return lineChart;

}catch (Exception e){

throw new RuntimeException(“当前位置【” + chartSeat + “】不存在【折线图】!!!”);

}

}

},

/**

  • 散点图

*/

SCATTER(CTScatterChart.class, CTScatterChartImpl.class){

/**

  • 填充模板数据

  • @param chartModel 图表和数据源

  • @param xmlObject 当前元素

  • @param bias 偏向值

*/

@Override

public void fillModel(ChartModel chartModel,XmlObject xmlObject,int bias) {

if (!this.chartImplClazz.getName().equals(xmlObject.getClass().getName())) {

//当前循环中图表操作不属于当前枚举

ChartsEnum.getEnumByChartImplClazz(((XmlComplexContentImpl)xmlObject).getClass())

.fillModel(chartModel, xmlObject, bias);

return;

}

CTScatterChart chart = (CTScatterChart)xmlObject;

List serList = chart.getSerList();

//更新数据区域

for (int i = 0; i < serList.size(); i++) {

//数据填充

//

CTScatterSer ser = chart.getSerArray(i);

CTAxDataSource cat = ser.getXVal();

CTNumDataSource val = ser.getYVal();

this.dataAnalysisFill(chartModel,i,bias,cat,val);

}

}

/**

  • 得到目标位置的图表

  • @param ctChart 可绘制区域图表

  • @param xmlObjSeat 目标图标位置位置

  • @return

*/

@Override

public XmlObject getTargetChart(int chartSeat, CTChart ctChart, int xmlObjSeat) {

try {

CTScatterChart scatterChart = ctChart.getPlotArea().getScatterChartArray(xmlObjSeat);

return scatterChart;

}catch (Exception e){

throw new RuntimeException(“当前位置【” + chartSeat + “】不存在【散点图】!!!”);

}

}

},

;

/**

  • 图表对象

*/

public Class<? extends XmlObject> chartClazz;

/**

  • 图表实现对象

*/

public Class<? extends XmlComplexContentImpl> chartImplClazz;

ChartsEnum(Class<? extends XmlObject> chartClazz,

Class<? extends XmlComplexContentImpl> chartImplClazz){

this.chartClazz = chartClazz;

this.chartImplClazz = chartImplClazz;

}

/**

  • 填充模板数据

  • @param chartModel 图表和数据源

  • @param xmlObject 当前元素

  • @param bias 偏向值

*/

public abstract void fillModel(ChartModel chartModel,XmlObject xmlObject,int bias);

/**

  • 得到目标位置的图表

  • @param chartSeat 位置

  • @param ctChart 可绘制区域图表

  • @param xmlObjSeat 目标图标位置位置

*/

public abstract XmlObject getTargetChart(int chartSeat,CTChart ctChart,int xmlObjSeat);

/**

  • 根据值来源得到对应的 图表实现对象

  • @param chartImplClazz 图表实现对象

  • @return

*/

public static ChartsEnum getEnumByChartImplClazz(Class<? extends XmlComplexContentImpl> chartImplClazz){

for (ChartsEnum value : ChartsEnum.values()) {

if (value.getChartImplClazz().equals(chartImplClazz)){

return value;

}

}

return null;

}

/**

  • 根据值来源得到对应的 图表对象

  • @param chartClazz 图表对象

  • @return

*/

public static ChartsEnum getEnumByChartClazz(Class<? extends XmlObject> chartClazz){

for (ChartsEnum value : ChartsEnum.values()) {

if (value.getChartClazz().equals(chartClazz)){

return value;

}

}

return null;

}

/**

  • 刷新内置excel数据

  • @return

*/

public static boolean refreshExcel(ChartModel chartModel) throws IOException, InvalidFormatException {

List titleList = chartModel.getTitleList();

List numberList = chartModel.getNumberList();

List<Map<String, String>> sourceModelList = chartModel.getSourceModelList();

XWPFChart xwpfChart = chartModel.getXwpfChart();

boolean result = true;

Workbook wb = new XSSFWorkbook();

Sheet sheet = wb.createSheet(chartModel.getSheetName());

//根据数据创建excel第一行标题行

for (int i = 0; i < titleList.size(); i++) {

if (sheet.getRow(0) == null) {

sheet.createRow(0).createCell(i).setCellValue(titleList.get(i) == null ? “” : titleList.get(i));

} else {

sheet.getRow(0).createCell(i).setCellValue(titleList.get(i) == null ? “” : titleList.get(i));

}

}

//遍历数据行

for (int i = 0; i < sourceModelList.size(); i++) {

Map<String, String> baseFormMap = sourceModelList.get(i);//数据行

//fldNameArr字段属性

for (int j = 0; j < numberList.size(); j++) {

if (sheet.getRow(i + 1) == null) {

if (j == 0) {

try {

sheet.createRow(i + 1)

.createCell(j)

.setCellValue(baseFormMap.get(numberList.get(j)) == null ?

“” : baseFormMap.get(numberList.get(j)));

} catch (Exception e) {

if (baseFormMap.get(numberList.get(j)) == null) {

sheet.createRow(i + 1).createCell(j).setCellValue(“”);

} else {

sheet.createRow(i + 1)

.createCell(j)

.setCellValue(baseFormMap.get(numberList.get(j)));

}

}

}

} else {

BigDecimal b = new BigDecimal(baseFormMap.get(numberList.get(j)));

double value = 0D;

if (b != null) {

value = b.doubleValue();

}

if (value == 0D) {

sheet.getRow(i + 1).createCell(j);

} else {

sheet.getRow(i + 1).createCell(j).setCellValue(b.doubleValue());

}

}

}

}

// 更新嵌入的workbook

List pxdList = xwpfChart.getRelations();

if(pxdList!=null&&pxdList.size()>0) {

for (int i = 0; i < pxdList.size(); i++) {

if (pxdList.get(i).toString().contains(“sheet”)) {

POIXMLDocumentPart xlsPart = xwpfChart.getRelations().get(0);

OutputStream xlsOut = xlsPart.getPackagePart().getOutputStream();

try {

wb.write(xlsOut);

xlsOut.close();

} catch (IOException e) {

e.printStackTrace();

result = false;

} finally {

if (wb != null) {

try {

wb.close();

} catch (IOException e) {

e.printStackTrace();

result = false;

}

}

}

}

}

}

return result;

}

/**

  • 数据分析

  • @param chartModel

  • @param i

  • @param bias

  • @param cat

  • @param val

*/

public void dataAnalysisFill (ChartModel chartModel,

int i,

int bias,

CTAxDataSource cat,

CTNumDataSource val) {

//数据源

List<Map<String, String>> sourceModelList = chartModel.getSourceModelList();

//数据源key

List numberList = chartModel.getNumberList();

//

CTStrData strData = cat.getStrRef().getStrCache();

CTNumData numData = val.getNumRef().getNumCache();

long idx = 0;

for (int j = 0; j < sourceModelList.size(); j++) {

//判断获取的值是否为空

String value = “0”;

if (new BigDecimal(sourceModelList.get(j).get(numberList.get(i + 1))) != null) {

value = new BigDecimal(sourceModelList.get(j).get(numberList.get(i + 1))).toString();

}

if (!“0”.equals(value)) {

CTNumVal numVal = numData.addNewPt();//序列值

numVal.setIdx(idx);

numVal.setV(value);

}

CTStrVal sVal = strData.addNewPt();//序列名称

sVal.setIdx(idx);

sVal.setV(sourceModelList.get(j).get(numberList.get(0)));

idx++;

}

numData.getPtCount().setVal(idx);

strData.getPtCount().setVal(idx);

//赋值横坐标数据区域

String axisDataRange = new

CellRangeAddress(1, sourceModelList.size(), 0, 0)

.formatAsString(chartModel.getSheetName(), false);

cat.getStrRef().setF(axisDataRange);

//赋值纵坐标数据区域

String numDataRange = new

CellRangeAddress(1, sourceModelList.size(), i + 1 + bias, i + 1 + bias)

.formatAsString(chartModel.getSheetName(), false);

val.getNumRef().setF(numDataRange);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

面试资料整理汇总

成功从小公司跳槽进蚂蚁定级P7,只因刷了七遍这些面试真题

成功从小公司跳槽进蚂蚁定级P7,只因刷了七遍这些面试真题

这些面试题是我朋友进阿里前狂刷七遍以上的面试资料,由于面试文档很多,内容更多,没有办法一一为大家展示出来,所以只好为大家节选出来了一部分供大家参考。

面试的本质不是考试,而是告诉面试官你会做什么,所以,这些面试资料中提到的技术也是要学会的,不然稍微改动一下你就凉凉了

在这里祝大家能够拿到心仪的offer!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
ange);

//赋值纵坐标数据区域

String numDataRange = new

CellRangeAddress(1, sourceModelList.size(), i + 1 + bias, i + 1 + bias)

.formatAsString(chartModel.getSheetName(), false);

val.getNumRef().setF(numDataRange);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-W9CcJCuH-1713129682443)]

[外链图片转存中…(img-yMbaf1zr-1713129682444)]

[外链图片转存中…(img-Hq1kUohu-1713129682444)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

面试资料整理汇总

[外链图片转存中…(img-fCVZw6Lo-1713129682445)]

[外链图片转存中…(img-9KtwVs3c-1713129682445)]

这些面试题是我朋友进阿里前狂刷七遍以上的面试资料,由于面试文档很多,内容更多,没有办法一一为大家展示出来,所以只好为大家节选出来了一部分供大家参考。

面试的本质不是考试,而是告诉面试官你会做什么,所以,这些面试资料中提到的技术也是要学会的,不然稍微改动一下你就凉凉了

在这里祝大家能够拿到心仪的offer!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 28
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Apache POI 3.7版本生成柱状图的步骤如下: 1.创建一个Workbook对象,表示整个Excel文件。 ``` Workbook wb = new HSSFWorkbook(); ``` 2.创建一个Sheet对象,表示Excel文件中的一个sheet。 ``` Sheet sheet = wb.createSheet("Sheet1"); ``` 3.创建一个Row对象,表示某个单元格所在行。 ``` Row row = sheet.createRow(0); ``` 4.创建一个Cell对象,表示一个单元格。 ``` Cell cell = row.createCell(0); ``` 5.设置单元格的值。 ``` cell.setCellValue("柱状图"); ``` 6.创建一个Drawing对象,用于绘制形。 ``` Drawing drawing = sheet.createDrawingPatriarch(); ``` 7.创建一个ClientAnchor对象,表示形在单元格中的位置和大小。 ``` ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15); ``` 其中,(0, 0)表示形左上角在单元格(0,0)处,(0, 5)表示形右下角在单元格(5,10)处。 8.创建一个Chart对象,表示形。 ``` Chart chart = drawing.createChart(anchor); ``` 9.创建一个ChartLegend对象,表示例。 ``` ChartLegend legend = chart.getOrCreateLegend(); legend.setPosition(LegendPosition.BOTTOM); ``` 10.创建一个BarChartData对象,表示柱状图的数据。 ``` BarChartData data = new BarChartDataBuilder() .setCategories(new String[]{"A", "B", "C"}) .addSeries("Series 1", new double[]{1, 2, 3}) .addSeries("Series 2", new double[]{2, 3, 4}) .build(); ``` 其中,setCategories方法设置X轴上的标签,addSeries方法添加数据系列。 11.创建一个ChartAxis对象,表示X轴。 ``` ChartAxis bottomAxis = chart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM); bottomAxis.setMajorTickMark(AxisTickMark.NONE); ``` 12.创建一个ChartAxis对象,表示Y轴。 ``` ChartAxis leftAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT); leftAxis.setCrosses(AxisCrosses.AUTO_ZERO); ``` 13.创建一个BarChartSeries对象,表示柱状图的数据系列。 ``` BarChartSeries series1 = data.getSeries().get(0); BarChartSeries series2 = data.getSeries().get(1); ``` 14.创建一个BarChartSeriesRender对象,表示柱状图的样式。 ``` BarChartSeriesRender render1 = new BarChartSeriesRender(); render1.setFill(new SimpleSolidFill(Color.BLUE)); BarChartSeriesRender render2 = new BarChartSeriesRender(); render2.setFill(new SimpleSolidFill(Color.RED)); ``` 15.将数据系列和样式添加到形中。 ``` chart.plot(data, bottomAxis, leftAxis, render1, render2); ``` 完整的代码示例: ``` Workbook wb = new HSSFWorkbook(); Sheet sheet = wb.createSheet("Sheet1"); Row row = sheet.createRow(0); Cell cell = row.createCell(0); cell.setCellValue("柱状图"); Drawing drawing = sheet.createDrawingPatriarch(); ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15); Chart chart = drawing.createChart(anchor); ChartLegend legend = chart.getOrCreateLegend(); legend.setPosition(LegendPosition.BOTTOM); BarChartData data = new BarChartDataBuilder() .setCategories(new String[]{"A", "B", "C"}) .addSeries("Series 1", new double[]{1, 2, 3}) .addSeries("Series 2", new double[]{2, 3, 4}) .build(); ChartAxis bottomAxis = chart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM); bottomAxis.setMajorTickMark(AxisTickMark.NONE); ChartAxis leftAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT); leftAxis.setCrosses(AxisCrosses.AUTO_ZERO); BarChartSeries series1 = data.getSeries().get(0); BarChartSeries series2 = data.getSeries().get(1); BarChartSeriesRender render1 = new BarChartSeriesRender(); render1.setFill(new SimpleSolidFill(Color.BLUE)); BarChartSeriesRender render2 = new BarChartSeriesRender(); render2.setFill(new SimpleSolidFill(Color.RED)); chart.plot(data, bottomAxis, leftAxis, render1, render2); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值