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

Поскольку это главный результат в Google, я опубликую здесь после того, как не смог найти решение для своей проблемы. Если вы хотите отформатировать отображаемое значение объекта float и оставить его float, а не строку, вы можете использовать это решение:

Создать новый класс, который изменяет способ отображения значений float .

from builtins import float
class FormattedFloat(float):

    def __str__(self):
        return "{:.10f}".format(self).rstrip('0')

Вы можете изменить точность самостоятельно, изменив целочисленные значения в {:f}

0
задан Dubas 14 May 2019 в 06:07
поделиться

1 ответ

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

Но, конечно, если нужно изменить XML, нужно знать о том, что такое XML. Можно прочитать документацию Microsoft, начиная с 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");
...
0
ответ дан Axel Richter 14 May 2019 в 06:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: