Как изменить метки, шрифты и другие элементы различных XDDFChartAxis в Apache POI 4.0 / 4.0.1? - PullRequest
0 голосов
/ 19 марта 2019

Мне удалось добавить несколько серий к одному XDDFChart из этого ответа .Сейчас я пытаюсь применить форматирование к самой оси, чтобы конечный продукт диаграммы выглядел хорошо.Я прошел через некоторую разметку , но не смог понять ее правильно с помощью объектов XDDF и CT

Вопрос В XDDFChart и XDDFAxis,как мы можем изменить

  • Размер шрифта и семейство шрифтов?
  • Расстояние между метками и направление / угол?

Шрифты на заголовке показывает нам, как мы можем изменять шрифты и размеры заголовка, однако тот же процесс не работает для Axis.Это немного другой объект, поэтому я не смог его воспроизвести.Я выбираю CatAxArray, поскольку я думал, что это были оси категорий, использованные в коде в конце вопроса

chart.getCTChart().getPlotArea().getCatAxArray(0).getTxPr().getPArray(0).getRArray(0).getRPr().setSz(11);
chart.getCTChart().getPlotArea().getCatAxArray(0).getTxPr().getPArray(0).getRArray(0).getRPr().addNewLatin().setTypeface("Times New Roman");
chart.getCTChart().getPlotArea().getCatAxArray(0).getTxPr().getPArray(0).getRArray(0).getRPr().addNewCs().setTypeface("Times New Roman");

Текущий результат: Диаграмма с 2 сериями по 2 осям с минимальным форматированием - см. Связанную SO

Желаемый результат: Измененные оси на графике

Этот график имеет следующие эффекты

  1. Нижние оси выделены жирным шрифтом
  2. Нижние оси в Times New Roman
  3. Нижние оси имеют размер шрифта 11
  4. Нижние оси имеют интервал меток = 2 (по умолчанию 1)
  5. Направление текста нижней оси - «Повернуть»Весь текст 270 "(по умолчанию установлено значение Горизонтально)
  6. * В качестве бонуса возможно ли перейти к позиции текстового поля и легенды к желаемой позиции, например, вверху слева?У этого также есть немного расширенная область графика

Используемый код может быть идентичен этому:

import java.io.*;

import org.apache.poi.xwpf.usermodel.*;

import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.util.Units;

import org.apache.poi.xddf.usermodel.*;
import org.apache.poi.xddf.usermodel.chart.*;

public class CreateWordXDDFChart {

 public static void main(String[] args) throws Exception {
  try (XWPFDocument document = new XWPFDocument()) {

   // create the data
   String[] categories = new String[]{"1","2","3","4","5","6","7","8","9"};
   Double[] values1 = new Double[]{1d,2d,3d,4d,5d,6d,7d,8d,9d};
   Double[] values2 = new Double[]{200d,300d,400d,500d,600d,700d,800d,900d,1000d};

   // create the chart
   XWPFChart chart = document.createChart(15*Units.EMU_PER_CENTIMETER, 10*Units.EMU_PER_CENTIMETER);

   // create data sources
   int numOfPoints = categories.length;
   String categoryDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 0, 0));
   String valuesDataRange1 = chart.formatRange(new CellRangeAddress(1, numOfPoints, 1, 1));
   String valuesDataRange2 = chart.formatRange(new CellRangeAddress(1, numOfPoints, 2, 2));
   XDDFDataSource<String> categoriesData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange, 0);
   XDDFNumericalDataSource<Double> valuesData1 = XDDFDataSourcesFactory.fromArray(values1, valuesDataRange1, 1);
   XDDFNumericalDataSource<Double> valuesData2 = XDDFDataSourcesFactory.fromArray(values2, valuesDataRange2, 2);

   // first line chart
   XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
   XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
   leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
   XDDFChartData data = chart.createData(ChartTypes.LINE, bottomAxis, leftAxis);
   XDDFChartData.Series series = data.addSeries(categoriesData, valuesData1);
   chart.plot(data);

   solidLineSeries(data, 0, PresetColor.BLUE);

   // second line chart
   // bottom axis must be there but must not be visible
   bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
   bottomAxis.setVisible(false);

   XDDFValueAxis rightAxis = chart.createValueAxis(AxisPosition.RIGHT);
   rightAxis.setCrosses(AxisCrosses.MAX);

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

   data = chart.createData(ChartTypes.LINE, bottomAxis, rightAxis);
   series = data.addSeries(categoriesData, valuesData2);
   chart.plot(data);

   // correct the id and order, must not be 0 again because there is one line series already
   chart.getCTChart().getPlotArea().getLineChartArray(1).getSerArray(0).getIdx().setVal(1);
   chart.getCTChart().getPlotArea().getLineChartArray(1).getSerArray(0).getOrder().setVal(1);

   solidLineSeries(data, 0, PresetColor.RED);

   // Write the output to a file
   try (FileOutputStream fileOut = new FileOutputStream("CreateWordXDDFChart.docx")) {
    document.write(fileOut);
   }
  }
 }

 private static void solidLineSeries(XDDFChartData data, int index, PresetColor color) {
  XDDFSolidFillProperties fill = new XDDFSolidFillProperties(XDDFColor.from(color));
  XDDFLineProperties line = new XDDFLineProperties();
  line.setFillProperties(fill);
  XDDFChartData.Series series = data.getSeries().get(index);
  XDDFShapeProperties properties = series.getShapeProperties();
  if (properties == null) {
   properties = new XDDFShapeProperties();
  }
  properties.setLineProperties(line);
  series.setShapeProperties(properties);
 }
}

Обновление 1 Вам необходимо добавить объекты передможет изменить их!Некоторые функции XDDF инициализируют, но не все части объекта:

Нижние оси имеют интервал меток = 2 (по умолчанию 1)

chart.getCTChart().getPlotArea().getCatAxArray(0).addNewTickLblSkip().setVal(2);

Обновление 2 Я думаю, что японял это --- я обновлю с ответом позже сегодня

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...