Как удалить будущие даты из столбчатой диаграммы со стеком

#java #excel #apache-poi #drawing #apache-poi-4

#java #excel #apache-poi #рисование #apache-poi-4

Вопрос:

  • Мой текущий Java-код генерирует столбчатую диаграмму с использованием Apache POI 4.0.1, как показано на следующей диаграмме.
  • Я не хочу печатать строку для будущих дат (например: на следующей диаграмме мне не нужны эти нули с даты 04/04); но я хочу, чтобы эти даты были ниже оси X.
  • Мой вопрос в том, как удалить / отключить рисование линий для нуля?


Пример кода

 // line chart

// axis must be there but must not be visible
bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
bottomAxis.setVisible(false);
leftAxis = chart.createValueAxis(AxisPosition.LEFT);
leftAxis.setVisible(false);

// set correct cross axis
bottomAxis.crossAxis(leftAxis);
leftAxis.crossAxis(bottomAxis);

data = chart.createData(ChartTypes.LINE, bottomAxis, leftAxis);
XDDFLineChartData.Series series4 = (XDDFLineChartData.Series)data.addSeries(date, category);
series4.setTitle("Total", null);
series4.setSmooth(false);
series4.setMarkerStyle(MarkerStyle.STAR);
chart.plot(data);

// correct the id and order, must not start 0 again because there are three bar series already
chart.getCTChart().getPlotArea().getLineChartArray(0).getSerArray(0).getIdx().setVal(3);
chart.getCTChart().getPlotArea().getLineChartArray(0).getSerArray(0).getOrder().setVal(3);

solidLineSeries(data, 0, PresetColor.YELLOW);

// add data labels
chart.getCTChart().getPlotArea().getLineChartArray(0).getSerArray(0).addNewDLbls();
chart.getCTChart().getPlotArea().getLineChartArray(0).getSerArray(0).getDLbls()
 .addNewSpPr().addNewSolidFill().addNewSrgbClr().setVal(new byte[]{(byte)255,(byte)255,0});
chart.getCTChart().getPlotArea().getLineChartArray(0).getSerArray(0).getDLbls()
 .addNewDLblPos().setVal(org.openxmlformats.schemas.drawingml.x2006.chart.STDLblPos.CTR);
chart.getCTChart().getPlotArea().getLineChartArray(0).getSerArray(0).getDLbls().addNewShowVal().setVal(true);
chart.getCTChart().getPlotArea().getLineChartArray(0).getSerArray(0).getDLbls().addNewShowLegendKey().setVal(false);
chart.getCTChart().getPlotArea().getLineChartArray(0).getSerArray(0).getDLbls().addNewShowCatName().setVal(false);
chart.getCTChart().getPlotArea().getLineChartArray(0).getSerArray(0).getDLbls().addNewShowSerName().setVal(false);
  

Ответ №1:

  • Сначала вы должны написать следующие строки кода перед chart.plot(data);.

    Это установит пустые значения в качестве пробелов на диаграмме, чтобы вы могли точно отображать ряды данных разной длины

 CTDispBlanksAs disp = CTDispBlanksAs.Factory.newInstance();    
disp.setVal(STDispBlanksAs.GAP);    
chart.getCTChart().setDispBlanksAs(disp);    
  
  • Импортирует
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTDispBlanksAs;    
import org.openxmlformats.schemas.drawingml.x2006.chart.STDispBlanksAs;
  
  • Затем, после рисования кода и внешнего цикла, напишите код, чтобы установить эти нули как ПУСТЫЕ.
 int rownum = 0;      
// loop start     
Row rowT = sheetTestcasenBurndown.getRow(rownum);    
for (int cellnumStart = 1; cellnumStart <= cellnumEnd; cellnumStart  ) {     
    Cell cell = rowT.getCell(cellnumStart);       
    cell.setCellType(CellType.BLANK);    
}    
// loop end     
rownum  ;
  

Вывод