在此post中,提供了一种解决方案来设置数据点的图形属性。
我现在需要访问各个数据点标签并更改文本属性。我的首要任务是调整字体大小,但是,也可以使用调整其他属性(例如,字体,粗体,斜体,对齐方式等)的功能。此方法设置数据点填充颜色。要为该数据点设置数据标签的字体大小需要添加什么内容?
cygwin1.dll
答案 0 :(得分:1)
正如已经在问题中告诉的那样,这与How to change the graphical attributes of a point in an Excel sunburst chart through Apache POI有关。在我的回答中已经告知朝阳图的类型为application/vnd.ms-office.chartex+xml
,因此不能为XSSFChart
,因为它的类型为application/vnd.openxmlformats-officedocument.drawingml.chart+xml
。我在那里的答案还提供了一种在读写模式下获取朝阳图的XML
的方法。
但是,当然,如果需要更改XML
,则必须知道XML
的含义。可以阅读2.24.3.11 CT_ChartSpace开始的Microsoft
的文档。但是我的方法如下:
*.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");
...