Как уже говорилось в вопросе, это связано с Как изменить графические атрибуты точки в диаграмме солнечных лучей 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");
...