Графики не отображаются в Google Sheets - PullRequest
0 голосов
/ 06 февраля 2020

Я использую XSSF для создания своих диаграмм в Excel.

Графики отлично выглядят в Microsoft Excel.

Проблема:

Когда я импортирую диаграмму в Google Sheets диаграмма не отображается.

Есть ли способ исправить это?

Я заметил, что если я сделал диаграмму в самом Microsoft Excel и импортировал ее в Google Sheets, отлично работает, и я вижу график. Кажется, что проблема возникает, когда график сделан через Apache POI.

Вот код:

void createChart(
  XSSFSheet sheet, String chartName, double max,
  XDDFDataSource<String> cat, XDDFNumericalDataSource<Double> val
 ) {
  try {

  final int graphRow1 = 6;
  final int graphRow2 = 33;
  final int graphCol1 = 4;
  final int graphCol2 = 22;
  final int logoRow1 = 30;
  final int logoRow2 = 33;
  final int logoCol1 = 19;
  final int logoCol2 = 21;

  XSSFDrawing drawing = sheet.createDrawingPatriarch();
  XSSFClientAnchor anchor = drawing.createAnchor(
      0, 0, 0, 0, graphCol1, graphRow1, graphCol2, graphRow2
  );

  XSSFChart chart = drawing.createChart(anchor);
  chart.setTitleText(chartName);

  chart.setTitleOverlay(false);
  chart.getCTChart().getTitle()
      .getTx()
      .getRich()
      .getPArray(0)
      .getRArray(0)
      .getRPr().setSz(1400);


  CTRegularTextRun secondText = chart.getCTChart().getTitle()
      .getTx()
      .getRich()
      .addNewP()
      .addNewR();
  secondText.setT("Net Analysis");
  secondText.addNewRPr().setSz(1050);
  secondText.getRPr().setI(true);

  chart.getFormattedTitle().getParagraph(0).setTextAlignment(TextAlignment.CENTER);
  chart.getFormattedTitle().getParagraph(1).setTextAlignment(TextAlignment.CENTER);

  XDDFCategoryAxis leftAxis = chart.createCategoryAxis(AxisPosition.LEFT);

  XDDFValueAxis bottomAxis = chart.createValueAxis(AxisPosition.BOTTOM);
  bottomAxis.setTitle("Volume");
  bottomAxis.setCrossBetween(AxisCrossBetween.BETWEEN);

  XDDFBarChartData data =
      (XDDFBarChartData) chart.createData(ChartTypes.BAR, leftAxis, bottomAxis);
  data.setBarDirection(BarDirection.BAR);
  data.setVaryColors(true);

  XDDFChartData.Series series = data.addSeries(cat, val);
  series.setTitle("", null);
  chart.plot(data);

  chart.getCTChartSpace()
      .addNewSpPr()
      .addNewSolidFill()
      .addNewSrgbClr()
      .setVal(HexConverter.parseHexBinary("52c3ba"));

  //needed for image
  //allows to modify anchor otherwise the anchor will resize chart.
  drawing.createGroup(anchor);

  int dx = Units.EMU_PER_CHARACTER * 6;
  int dy = 3 * Units.EMU_PER_CHARACTER / 2;
  anchor.setDx1(dx);
  anchor.setDx2(dx);
  anchor.setDy1(dy);
  anchor.setDy2(dy);
  anchor.setCol1(logoCol1);
  anchor.setCol2(logoCol2);
  anchor.setRow1(logoRow1);
  anchor.setRow2(logoRow2);
  drawing.createPicture(anchor, 0);

  double tickMarkInterval = max % 20 == 0 ? max : max + (20 - (max % 20));
  double maxUnit = tickMarkInterval / 20;

  chart.getCTChart().getPlotArea().getBarChartArray(0).addNewGapWidth().setVal(10);
  chart.getCTChart().getPlotArea().getValAxArray(0).addNewMajorUnit().setVal(maxUnit);

  double scaleMax = max % maxUnit == 0 ? max : max + (maxUnit - (max % maxUnit));
  chart.getCTChart().getPlotArea().getValAxArray(0).getScaling().addNewMax().setVal(scaleMax);


} catch (Exception e) {
  e.printStackTrace();
}
}

здесь сделаны cat и val

XDDFDataSource<String> cat =
    XDDFDataSourcesFactory.fromArray((String[]) categoryList.toArray());
XDDFNumericalDataSource<Double> val =
    XDDFDataSourcesFactory.fromArray((Double[]) valueList.toArray());

Структура XLSX выглядит следующим образом:
Строка 1 имеет категорию A.
Строка 2 имеет подкатегорию A1
Строка 3 имеет подкатегорию A2
Строка 4 имеет подкатегорию A3
Строка 5 имеет общее количество A

строка 7 имеет категорию B.
строка 8 имеет подкатегорию B1
строка 9 имеет подкатегорию B2
строка 10 имеет подкатегорию B3
строка 11 имеет общее количество B

Диаграмма должна содержать названия категорий A и B, а также Total of A и B. Так что я предполагаю, что тогда это не сработает на листах Google?

...