2016-09-22 188 views
2

我使用折线图创建Excel文件。我创建了图表并填充了数据,但我无法在图表上创建点。有谁知道,有没有一种方法可以在图表中使用apache poi生成这些点(三角形,正方形,圆形等)?Apache poi Excel折线图点

enter image description here

这是我生成当前字符代码:

public static void main(String[] args) throws Exception { 
     Workbook wb = new XSSFWorkbook(); 
     Sheet dataSheet = wb.createSheet("linechart"); 

     final int NUM_OF_ROWS = 10; 
     final int NUM_OF_COLUMNS = 4; 

     Row row; 
     Cell cell; 
     for (int rowIndex = 0; rowIndex < NUM_OF_ROWS; rowIndex++) { 
      row = dataSheet.createRow((short) rowIndex); 
      for (int colIndex = 0; colIndex < NUM_OF_COLUMNS; colIndex++) { 
       cell = row.createCell((short) colIndex); 
       cell.setCellValue(rowIndex * ((colIndex + 1) + ((int) (Math.random() * 10)))); 
      } 
     } 

     Drawing drawing = dataSheet.createDrawingPatriarch(); 
     ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, NUM_OF_COLUMNS + 2, 3, NUM_OF_COLUMNS + 15, 20); 

     Chart chart = drawing.createChart(anchor); 
     ChartLegend legend = chart.getOrCreateLegend(); 
     legend.setPosition(LegendPosition.RIGHT); 

     LineChartData data = chart.getChartDataFactory().createLineChartData(); 

     ChartAxis bottomAxis = chart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM); 
     ValueAxis leftAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT); 
     leftAxis.setCrosses(AxisCrosses.AUTO_ZERO); 

     ChartDataSource<Number> xs = DataSources.fromNumericCellRange(dataSheet, new CellRangeAddress(0, NUM_OF_ROWS - 1, 0, 0)); 
     ChartDataSource<Number> ys1 = DataSources.fromNumericCellRange(dataSheet, new CellRangeAddress(0, NUM_OF_ROWS - 1, 1, 1)); 
     ChartDataSource<Number> ys2 = DataSources.fromNumericCellRange(dataSheet, new CellRangeAddress(0, NUM_OF_ROWS - 1, 2, 2)); 
     ChartDataSource<Number> ys3 = DataSources.fromNumericCellRange(dataSheet, new CellRangeAddress(0, NUM_OF_ROWS - 1, 3, 3)); 

     LineChartSeries series1 = data.addSeries(xs, ys1); 
     series1.setTitle("one"); 
     LineChartSeries series2 = data.addSeries(xs, ys2); 
     series2.setTitle("two"); 
     LineChartSeries series3 = data.addSeries(xs, ys3); 
     series3.setTitle("three"); 

     chart.plot(data, bottomAxis, leftAxis); 

     XSSFChart xssfChart = (XSSFChart) chart; 
     CTPlotArea plotArea = xssfChart.getCTChart().getPlotArea(); 
     plotArea.getLineChartArray()[0].getSmooth(); 
     CTBoolean ctBool = CTBoolean.Factory.newInstance(); 
     ctBool.setVal(false); 
     plotArea.getLineChartArray()[0].setSmooth(ctBool); 
     for (CTLineSer ser : plotArea.getLineChartArray()[0].getSerArray()) { 
      ser.setSmooth(ctBool); 
     } 

     FileOutputStream fileOut = new FileOutputStream("chart.xlsx"); 
     wb.write(fileOut); 
     fileOut.close(); 
    } 

回答

2

解决方案:

CTPlotArea plotArea = xssfChart.getCTChart().getPlotArea(); 
CTMarker ctMarker = CTMarker.Factory.newInstance(); 
ctMarker.setSymbol(CTMarkerStyle.Factory.newInstance()); 
for (CTLineSer ser : plotArea.getLineChartArray()[0].getSerArray()) { 
    ser.setMarker(ctMarker); 
} 
0

下面的代码会给你你正在寻找什么

CTPlotArea plotArea = xssfChart.getCTChart().getPlotArea(); 
    plotArea.getLineChartArray()[0].getSmooth(); 
    CTMarker ctMarker = CTMarker.Factory.newInstance(); 
    ctMarker.setSymbol(CTMarkerStyle.Factory.newInstance()); 
    CTBoolean ctBool = CTBoolean.Factory.newInstance(); 
    ctBool.setVal(false); 
    plotArea.getLineChartArray()[0].setSmooth(ctBool); 
    for (CTLineSer ser : plotArea.getLineChartArray()[0].getSerArray()) { 
     ser.setSmooth(ctBool); 
     ser.setMarker(ctMarker); 
    }