如何通过Apache POI在Excel Sunburst Chart中设置各个数据标签的文本属性?

时间:2019-03-03 21:44:06

标签: java excel charts apache-poi

在此post中,提供了一种解决方案来设置数据点的图形属性。

我现在需要访问各个数据点标签并更改文本属性。我的首要任务是调整字体大小,但是,也可以使用调整其他属性(例如,字体,粗体,斜体,对齐方式等)的功能。此方法设置数据点填充颜色。要为该数据点设置数据标签的字体大小需要添加什么内容?

cygwin1.dll

1 个答案:

答案 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");
...