Dear Aspose Support Team
The attached .xlsx file was created with Aspose Cells for Java (version 20.6.3).
LabelPositioning.zip (7.7 KB)
When using the below code snippet to retrieve the x-coordinates of the data labels, it returns 0 in all three cases. How can I retrieve the correct x-coordinates of the data labels?
Chart chart = worksheet.getCharts().get(0);
Series series = chart.getNSeries().get(0);
ChartPointCollection points = series.getPoints();
for (int i = 0; i < points.getCount(); i++) {
ChartPoint point = points.get(i);
int x = point.getDataLabels().getX();
System.out.println(x);
}
Thank you for your support.
@awepler,
Please call Chart.calculate() before retrieving series point labels. See the updated sample code for your reference:
e.g
Sample code:
Chart chart = worksheet.getCharts().get(0);
chart.calculate();
Series series = chart.getNSeries().get(0);
ChartPointCollection points = series.getPoints();
for (int i = 0; i < points.getCount(); i++) {
ChartPoint point = points.get(i);
int x = point.getDataLabels().getX();
System.out.println(x);
}
Hope, this helps a bit.
It helped a bit, thank you. I am now able to retrieve the initial x-coordinates.
Now (extending the above example) I would like to change the position of the data labels from OUTSIDE_END to INSIDE_BASE. After that I recalculate the chart and write out the x-coordinates again. I get the same values as before. How can I retrieve the new x-coordinates of the data labels?
Chart chart = worksheet.getCharts().get(0);
chart.calculate();
Series series = chart.getNSeries().get(0);
ChartPointCollection points = series.getPoints();
for (int i = 0; i < points.getCount(); i++) {
ChartPoint point = points.get(i);
int x = point.getDataLabels().getX();
System.out.println(x);
}
// change position
series.getDataLabels().setPosition(LabelPositionType.INSIDE_BASE);
chart.calculate();
series = chart.getNSeries().get(0);
points = series.getPoints();
for (int i = 0; i < points.getCount(); i++) {
ChartPoint point = points.get(i);
int x = point.getDataLabels().getX();
System.out.println(x);
}
@awepler,
See the updated sample code, it will work for your needs:
e.g
Sample code:
.......
Chart chart = worksheet.getCharts().get(0);
chart.calculate();
Series series = chart.getNSeries().get(0);
ChartPointCollection points = series.getPoints();
for (int i = 0; i < points.getCount(); i++) {
ChartPoint point = points.get(i);
int x = point.getDataLabels().getX();
System.out.println(x);
// change position
point.getDataLabels().setPosition(LabelPositionType.INSIDE_BASE);
}
chart.calculate();
series = chart.getNSeries().get(0);
points = series.getPoints();
for (int i = 0; i < points.getCount(); i++) {
ChartPoint point = points.get(i);
int x = point.getDataLabels().getX();
System.out.println(x);
}
......
Hope, this helps a bit.
Thank you for your fast reply. This again helped a bit ;-).
Now (extending the example one step further) I would like to explicitly set the x-coordinate of the data label for the topmost bar. Doing this seems to affect the y-coordinate as well. Please find attached LabelPositioningOut.xlsx where the data category label (Abcd) and the data label (-4%) for the topmost bar are no longer properly aligned (LabelPositioningOut.zip (7.9 KB)). How can I keep them aligned?
Chart chart = worksheet.getCharts().get(0);
chart.calculate();
Series series = chart.getNSeries().get(0);
ChartPointCollection points = series.getPoints();
for (int i = 0; i < points.getCount(); i++) {
ChartPoint point = points.get(i);
int x = point.getDataLabels().getX();
System.out.println(x);
point.getDataLabels().setPosition(LabelPositionType.INSIDE_BASE);
}
// change position
chart.calculate();
series = chart.getNSeries().get(0);
points = series.getPoints();
int max = 0;
for (int i = 0; i < points.getCount(); i++) {
ChartPoint point = points.get(i);
int x = point.getDataLabels().getX();
System.out.println(x);
if (x > max) max = x;
point.getDataLabels().setPosition(LabelPositionType.OUTSIDE_END);
}
// adjust x-coordinate of label for topmost bar
chart.calculate();
chart.getNSeries().get(0).getPoints().get(2).getDataLabels().setX(max);
workbook.save("src\\support\\labelpositioning\\LabelPositioningOut.xlsx");
@awepler,
I checked DataLabels.getY() does not give correct value, so you need to adjust it a bit. See the sample code for your rererence:
e.g
Sample code:
int delta = 70;
int pY = chart.getNSeries().get(0).getPoints().get(2).getDataLabels().getY() + delta;
//adjust x-coordinate and y-coordinate of label for topmost bar
chart.calculate();
chart.getNSeries().get(0).getPoints().get(2).getDataLabels().setX(max);
chart.getNSeries().get(0).getPoints().get(2).getDataLabels().setY(pY);
Thank you for your feedback.
Will the delta always be 70? We have a generic framework, that should be able to create different kinds of charts depending on input. The above chart is just one specific example. Hence, adapting the y-coordinate by a fixed delta seems not a very good solution for us. Is the wrong y-coordinate something you plan to fix in one of your next releases?
@awepler,
No, setting delta value “70” won’t work for every case. As we already found the issue you described by using your sample code with your template file, so I have logged an investigation ticket with an id “CELLSJAVA-43247” for your issue. Hopefully, either we will devise a generic way (we may share a code segment) or fix the issue (internally).
Once we have an update on it, we will let you know.