Как установить текстовые атрибуты отдельных меток данных в диаграмме солнечных лучей Excel через Apache POI? - PullRequest
0 голосов
/ 04 марта 2019

В этой записи было предоставлено решение для установки графических атрибутов точек данных.

Теперь мне нужно получить доступ к отдельным меткам точек данных и изменить текстовые атрибуты.Моим приоритетом является настройка размера шрифта, однако, возможность настроить другие атрибуты (например, шрифт, полужирный, курсив, выравнивание и т. Д.) Также будет полезна.Этот метод устанавливает цвет заливки точки данных.Что необходимо добавить, чтобы установить размер шрифта метки данных для этой точки данных?

private static void setDataPointColor(XmlObject series, int number, String colorHex) {
    XmlCursor cursor = series.newCursor();
    cursor.toLastChild();
    cursor.beginElement(new QName("http://schemas.microsoft.com/office/drawing/2014/chartex", "dataPt", "cx"));
    cursor.insertAttributeWithValue("idx", "" + number);
    cursor.beginElement(new QName("http://schemas.microsoft.com/office/drawing/2014/chartex", "spPr", "cx"));
    cursor.beginElement(new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "solidFill", "a"));
    cursor.beginElement(new  Name("http://schemas.openxmlformats.org/drawingml/2006/main", "srgbClr", "a"));
    cursor.insertAttributeWithValue("val", colorHex);

    cursor.dispose();
}

1 Ответ

0 голосов
/ 04 марта 2019

Как уже говорилось в вопросе, это связано с Как изменить графические атрибуты точки в диаграмме солнечных лучей Excel с помощью Apache POI .В моем ответе уже говорилось, что диаграмма солнечных лучей имеет тип application/vnd.ms-office.chartex+xml и поэтому не может быть XSSFChart, поскольку она имеет тип application/vnd.openxmlformats-officedocument.drawingml.chart+xml.Мой ответ там также предоставляет метод для получения XML диаграммы солнечных лучей в режиме чтения и записи.

Но, конечно, если нужно изменить XML, нужно знать о том, что такое XML.Можно прочитать документацию Microsoft s, начиная с 2.24.3.11 CT_ChartSpace .Но мой подход заключается в следующем:

Файл *.xlsx - это не что иное, как архив ZIP.Поэтому я создаю простую диаграмму солнечных лучей, используя Excel, и сохраняю ее в файле *.xlsx.Затем я распаковываю этот файл *.xlsx и смотрю на /xl/charts/chartEx1.xml.Там я вижу XML использованный.Теперь я делаю дополнительное форматирование диаграммы солнечных лучей, используя Excel, сохраняю и смотрю, как изменилось XML в /xl/charts/chartEx1.xml.Таким образом, я могу определить значение использованного XML.

. Используя этот подход, я прихожу к выводу, что каждая отдельная метка данных может быть отформатирована с использованием <cx:dataLabel idx="0">, где idx совпадает сточка данных idx.Форматирование выполняется в <cx:txPr>, который содержит параграф <a:p> и текстовый прогон <a:r>, который затем форматируется.

Зная это, мы приходим к следующему методу:

...
 private static void setDataLabelFontSettings(XmlObject series, int number,
  int fontSizePt, boolean b, boolean i, String u, String strike, String typeface, String colorHex) {

  XmlObject[] xmlObjects = series.selectPath(
   "declare namespace cx='http://schemas.microsoft.com/office/drawing/2014/chartex' " +
   ".//cx:dataLabels");
  if (xmlObjects.length == 1) {
   XmlObject dataLabels = xmlObjects[0];
   XmlCursor cursor = dataLabels.newCursor();
   cursor.toLastChild();
   cursor.beginElement(new QName("http://schemas.microsoft.com/office/drawing/2014/chartex", "dataLabel", "cx"));
   cursor.insertAttributeWithValue("idx", "" + number);

   cursor.beginElement(new QName("http://schemas.microsoft.com/office/drawing/2014/chartex", "txPr", "cx"));

   cursor.beginElement(new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "p", "a"));

   cursor.beginElement(new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "r", "a"));

   cursor.beginElement(new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "t", "a"));
   cursor.toParent();
   cursor.setTextValue("dummy");

   cursor.beginElement(new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "rPr", "a"));
   cursor.insertAttributeWithValue("sz", "" + (fontSizePt * 100));
   cursor.insertAttributeWithValue("b", ((b)?"1":"0"));
   cursor.insertAttributeWithValue("i", ((i)?"1":"0"));
   cursor.insertAttributeWithValue("u", u);
   cursor.insertAttributeWithValue("strike", strike);
   cursor.beginElement(new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "latin", "a"));
   cursor.insertAttributeWithValue("typeface", typeface);
   cursor.toParent();
   cursor.beginElement(new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "solidFill", "a"));
   cursor.beginElement(new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "srgbClr", "a"));
   cursor.insertAttributeWithValue("val", colorHex);

   cursor.toParent();
   cursor.toParent();
   cursor.toParent();
   cursor.toParent();
   cursor.toParent();
   cursor.beginElement(new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "bodyPr", "a"));

   cursor.dispose();
  }
 }
...

, которыйможет быть использован в моем коде в соответствующей Q / A, связанной выше, следующим образом:

...
      //setDataLabelFontSettings(XmlObject series, int number, int fontSizePt, boolean b, boolean i, 
      // String u, String strike, String typeface, String colorHex)
      setDataLabelFontSettings(series, 0, 14, false, true, "sng", "noStrike", "Calibri", "FFFFFF");
      setDataLabelFontSettings(series, 4, 12, false, true, "none", "sngStrike", "Calibri", "FFFFFF");
      setDataLabelFontSettings(series, 5, 8, false, true, "dbl", "noStrike", "Calibri", "FFFFFF");
      setDataLabelFontSettings(series, 6, 8, false, true, "none", "dblStrike", "Calibri", "FFFFFF");
...
...