git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1870604 13f79535-47bb-0310-9956-ffa450edef68tags/REL_4_1_2
final XDDFBarChartData bar = (XDDFBarChartData) data.get(0); | final XDDFBarChartData bar = (XDDFBarChartData) data.get(0); | ||||
final int numOfPoints = categories.length; | final int numOfPoints = categories.length; | ||||
final String categoryDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 0, 0)); | |||||
final String valuesDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 1, 1)); | |||||
final String valuesDataRange2 = chart.formatRange(new CellRangeAddress(1, numOfPoints, 2, 2)); | |||||
final XDDFDataSource<?> categoriesData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange, 0); | |||||
final XDDFNumericalDataSource<? extends Number> valuesData = XDDFDataSourcesFactory.fromArray(values1, valuesDataRange, 1); | |||||
final String categoryDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, columnLanguages, columnLanguages)); | |||||
final String valuesDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, columnCountries, columnCountries)); | |||||
final String valuesDataRange2 = chart.formatRange(new CellRangeAddress(1, numOfPoints, columnSpeakers, columnSpeakers)); | |||||
final XDDFDataSource<?> categoriesData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange, columnLanguages); | |||||
final XDDFNumericalDataSource<? extends Number> valuesData = XDDFDataSourcesFactory.fromArray(values1, valuesDataRange, columnCountries); | |||||
values1[6] = 16.0; // if you ever want to change the underlying data | values1[6] = 16.0; // if you ever want to change the underlying data | ||||
final XDDFNumericalDataSource<? extends Number> valuesData2 = XDDFDataSourcesFactory.fromArray(values2, valuesDataRange2, 2); | |||||
final XDDFNumericalDataSource<? extends Number> valuesData2 = XDDFDataSourcesFactory.fromArray(values2, valuesDataRange2, columnSpeakers); | |||||
XDDFChartData.Series series1 = bar.getSeries(0); | XDDFChartData.Series series1 = bar.getSeries(0); | ||||
series1.replaceData(categoriesData, valuesData); | series1.replaceData(categoriesData, valuesData); | ||||
series1.setTitle(series[0], chart.setSheetTitle(series[0], 0)); | |||||
series1.setTitle(series[0], chart.setSheetTitle(series[0], columnCountries)); | |||||
XDDFChartData.Series series2 = bar.addSeries(categoriesData, valuesData2); | XDDFChartData.Series series2 = bar.addSeries(categoriesData, valuesData2); | ||||
series2.setTitle(series[1], chart.setSheetTitle(series[1], 1)); | |||||
series2.setTitle(series[1], chart.setSheetTitle(series[1], columnSpeakers)); | |||||
chart.plot(bar); | chart.plot(bar); | ||||
chart.setTitleText(chartTitle); // https://stackoverflow.com/questions/30532612 | chart.setTitleText(chartTitle); // https://stackoverflow.com/questions/30532612 | ||||
// chart.setTitleOverlay(overlay); | // chart.setTitleOverlay(overlay); | ||||
// adjust font size for readability | |||||
bar.getCategoryAxis().getOrAddTextProperties().setFontSize(11.5); | |||||
chart.getTitle().getOrAddTextProperties().setFontSize(18.2); | |||||
} | } | ||||
private static void setColumnData(XSLFChart chart, String chartTitle) { | private static void setColumnData(XSLFChart chart, String chartTitle) { | ||||
} | } | ||||
return chart; | return chart; | ||||
} | } | ||||
private static final int columnLanguages = 0; | |||||
private static final int columnCountries = 1; | |||||
private static final int columnSpeakers = 2; | |||||
} | } |
slide.addChart(chart, rect2D); | slide.addChart(chart, rect2D); | ||||
setBarData(chart, chartTitle, series, categories, values1, values2); | setBarData(chart, chartTitle, series, categories, values1, values2); | ||||
// save the result | // save the result | ||||
try (OutputStream out = new FileOutputStream("bar-chart-demo-output.pptx")) { | |||||
try (OutputStream out = new FileOutputStream("chart-from-scratch.pptx")) { | |||||
ppt.write(out); | ppt.write(out); | ||||
} | } | ||||
} | } | ||||
leftAxis.setCrosses(AxisCrosses.AUTO_ZERO); | leftAxis.setCrosses(AxisCrosses.AUTO_ZERO); | ||||
final int numOfPoints = categories.length; | final int numOfPoints = categories.length; | ||||
final String categoryDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 0, 0)); | |||||
final String valuesDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 1, 1)); | |||||
final String valuesDataRange2 = chart.formatRange(new CellRangeAddress(1, numOfPoints, 2, 2)); | |||||
final XDDFDataSource<?> categoriesData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange, 0); | |||||
final XDDFNumericalDataSource<? extends Number> valuesData = XDDFDataSourcesFactory.fromArray(values1, valuesDataRange, 1); | |||||
final String categoryDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, columnLanguages, columnLanguages)); | |||||
final String valuesDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, columnCountries, columnCountries)); | |||||
final String valuesDataRange2 = chart.formatRange(new CellRangeAddress(1, numOfPoints, columnSpeakers, columnSpeakers)); | |||||
final XDDFDataSource<?> categoriesData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange, columnLanguages); | |||||
final XDDFNumericalDataSource<? extends Number> valuesData = XDDFDataSourcesFactory.fromArray(values1, valuesDataRange, columnCountries); | |||||
values1[6] = 16.0; // if you ever want to change the underlying data | values1[6] = 16.0; // if you ever want to change the underlying data | ||||
final XDDFNumericalDataSource<? extends Number> valuesData2 = XDDFDataSourcesFactory.fromArray(values2, valuesDataRange2, 2); | |||||
final XDDFNumericalDataSource<? extends Number> valuesData2 = XDDFDataSourcesFactory.fromArray(values2, valuesDataRange2, columnSpeakers); | |||||
XDDFBarChartData bar = (XDDFBarChartData) chart.createData(ChartTypes.BAR, bottomAxis, leftAxis); | XDDFBarChartData bar = (XDDFBarChartData) chart.createData(ChartTypes.BAR, bottomAxis, leftAxis); | ||||
XDDFBarChartData.Series series1 = (XDDFBarChartData.Series) bar.addSeries(categoriesData, valuesData); | XDDFBarChartData.Series series1 = (XDDFBarChartData.Series) bar.addSeries(categoriesData, valuesData); | ||||
series1.setTitle(series[0], chart.setSheetTitle(series[0], 1)); | |||||
series1.setTitle(series[0], chart.setSheetTitle(series[0], columnCountries)); | |||||
XDDFBarChartData.Series series2 = (XDDFBarChartData.Series) bar.addSeries(categoriesData, valuesData2); | XDDFBarChartData.Series series2 = (XDDFBarChartData.Series) bar.addSeries(categoriesData, valuesData2); | ||||
series2.setTitle(series[1], chart.setSheetTitle(series[1], 2)); | |||||
series2.setTitle(series[1], chart.setSheetTitle(series[1], columnSpeakers)); | |||||
bar.setVaryColors(true); | bar.setVaryColors(true); | ||||
bar.setBarDirection(BarDirection.COL); | bar.setBarDirection(BarDirection.COL); | ||||
chart.setTitleText(chartTitle); | chart.setTitleText(chartTitle); | ||||
chart.setTitleOverlay(false); | chart.setTitleOverlay(false); | ||||
} | } | ||||
private static final int columnLanguages = 0; | |||||
private static final int columnCountries = 1; | |||||
private static final int columnSpeakers = 2; | |||||
} | } | ||||
import org.apache.poi.xssf.usermodel.XSSFCell; | import org.apache.poi.xssf.usermodel.XSSFCell; | ||||
import org.apache.poi.xssf.usermodel.XSSFRow; | import org.apache.poi.xssf.usermodel.XSSFRow; | ||||
import org.apache.poi.xssf.usermodel.XSSFSheet; | import org.apache.poi.xssf.usermodel.XSSFSheet; | ||||
import org.apache.poi.xssf.usermodel.XSSFTable; | |||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook; | import org.apache.poi.xssf.usermodel.XSSFWorkbook; | ||||
import org.apache.xmlbeans.XmlException; | import org.apache.xmlbeans.XmlException; | ||||
import org.apache.xmlbeans.XmlOptions; | import org.apache.xmlbeans.XmlOptions; | ||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties; | import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties; | ||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties; | import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties; | ||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties; | import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties; | ||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTable; | |||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableColumn; | |||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableColumns; | |||||
@Beta | @Beta | ||||
public abstract class XDDFChart extends POIXMLDocumentPart implements TextContainer { | public abstract class XDDFChart extends POIXMLDocumentPart implements TextContainer { | ||||
series.add(new XDDFSurface3DChartData(this, surfaceChart, categories, values)); | series.add(new XDDFSurface3DChartData(this, surfaceChart, categories, values)); | ||||
} | } | ||||
// TODO repeat above code for missing charts: Bubble, Doughnut, OfPie and Stock | // TODO repeat above code for missing charts: Bubble, Doughnut, OfPie and Stock | ||||
seriesCount = series.size(); | |||||
return series; | return series; | ||||
} | } | ||||
XDDFChartAxis axis = axes.get(0); | XDDFChartAxis axis = axes.get(0); | ||||
axis.crossAxis(valueAxis); | axis.crossAxis(valueAxis); | ||||
valueAxis.crossAxis(axis); | valueAxis.crossAxis(axis); | ||||
axis.setCrosses(AxisCrosses.AUTO_ZERO); | |||||
valueAxis.setCrosses(AxisCrosses.AUTO_ZERO); | |||||
} | } | ||||
axes.add(valueAxis); | axes.add(valueAxis); | ||||
return valueAxis; | return valueAxis; | ||||
XDDFChartAxis axis = axes.get(0); | XDDFChartAxis axis = axes.get(0); | ||||
axis.crossAxis(seriesAxis); | axis.crossAxis(seriesAxis); | ||||
seriesAxis.crossAxis(axis); | seriesAxis.crossAxis(axis); | ||||
axis.setCrosses(AxisCrosses.AUTO_ZERO); | |||||
seriesAxis.setCrosses(AxisCrosses.AUTO_ZERO); | |||||
} | } | ||||
axes.add(seriesAxis); | axes.add(seriesAxis); | ||||
return seriesAxis; | return seriesAxis; | ||||
XDDFChartAxis axis = axes.get(0); | XDDFChartAxis axis = axes.get(0); | ||||
axis.crossAxis(categoryAxis); | axis.crossAxis(categoryAxis); | ||||
categoryAxis.crossAxis(axis); | categoryAxis.crossAxis(axis); | ||||
axis.setCrosses(AxisCrosses.AUTO_ZERO); | |||||
categoryAxis.setCrosses(AxisCrosses.AUTO_ZERO); | |||||
} | } | ||||
axes.add(categoryAxis); | axes.add(categoryAxis); | ||||
return categoryAxis; | return categoryAxis; | ||||
XDDFChartAxis axis = axes.get(0); | XDDFChartAxis axis = axes.get(0); | ||||
axis.crossAxis(dateAxis); | axis.crossAxis(dateAxis); | ||||
dateAxis.crossAxis(axis); | dateAxis.crossAxis(axis); | ||||
axis.setCrosses(AxisCrosses.AUTO_ZERO); | |||||
dateAxis.setCrosses(AxisCrosses.AUTO_ZERO); | |||||
} | } | ||||
axes.add(dateAxis); | axes.add(dateAxis); | ||||
return dateAxis; | return dateAxis; | ||||
XSSFCell cell = this.getCell(row, column); | XSSFCell cell = this.getCell(row, column); | ||||
cell.setCellValue(title); | cell.setCellValue(title); | ||||
CTTable ctTable = this.getSheetTable(sheet); | |||||
this.updateSheetTable(ctTable, title, column); | |||||
return new CellReference(sheet.getSheetName(), 0, column, true, true); | return new CellReference(sheet.getSheetName(), 0, column, true, true); | ||||
} | } | ||||
/** | |||||
* this method will check whether sheet have table | |||||
* in case table size zero then create new table and add table columns element | |||||
* @param sheet | |||||
* @return table object | |||||
*/ | |||||
private CTTable getSheetTable(XSSFSheet sheet) { | |||||
if(sheet.getTables().size() == 0) | |||||
{ | |||||
XSSFTable newTable = sheet.createTable(null); | |||||
newTable.getCTTable().addNewTableColumns(); | |||||
sheet.getTables().add(newTable); | |||||
} | |||||
return sheet.getTables().get(0).getCTTable(); | |||||
} | |||||
/** | |||||
* this method update column header of sheet into table | |||||
* | |||||
* @param ctTable | |||||
* xssf table object | |||||
* @param title | |||||
* title of column | |||||
* @param index | |||||
* index of column | |||||
*/ | |||||
private void updateSheetTable(CTTable ctTable, String title, int index) { | |||||
CTTableColumns tableColumnList = ctTable.getTableColumns(); | |||||
CTTableColumn column = null; | |||||
int columnCount = tableColumnList.getTableColumnList().size()-1; | |||||
for( int i = columnCount; i < index; i++) { | |||||
column = tableColumnList.addNewTableColumn(); | |||||
column.setId(i); | |||||
} | |||||
column = tableColumnList.getTableColumnArray(index); | |||||
column.setName(title); | |||||
} | |||||
/** | /** | ||||
* @param range | * @param range | ||||
* @return | * @return |
import org.apache.poi.util.Beta; | import org.apache.poi.util.Beta; | ||||
import org.apache.poi.xddf.usermodel.text.TextContainer; | import org.apache.poi.xddf.usermodel.text.TextContainer; | ||||
import org.apache.poi.xddf.usermodel.text.XDDFRunProperties; | |||||
import org.apache.poi.xddf.usermodel.text.XDDFTextBody; | import org.apache.poi.xddf.usermodel.text.XDDFTextBody; | ||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTTitle; | import org.openxmlformats.schemas.drawingml.x2006.chart.CTTitle; | ||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTTx; | import org.openxmlformats.schemas.drawingml.x2006.chart.CTTx; | ||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody; | |||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties; | |||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph; | |||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties; | |||||
/** | /** | ||||
* @since 4.0.1 | * @since 4.0.1 | ||||
} | } | ||||
} | } | ||||
/** | |||||
* @since POI 4.1.2 | |||||
*/ | |||||
public XDDFRunProperties getOrAddTextProperties() { | |||||
CTTextBody text; | |||||
if (title.isSetTxPr()) { | |||||
text = title.getTxPr(); | |||||
} else { | |||||
text = title.addNewTxPr(); | |||||
} | |||||
return new XDDFRunProperties(getOrAddTextProperties(text)); | |||||
} | |||||
private CTTextCharacterProperties getOrAddTextProperties(CTTextBody body) { | |||||
CTTextCharacterProperties properties; | |||||
if (body.getBodyPr() == null) { | |||||
body.addNewBodyPr(); | |||||
} | |||||
CTTextParagraph paragraph; | |||||
if (body.sizeOfPArray() > 0) { | |||||
paragraph = body.getPArray(0); | |||||
} else { | |||||
paragraph = body.addNewP(); | |||||
} | |||||
CTTextParagraphProperties paraprops; | |||||
if (paragraph.isSetPPr()) { | |||||
paraprops = paragraph.getPPr(); | |||||
} else { | |||||
paraprops = paragraph.addNewPPr(); | |||||
} | |||||
if (paraprops.isSetDefRPr()) { | |||||
properties = paraprops.getDefRPr(); | |||||
} else { | |||||
properties = paraprops.addNewDefRPr(); | |||||
} | |||||
return properties; | |||||
} | |||||
} | } |