#java #excel #apache-poi #excel-charts
Вопрос:
я использую версию apache poi 5.0.0. Я создал график в Excel, используя данные, и я могу видеть легенды в нижней части графика. Здесь показано шесть легенд. Теперь я хочу удалить две конкретные легенды, не удаляя их с графика.
Похоже, в XDDFChartLegend нет доступных функций, которые действительно работают. скажем, например
XDDFChartLegend legend = chart.getOrAddLegend();
legend.getEntries().remove(4);
не работает
Любая помощь будет признательна.
Ответ №1:
Запись легенды диаграммы не может быть удалена. Его можно только пометить удаленным, поэтому он не будет отображаться.
XDDFLegendEntry предоставляет метод setDelete
для этого. Но проблема в том, как ее получить XDDFLegendEntry
.
XDDFChart.getOrAddLegend
добавляет только пустой маркер легенды, который использует значения по умолчанию для отображения легенды. По умолчанию в легендах нет записей, так как они необходимы только для установки специальных свойств, которые не являются стандартными. Поэтому нам понадобится что-то вроде XDDFChartLegend.getOrAddLegendEntry
того, чтобы получить или добавить запись легенды. Этого не существует до сих пор.
Следующий метод возвращает или добавляет запись легенды к заданному XDDFChartLegend
для данного индекса.
XDDFLegendEntry getOrAddLegendEntry(XDDFChartLegend legend, long index) {
XDDFLegendEntry legendEntry = null;
for (XDDFLegendEntry storedLegendEntry : legend.getEntries()) {
if (storedLegendEntry.getIndex() == index) {
legendEntry = storedLegendEntry;
break;
}
}
if (legendEntry == null) {
legendEntry = legend.addEntry();
legendEntry.setIndex(index);
}
return legendEntry;
}
Обратите внимание, что я не использую XDDFChartLegend.getEntry, так как это возвращает запись в позиции index
, а не запись с индексом index
. Но нам нужна запись с индексом index
. Поэтому я перебираю все записи и проверяю, есть ли уже одна с индексом.
Использование для пометки записи легенды как удаленной может быть таким:
...
XDDFChartLegend legend = chart.getOrAddLegend();
//...
XDDFLegendEntry legendEntry = getOrAddLegendEntry(legend, 4);
legendEntry.setDelete(true);
...
Комментарии:
1. Идеальный ответ!!
2. @Каннан Сундарарадж: Пожалуйста, обратите внимание на мою правку.