我正在尝试使用Apache poi在excel文件中创建条形图并遵循此处提到的代码: Create Bar Chart in Excel with Apache POI
就我而言,我需要使用来自不同来源的数据值而不是excel单元格。如何在BarChart中使用这些值?
假设值将作为float / double值的数组。此外,我需要能够独立设置条形颜色。例如,有些条形图为绿色,而有些条形图条为红色。
我以下列方式修改了Create Bar Chart in Excel with Apache POI代码的数据部分:
CTBarSer ctBarSer = ctBarChart.addNewSer();
CTSerTx ctSerTx = ctBarSer.addNewTx();
CTStrRef ctStrRef = ctSerTx.addNewStrRef();
ctStrRef.setF("hardcoded" + r);
ctBarSer.addNewIdx().setVal(r-2);
CTAxDataSource cttAxDataSource = ctBarSer.addNewCat();
CTStrData ctStrData = cttAxDataSource.addNewStrLit();
ctStrData.addNewPt().setV("Val1");
ctStrData.addNewPt().setV("Val2");
ctStrData.addNewPt().setV("Val3");
CTNumDataSource ctNumDataSource = ctBarSer.addNewVal();
CTNumData ctNumData = ctNumDataSource.addNewNumLit();
CTNumVal ctNumVal = ctNumData.addNewPt();
ctNumVal.setV(String.valueOf(0.92));
ctNumData = ctNumDataSource.addNewNumLit();
ctNumVal = ctNumData.addNewPt();
ctNumVal.setV(String.valueOf(0.95));
ctNumData = ctNumDataSource.addNewNumLit();
ctNumVal = ctNumData.addNewPt();
ctNumVal.setV(String.valueOf(0.98));
非常感谢任何帮助。谢谢!
当我使用print输出excel文件时,它会得到以下结果:
<xml-fragment xmlns:char="http://schemas.openxmlformats.org/drawingml/2006/chart" xmlns:main="http://schemas.openxmlformats.org/drawingml/2006/main">
<char:plotArea>
<char:layout/>
<char:barChart>
<char:barDir val="col"/>
<char:varyColors val="false"/>
<char:ser>
<char:idx val="0"/>
<char:tx>
<char:strRef>
<char:f>hardcoded2</char:f>
</char:strRef>
</char:tx>
<char:spPr>
<main:ln>
<main:solidFill>
<main:srgbClr val="000000"/>
</main:solidFill>
</main:ln>
</char:spPr>
<char:cat>
<char:strLit>
<char:pt>
<char:v>Val1</char:v>
</char:pt>
<char:pt>
<char:v>Val2</char:v>
</char:pt>
<char:pt>
<char:v>Val3</char:v>
</char:pt>
</char:strLit>
</char:cat>
<char:val>
<char:numLit>
<char:pt>
<char:v>0.92</char:v>
</char:pt>
</char:numLit>
<char:numLit>
<char:pt>
<char:v>0.95</char:v>
</char:pt>
</char:numLit>
<char:numLit>
<char:pt>
<char:v>0.98</char:v>
</char:pt>
</char:numLit>
</char:val>
</char:ser>
<char:axId val="123456"/>
<char:axId val="123457"/>
</char:barChart>
<char:catAx>
<char:axId val="123456"/>
<char:scaling>
<char:orientation val="minMax"/>
</char:scaling>
<char:delete val="false"/>
<char:axPos val="b"/>
<char:tickLblPos val="nextTo"/>
<char:crossAx val="123457"/>
</char:catAx>
<char:valAx>
<char:axId val="123457"/>
<char:scaling>
<char:orientation val="minMax"/>
</char:scaling>
<char:delete val="false"/>
<char:axPos val="l"/>
<char:tickLblPos val="nextTo"/>
<char:crossAx val="123456"/>
</char:valAx>
</char:plotArea>
<char:plotVisOnly val="true"/>
</xml-fragment>
答案 0 :(得分:2)
你的改变的主要问题是:
您忘记设置Idx
和CTStrVal
的{{1}},您已使用CTNumVal
添加。{/ p>
addNewPt
的{{1}}的{li> CTNumData
应该包含尽可能多的CTNumDataSource
,就像系列中有数据点一样。一个系列中不应该有多个addNewNumLit
。 CTNumVal
中的CTNumData
您已做得正确 - 除了缺少的CTStrData
,请参阅1.
以下代码创建的图表与链接答案中的图表相同,但没有单元格引用:
CTAxDataSource
问题:通常不允许像Idx
这样的字符串文字数组作为轴标签。这里只允许引用。 import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.*;
import org.apache.poi.ss.usermodel.charts.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBarChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBarSer;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTCatAx;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTValAx;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTScaling;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLegend;
import org.openxmlformats.schemas.drawingml.x2006.chart.STAxPos;
import org.openxmlformats.schemas.drawingml.x2006.chart.STBarDir;
import org.openxmlformats.schemas.drawingml.x2006.chart.STOrientation;
import org.openxmlformats.schemas.drawingml.x2006.chart.STLegendPos;
import org.openxmlformats.schemas.drawingml.x2006.chart.STTickLblPos;
/*
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumRef;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrRef;
*/
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrData;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumData;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumVal;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrVal;
public class BarChartPlainValues {
public static void main(String[] args) throws Exception {
Workbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet("Sheet1");
/*
cell filing code deleted
*/
Drawing drawing = sheet.createDrawingPatriarch();
ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 8, 20);
Chart chart = drawing.createChart(anchor);
CTChart ctChart = ((XSSFChart)chart).getCTChart();
CTPlotArea ctPlotArea = ctChart.getPlotArea();
CTBarChart ctBarChart = ctPlotArea.addNewBarChart();
CTBoolean ctBoolean = ctBarChart.addNewVaryColors();
ctBoolean.setVal(true);
ctBarChart.addNewBarDir().setVal(STBarDir.COL);
//new code start
for (int s = 1; s < 5; s++) {
CTBarSer ctBarSer = ctBarChart.addNewSer();
CTSerTx ctSerTx = ctBarSer.addNewTx();
ctSerTx.setV("Serie " + s);
ctBarSer.addNewIdx().setVal(s-1);
CTAxDataSource ctAxDataSource = ctBarSer.addNewCat();
CTStrData ctStrData = ctAxDataSource.addNewStrLit();
ctStrData.addNewPtCount().setVal(3);
CTStrVal ctStrVal = ctStrData.addNewPt();
ctStrVal.setIdx(0);
ctStrVal.setV("HEADER 1");
ctStrVal = ctStrData.addNewPt();
ctStrVal.setIdx(1);
ctStrVal.setV("HEADER 2");
ctStrVal = ctStrData.addNewPt();
ctStrVal.setIdx(2);
ctStrVal.setV("HEADER 3");
CTNumDataSource ctNumDataSource = ctBarSer.addNewVal();
CTNumData ctNumData = ctNumDataSource.addNewNumLit();
ctNumData.addNewPtCount().setVal(3);
CTNumVal ctNumVal = ctNumData.addNewPt();
ctNumVal.setIdx(0);
ctNumVal.setV("" + new java.util.Random().nextDouble());
ctNumVal = ctNumData.addNewPt();
ctNumVal.setIdx(1);
ctNumVal.setV("" + new java.util.Random().nextDouble());
ctNumVal = ctNumData.addNewPt();
ctNumVal.setIdx(2);
ctNumVal.setV("" + new java.util.Random().nextDouble());
//at least the border lines in Libreoffice Calc ;-)
ctBarSer.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[] {0,0,0});
}
//new code end
/*
chart reference code deleted
*/
//telling the BarChart that it has axes and giving them Ids
ctBarChart.addNewAxId().setVal(123456);
ctBarChart.addNewAxId().setVal(123457);
//cat axis
CTCatAx ctCatAx = ctPlotArea.addNewCatAx();
ctCatAx.addNewAxId().setVal(123456); //id of the cat axis
CTScaling ctScaling = ctCatAx.addNewScaling();
ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
ctCatAx.addNewDelete().setVal(false);
ctCatAx.addNewAxPos().setVal(STAxPos.B);
ctCatAx.addNewCrossAx().setVal(123457); //id of the val axis
ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
//val axis
CTValAx ctValAx = ctPlotArea.addNewValAx();
ctValAx.addNewAxId().setVal(123457); //id of the val axis
ctScaling = ctValAx.addNewScaling();
ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
ctValAx.addNewDelete().setVal(false);
ctValAx.addNewAxPos().setVal(STAxPos.L);
ctValAx.addNewCrossAx().setVal(123456); //id of the cat axis
ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
//legend
CTLegend ctLegend = ctChart.addNewLegend();
ctLegend.addNewLegendPos().setVal(STLegendPos.B);
ctLegend.addNewOverlay().setVal(false);
System.out.println(ctChart);
FileOutputStream fileOut = new FileOutputStream("BarChartPlainValues.xlsx");
wb.write(fileOut);
fileOut.close();
}
}
在渲染图表时接受此操作,但您无法在={"HEADER 1","HEADER 2","HEADER 3"}
GUI中编辑这些轴标签。