2017-07-08 339 views
0

我使用apache poi在excel文件中創建了條形圖。我怎樣才能刪除劇情區域外的邊界/邊緣?下圖中的藍色邊框區域。 enter image description here在excel中刪除apache poi條形圖中的邊框區域

我通過編輯創建的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文件本身設置藍色邊框(只需更改顏色,默認情況下它是白色的)。我現在可以用你的建議改變圓形。但我無法用你的代碼擺脫藍色區域。我必須在小範圍內顯示我的barChart(像2個單元格的2個單元格)。所以,我需要擺脫藍色區域,使圖形更大。否則,大部分空間被藍色部分佔據。 – Masum

+0

@Masum:「但是我不能用你的代碼去掉藍色區域。」:然後,我不得不進一步提供一個[Minimal,Complete和Verifiable示例](https://stackoverflow.com/help/MCVE)。對於我來說,'((XSSFChart)圖表).getCTChartSpace()。addNewSpPr()。addNewLn()。addNewNoFill();'與'chart'一起使用是一個新創建的'XSSFChart'。也許它必須是'((XSSFChart)圖表).getCTChartSpace()。getSpPr()。unsetLn();'first and then((XSSFChart)chart).getCTChartSpace()。getSpPr()。addNewLn()。addNewNoFill ));'爲你。但這只是一個瘋狂的猜測。 –

+0

我已添加我的代碼。謝謝! – Masum