2017-04-27 64 views
1

これは自分のコードであり、結果を正常に生成します。私はちょうどプロットのためのグリッド線を追加したいが、私はそれを管理することができませんでした。誰でもこの問題に関して助けてもらえますか?Apache POIを使用して線グラフにグリッド線を追加する方法

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

あなたはこのコードを使用してそれを行うことができます。 まず、あなたがマイナーグリッドの使用にこれを表示したい場合は

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

横軸と縦軸のためにこれを使用すると、グラフオブジェクトCTPlotArea

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

から作成代わりにコード

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

コードはchart.plot(data、ChartAxis ... chartAxis)メソッドの後に置く必要があります

+0

xlsxファイルを7zなどのアーカイブプログラムで開くこともできます。xl/charts/chart1.xmlに移動してくださいPOI Chartクラスのメソッドと同じ名前を持つことができるいくつかのプロパティをxmlファイル内に見つける –

関連する問題