2017-07-08 17 views
0

apache poiを使用してExcelファイルに棒グラフを作成しました。プロットエリア外の枠線/余白を削除するにはどうすればよいですか?次の画像の青い枠線の領域。 enter image description hereapache poi bar chartの境界線をExcelで削除する

作成したExcelファイルを編集して青い部分を追加しました。編集前は白だった。このグラフを作成するファンクションコードを次に示します。

public void createBarChart(double[] values, boolean[] passed, String[] labels, 
          int Dx1, int Dy1, int Dx2, int Dy2, 
          int row1, int col1, int row2, int col2){ 
    Drawing drawing = sheet.createDrawingPatriarch(); 
    ClientAnchor anchor = drawing.createAnchor(Dx1, Dy1, Dx2, Dy2, col1, row1, col2, row2); 
    Chart chart = drawing.createChart(anchor); 


    CTChart ctChart = ((XSSFChart)chart).getCTChart(); 

    CTPlotArea ctPlotArea = ctChart.getPlotArea(); 
    CTBarChart ctBarChart = ctPlotArea.addNewBarChart(); 
    //CTBoolean ctBoolean = ctBarChart.addNewVaryColors(); 
    //ctBoolean.setVal(false); 
    ctBarChart.addNewBarDir().setVal(STBarDir.COL); 

    // Add the bars 
    int length = values.length; 
    for (int s = 0; s < length; s++) { 
     CTBarSer ctBarSer = ctBarChart.addNewSer(); 
     CTSerTx ctSerTx = ctBarSer.addNewTx(); 
     ctSerTx.setV(labels[s]); 
     ctBarSer.addNewIdx().setVal(s); 

     CTNumDataSource ctNumDataSource = ctBarSer.addNewVal(); 
     CTNumData ctNumData = ctNumDataSource.addNewNumLit(); 
     ctNumData.addNewPtCount().setVal(1); 
     CTNumVal ctNumVal = ctNumData.addNewPt(); 
     ctNumVal.setIdx(0); 
     ctNumVal.setV("" + values[s]); 


     //at least the border lines in Libreoffice Calc ;-) 
     CTShapeProperties ctShapeProperties = ctBarSer.addNewSpPr(); 
     if(passed[s]) { 
      // bar color, green: passed 
      ctShapeProperties.addNewSolidFill().addNewSrgbClr().setVal(new byte[]{0, (byte)128, 0}); 
     } 
     else { 
      // bar color, red: failed 
      ctShapeProperties.addNewSolidFill().addNewSrgbClr().setVal(new byte[]{(byte) 255, 0, 0}); 
     } 
     //ctShapeProperties.addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[]{0, 0, 0}); // black 
     ctShapeProperties.addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[]{(byte)255, (byte)255, (byte)255}); // white 
    } 


    //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(true); 
    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(true); 
    ctValAx.addNewAxPos().setVal(STAxPos.L); 
    ctValAx.addNewCrossAx().setVal(123456); //id of the cat axis 
    ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO); 

    // Remove rounded corner 
    if (((XSSFChart)chart).getCTChartSpace().getRoundedCorners() == null){ 
     ((XSSFChart)chart).getCTChartSpace().addNewRoundedCorners(); 
    } 

    ((XSSFChart)chart).getCTChartSpace().getRoundedCorners().setVal(false); 
    //chart area (chartspace) without border line 
    ((XSSFChart)chart).getCTChartSpace().addNewSpPr().addNewLn().addNewNoFill(); 


} 

答えて

1

最初は、XSSFChartを作成していると思われます。

どのようにこの青い枠線を設定しましたか?通常、薄い青色の境界線があり、デフォルトでは角が丸くなります。丸みを帯びた角を取り除く方法は、すでにChanging the shape of chart generated by apache poi for excel sheetです。

ただし、境界線の書式を設定する場合は、CTChartSpaceCTShapePropertiesがあることが必要です。

ので:

... 
     Drawing drawing = sheet.createDrawingPatriarch(); 
     ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 8, 20); 

     Chart chart = drawing.createChart(anchor); 

//chart area (chartspace) without border line 
((XSSFChart)chart).getCTChartSpace().addNewSpPr().addNewLn().addNewNoFill(); 
... 

多分プロット領域とプロットエリアとグラフ領域の間のギャップの周りの境界線は、その後、削除されなければならない:

... 
     CTPlotArea ctPlotArea = ctChart.getPlotArea(); 
ctPlotArea.addNewSpPr().addNewLn().addNewNoFill(); 
org.openxmlformats.schemas.drawingml.x2006.chart.CTManualLayout ctManualLayout = ctPlotArea.getLayout().addNewManualLayout(); 
ctManualLayout.addNewX().setVal(0); 
ctManualLayout.addNewY().setVal(0); 
ctManualLayout.addNewW().setVal(1); 
ctManualLayout.addNewH().setVal(1); 
... 
+0

はい、私が最初にXSSFChartを作成しました。私はExcelファイル自体から青い枠線を設定します(色を変更するだけで、デフォルトで白です)。私は今あなたの提案とラウンドシェイプを変更することができます。しかし、あなたのコードで青い部分を取り除くことはできませんでした。私は小領域(2セル2セルのように)で私のbarChartを表示する必要があります。だから、私はグラフを大きくするために青い領域を取り除く必要があります。さもなければ、スペースの大部分はその青い部分によって占有されます。 – Masum

+0

@マッサム:「あなたのコードで青い部分を取り除くことができませんでした」:次に、[最小限で完全で検証可能な例](https://stackoverflow.com/help)を提供するまで、/mcve)。 addNewNoFill(); addNewNoFill(); 'は新しく作成された' XSSFChart'を 'chart'と組み合わせて動作します。おそらく、それは '((XSSFChart)chart).getCTChartSpace()。getSpPr()。unsetLn();'最初にそして次に((XSSFChart)チャート).getCTChartSpace()。getSpPr()。addNewLn()。addNewNoFill() )); 'あなたのために。しかし、これは野生の推測だけです。 –

+0

私のコードを追加しました。ありがとう! – Masum

関連する問題