package org.devgateway.toolkit.web.excelcharts.data; import org.apache.poi.ss.usermodel.Chart; import org.apache.poi.ss.usermodel.charts.ChartAxis; import org.apache.poi.ss.usermodel.charts.ChartDataSource; import org.apache.poi.xssf.usermodel.XSSFChart; import org.apache.xmlbeans.XmlObject; import org.devgateway.toolkit.web.excelcharts.CustomChartSeries; import org.devgateway.toolkit.web.excelcharts.util.XSSFChartUtil; import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource; import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource; import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieChart; import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieSer; import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea; /** * @author idobre * @since 8/8/16 * * Holds data for a XSSF Pie Chart. */ public class XSSFPieChartData extends AbstractXSSFChartData { public XSSFPieChartData(final String title) { super(title); } @Override protected CustomChartSeries createNewSerie(final int id, final int order, final ChartDataSource<?> categories, final ChartDataSource<? extends Number> values) { return new AbstractSeries(id, order, categories, values) { @Override public void addToChart(final XmlObject ctChart) { final CTPieChart ctPieChart = (CTPieChart) ctChart; final CTPieSer ctPieSer = ctPieChart.addNewSer(); ctPieSer.addNewIdx().setVal(this.id); ctPieSer.addNewOrder().setVal(this.order); final CTAxDataSource catDS = ctPieSer.addNewCat(); XSSFChartUtil.buildAxDataSource(catDS, this.categories); final CTNumDataSource valueDS = ctPieSer.addNewVal(); XSSFChartUtil.buildNumDataSource(valueDS, this.values); if (isTitleSet()) { ctPieSer.setTx(getCTSerTx()); } } }; } @Override public void fillChart(final Chart chart, final ChartAxis... axis) { if (!(chart instanceof XSSFChart)) { throw new IllegalArgumentException("Chart must be instance of XSSFChart"); } final XSSFChart xssfChart = (XSSFChart) chart; final CTPlotArea plotArea = xssfChart.getCTChart().getPlotArea(); final CTPieChart pieChart = plotArea.addNewPieChart(); pieChart.addNewVaryColors().setVal(true); xssfChart.setTitle(this.title); for (CustomChartSeries s : series) { s.addToChart(pieChart); } } }