2017-04-27 227 views
1

这是我的代码,它可以成功生成结果。我只是想为情节添加网格线,但我无法管理它。有谁能帮助解决这个问题吗?如何使用Apache POI将曲线添加到excel折线图

import java.io.FileOutputStream; 
import org.apache.poi.ss.usermodel.*; 
import org.apache.poi.ss.usermodel.charts.*; 
import org.apache.poi.ss.util.CellRangeAddress; 
import org.apache.poi.xssf.usermodel.XSSFChart; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 
import org.openxmlformats.schemas.drawingml.x2006.chart.*; 
import org.openxmlformats.schemas.spreadsheetml.x2006.main.*; 

public class PlotCT { 
    public static void main (String[] args) throws Exception { 

     Workbook wb = new XSSFWorkbook(); 
     Sheet dataSheet = wb.createSheet("linechart"); 
     dataSheet.setDisplayGridlines(true); 

     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"); 
     bottomAxis.setMajorTickMark(AxisTickMark.CROSS); 
     bottomAxis.setMinorTickMark(AxisTickMark.IN); 
     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.addNewSpPr().addNewSolidFill().addNewSrgbClr().setVal(new byte[] {0,0,0}); 
      ser.setSmooth(ctBool); 
     } 


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

     plotArea.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[] {11,0,0}); 

     CTFill myPatternFill= CTFill.Factory.newInstance();          
     CTPatternFill pFill=myPatternFill.addNewPatternFill(); 
     pFill.setPatternType(STPatternType.DARK_DOWN); 

     //plotArea.addNewSpPr().addNewLn().addNewGradFill().addNewLin(); 
     // plotArea.addNewSpPr().addNewBlipFill().addNewBlip(); 
     //CTTableGrid ctTableGrid = CTTableGrid.Factory.newInstance(); 
     //ctTableGrid.addNewGridCol(); 

     FileOutputStream fileOut = new FileOutputStream("chart.xlsx"); 
     wb.write(fileOut); 
     fileOut.close(); 
     System.out.println("complete!"); 
    } 

} 

这是我得到了什么, existing result

这就是我想要的, desired result

谁能帮我这个问题?

回答

1

您可以使用此代码做到这一点: 首先从图表对象创建CTPlotArea

CTPlotArea plotArea = chart.getCTChart().getPlotArea(); 

然后用这个水平轴和垂直轴

plotArea.getCatAxArray()[0].addNewMajorGridlines(); 
plotArea.getValAxArray()[0].addNewMajorGridlines(); 

如果你想显示次网格使用代码代替

plotArea.getCatAxArray()[0].addNewMinorGridlines(); 
plotArea.getValAxArray()[0].addNewMinorGridlines(); 

代码应放在chart.plot(数据,ChartAxis ... chartAxis)方法之后

+0

您也可以用7z或其他存档程序打开.xlsx文件,然后转到xl/charts/chart1.xml,将在XML文件中找到一些属性,它们可以在POI Chart类中具有相同的方法名称 –