在apache poi条形图中使用excel单元格外的值

我正在尝试在使用Apache poi的excel文件中创build条形图,并遵循下面提到的代码: 使用Apache POI在Excel中创build条形图 。

在我的情况下,我需要使用来自不同来源,而不是Excel单元格的数据值。 我怎样才能在BarChart中使用这些值?

假定这些值将以float / double值的数组forms出现。 此外,我需要能够独立设置酒吧颜色。 例如,一些酒吧将是绿色的,而其他酒吧将是红色的。

我用以下方式修改了在Excel中使用Apache POI代码创build条形图的数据部分:

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> 

你的改变的主要问题是:

  1. 你忘了设置CTStrValCTNumVal ,你已经使用addNewPt添加了。

  2. CTNumData添加到CTNumDataSourceaddNewNumLit应该包含尽可能多的CTNumVal就像系列中的数据点一样。 一个系列中不应该有多个CTNumData 。 用CTStrData中的CTAxDataSource你已经做对了 – 除了缺less的Idx ,见1。

下面的代码是创build相同的图表作为链接的答案,但没有单元格引用:

 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(); } } 

问题:正常情况下,string字面值数组(如={"HEADER 1","HEADER 2","HEADER 3"}不允许用作轴标签。 这里只允许引用。 Excel在渲染图表时接受此操作,但不能在Excel GUI中编辑这些轴标签。