XDDF usermodel for Charts closes #68 on GitHub

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1816383 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Alain Béarez 2017-11-26 14:03:01 +00:00
parent 2cda98a4aa
commit c795f2e793
110 changed files with 5726 additions and 1142 deletions

View File

@ -2051,7 +2051,7 @@ under the License.
<exclude name="resources/main/org/apache/poi/sl/draw/geom/presetShapeDefinitions.xml" /> <exclude name="resources/main/org/apache/poi/sl/draw/geom/presetShapeDefinitions.xml" />
<exclude name="resources/ooxml/org/apache/poi/xssf/usermodel/presetTableStyles.xml" /> <exclude name="resources/ooxml/org/apache/poi/xssf/usermodel/presetTableStyles.xml" />
<exclude name="ooxml/resources/org/apache/poi/xdgf/visio.xsd" /> <exclude name="ooxml/resources/org/apache/poi/xdgf/visio.xsd" />
<exclude name="examples/src/org/apache/poi/xslf/usermodel/pie-chart-data.txt" /> <exclude name="examples/src/org/apache/poi/xslf/usermodel/*-chart-data.txt" />
<exclude name="**/*.iml" /> <exclude name="**/*.iml" />
<exclude name="documentation/resources/images/pb-poi.cdr"/> <exclude name="documentation/resources/images/pb-poi.cdr"/>
<exclude name="scratchpad/models/poi-hdf.zargo"/> <exclude name="scratchpad/models/poi-hdf.zargo"/>

View File

@ -0,0 +1,145 @@
/*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
package org.apache.poi.xslf.usermodel;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xddf.usermodel.chart.AxisOrientation;
import org.apache.poi.xddf.usermodel.chart.AxisPosition;
import org.apache.poi.xddf.usermodel.chart.BarDirection;
import org.apache.poi.xddf.usermodel.chart.XDDFBarChartData;
import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
import org.apache.poi.xddf.usermodel.chart.XDDFDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory;
import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
/**
* Build a bar chart from a template pptx
*/
public class BarChartDemo {
private static void usage(){
System.out.println("Usage: BarChartDemo <bar-chart-template.pptx> <bar-chart-data.txt>");
System.out.println(" bar-chart-template.pptx template with a bar chart");
System.out.println(" bar-chart-data.txt the model to set. First line is chart title, " +
"then go pairs {axis-label value}");
}
public static void main(String[] args) throws Exception {
if(args.length < 2) {
usage();
return;
}
BufferedReader modelReader = new BufferedReader(new FileReader(args[1]));
XMLSlideShow pptx = null;
try {
String chartTitle = modelReader.readLine(); // first line is chart title
// Category Axis Data
List<String> listCategories = new ArrayList<String>(3);
// Values
List<Double> listValues = new ArrayList<Double>(3);
// set model
String ln;
while((ln = modelReader.readLine()) != null){
String[] vals = ln.split("\\s+");
listCategories.add(vals[0]);
listValues.add(Double.valueOf(vals[1]));
}
String[] categories = listCategories.toArray(new String[listCategories.size()]);
Double[] values = listValues.toArray(new Double[listValues.size()]);
pptx = new XMLSlideShow(new FileInputStream(args[0]));
XSLFSlide slide = pptx.getSlides().get(0);
setBarData(findChart(slide), chartTitle, categories, values);
XSLFChart chart = findChart(pptx.createSlide().importContent(slide));
setColumnData(chart, "Column variant");
// save the result
OutputStream out = new FileOutputStream("bar-chart-demo-output.pptx");
try {
pptx.write(out);
} finally {
out.close();
}
} finally {
if (pptx != null) {
pptx.close();
}
modelReader.close();
}
}
private static void setBarData(XSLFChart chart, String chartTitle, String[] categories, Double[] values) {
final List<XDDFChartData> series = chart.getChartSeries();
final XDDFBarChartData bar = (XDDFBarChartData) series.get(0);
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 XDDFDataSource<?> categoriesData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange);
final XDDFNumericalDataSource<? extends Number> valuesData = XDDFDataSourcesFactory.fromArray(values, valuesDataRange);
bar.getSeries().get(0).replaceData(categoriesData, valuesData);
bar.getSeries().get(0).setTitle(chartTitle, chart.setSheetTitle(chartTitle));
chart.plot(bar);
}
private static void setColumnData(XSLFChart chart, String chartTitle) {
// Series Text
List<XDDFChartData> series = chart.getChartSeries();
XDDFBarChartData bar = (XDDFBarChartData) series.get(0);
bar.getSeries().get(0).setTitle(chartTitle, chart.setSheetTitle(chartTitle));
// in order to transform a bar chart into a column chart, you just need to change the bar direction
bar.setBarDirection(BarDirection.COL);
// additionally, you can adjust the axes
bar.getCategoryAxis().setOrientation(AxisOrientation.MAX_MIN);
bar.getValueAxes().get(0).setPosition(AxisPosition.TOP);
}
private static XSLFChart findChart(XSLFSlide slide) {
// find chart in the slide
XSLFChart chart = null;
for(POIXMLDocumentPart part : slide.getRelations()){
if(part instanceof XSLFChart){
chart = (XSLFChart) part;
break;
}
}
if(chart == null) {
throw new IllegalStateException("chart not found in the template");
}
return chart;
}
}

View File

@ -19,34 +19,24 @@
package org.apache.poi.xslf.usermodel; package org.apache.poi.xslf.usermodel;
import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumData;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumVal;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieSer;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrData;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrVal;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.FileReader; import java.io.FileReader;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
import org.apache.poi.xddf.usermodel.chart.XDDFDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory;
import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFPieChartData;
/** /**
* Build a pie chart from a template pptx * Build a pie chart from a template pptx
*
* @author Yegor Kozlov
*/ */
public class PieChartDemo { public class PieChartDemo {
private static void usage(){ private static void usage(){
@ -77,74 +67,45 @@ public class PieChartDemo {
} }
} }
if (chart == null) throw new IllegalStateException("chart not found in the template"); if(chart == null) {
throw new IllegalStateException("chart not found in the template");
}
// Series Text
List<XDDFChartData> series = chart.getChartSeries();
XDDFPieChartData pie = (XDDFPieChartData) series.get(0);
// Category Axis Data
List<String> listCategories = new ArrayList<String>(3);
// Values
List<Double> listValues = new ArrayList<Double>(3);
// set model
String ln;
while((ln = modelReader.readLine()) != null){
String[] vals = ln.split("\\s+");
listCategories.add(vals[0]);
listValues.add(Double.valueOf(vals[1]));
}
String[] categories = listCategories.toArray(new String[listCategories.size()]);
Double[] values = listValues.toArray(new Double[listValues.size()]);
// embedded Excel workbook that holds the chart data final int numOfPoints = categories.length;
POIXMLDocumentPart xlsPart = chart.getRelations().get(0); final String categoryDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 0, 0));
try (XSSFWorkbook wb = new XSSFWorkbook()) { final String valuesDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 1, 1));
XSSFSheet sheet = wb.createSheet(); final XDDFDataSource<?> categoriesData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange);
final XDDFNumericalDataSource<? extends Number> valuesData = XDDFDataSourcesFactory.fromArray(values, valuesDataRange);
CTChart ctChart = chart.getCTChart(); XDDFPieChartData.Series firstSeries = (XDDFPieChartData.Series) pie.getSeries().get(0);
CTPlotArea plotArea = ctChart.getPlotArea(); firstSeries.replaceData(categoriesData, valuesData);
firstSeries.setTitle(chartTitle, chart.setSheetTitle(chartTitle));
firstSeries.setExplosion(25);
chart.plot(pie);
CTPieChart pieChart = plotArea.getPieChartArray(0); // save the result
//Pie Chart Series try (OutputStream out = new FileOutputStream("pie-chart-demo-output.pptx")) {
CTPieSer ser = pieChart.getSerArray(0); pptx.write(out);
// Series Text
CTSerTx tx = ser.getTx();
tx.getStrRef().getStrCache().getPtArray(0).setV(chartTitle);
sheet.createRow(0).createCell(1).setCellValue(chartTitle);
String titleRef = new CellReference(sheet.getSheetName(), 0, 1, true, true).formatAsString();
tx.getStrRef().setF(titleRef);
// Category Axis Data
CTAxDataSource cat = ser.getCat();
CTStrData strData = cat.getStrRef().getStrCache();
// Values
CTNumDataSource val = ser.getVal();
CTNumData numData = val.getNumRef().getNumCache();
strData.setPtArray(null); // unset old axis text
numData.setPtArray(null); // unset old values
// set model
int idx = 0;
int rownum = 1;
String ln;
while ((ln = modelReader.readLine()) != null) {
String[] vals = ln.split("\\s+");
CTNumVal numVal = numData.addNewPt();
numVal.setIdx(idx);
numVal.setV(vals[1]);
CTStrVal sVal = strData.addNewPt();
sVal.setIdx(idx);
sVal.setV(vals[0]);
idx++;
XSSFRow row = sheet.createRow(rownum++);
row.createCell(0).setCellValue(vals[0]);
row.createCell(1).setCellValue(Double.valueOf(vals[1]));
}
numData.getPtCount().setVal(idx);
strData.getPtCount().setVal(idx);
String numDataRange = new CellRangeAddress(1, rownum - 1, 1, 1).formatAsString(sheet.getSheetName(), true);
val.getNumRef().setF(numDataRange);
String axisDataRange = new CellRangeAddress(1, rownum - 1, 0, 0).formatAsString(sheet.getSheetName(), true);
cat.getStrRef().setF(axisDataRange);
// updated the embedded workbook with the data
try (OutputStream xlsOut = xlsPart.getPackagePart().getOutputStream()) {
wb.write(xlsOut);
}
// save the result
try (OutputStream out = new FileOutputStream("pie-chart-demo-output.pptx")) {
pptx.write(out);
}
} }
} }
} }

View File

@ -0,0 +1,4 @@
My Bar or Column Chart
First 1.0
Second 3.0
Third 4.0

View File

@ -20,22 +20,23 @@ import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Chart;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.charts.AxisCrosses;
import org.apache.poi.ss.usermodel.charts.AxisPosition;
import org.apache.poi.ss.usermodel.charts.ChartAxis;
import org.apache.poi.ss.usermodel.charts.ChartDataSource;
import org.apache.poi.ss.usermodel.charts.ChartLegend;
import org.apache.poi.ss.usermodel.charts.DataSources;
import org.apache.poi.ss.usermodel.charts.LegendPosition;
import org.apache.poi.ss.usermodel.charts.LineChartData;
import org.apache.poi.ss.usermodel.charts.ValueAxis;
import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xddf.usermodel.chart.AxisCrosses;
import org.apache.poi.xddf.usermodel.chart.AxisPosition;
import org.apache.poi.xddf.usermodel.chart.ChartTypes;
import org.apache.poi.xddf.usermodel.chart.LegendPosition;
import org.apache.poi.xddf.usermodel.chart.XDDFCategoryAxis;
import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend;
import org.apache.poi.xddf.usermodel.chart.XDDFDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory;
import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFValueAxis;
import org.apache.poi.xssf.usermodel.XSSFChart;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/** /**
@ -44,8 +45,8 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class LineChart { public class LineChart {
public static void main(String[] args) throws IOException { public static void main(String[] args) throws IOException {
try (Workbook wb = new XSSFWorkbook()) { try (XSSFWorkbook wb = new XSSFWorkbook()) {
Sheet sheet = wb.createSheet("linechart"); XSSFSheet sheet = wb.createSheet("linechart");
final int NUM_OF_ROWS = 3; final int NUM_OF_ROWS = 3;
final int NUM_OF_COLUMNS = 10; final int NUM_OF_COLUMNS = 10;
@ -60,29 +61,26 @@ public class LineChart {
} }
} }
Drawing<?> drawing = sheet.createDrawingPatriarch(); XSSFDrawing drawing = sheet.createDrawingPatriarch();
ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15); XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15);
Chart chart = drawing.createChart(anchor); XSSFChart chart = drawing.createChart(anchor);
ChartLegend legend = chart.getOrCreateLegend(); XDDFChartLegend legend = chart.getOrAddLegend();
legend.setPosition(LegendPosition.TOP_RIGHT); legend.setPosition(LegendPosition.TOP_RIGHT);
LineChartData data = chart.getChartDataFactory().createLineChartData();
// Use a category axis for the bottom axis. // Use a category axis for the bottom axis.
ChartAxis bottomAxis = chart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM); XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
ValueAxis leftAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT); XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
leftAxis.setCrosses(AxisCrosses.AUTO_ZERO); leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
ChartDataSource<Number> xs = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(0, 0, 0, NUM_OF_COLUMNS - 1)); XDDFDataSource<Double> xs = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(0, 0, 0, NUM_OF_COLUMNS - 1));
ChartDataSource<Number> ys1 = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, NUM_OF_COLUMNS - 1)); XDDFNumericalDataSource<Double> ys1 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, NUM_OF_COLUMNS - 1));
ChartDataSource<Number> ys2 = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, NUM_OF_COLUMNS - 1)); XDDFNumericalDataSource<Double> ys2 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, NUM_OF_COLUMNS - 1));
XDDFChartData data = chart.createData(ChartTypes.LINE, bottomAxis, leftAxis);
data.addSeries(xs, ys1); data.addSeries(xs, ys1);
data.addSeries(xs, ys2); data.addSeries(xs, ys2);
chart.plot(data);
chart.plot(data, bottomAxis, leftAxis);
// Write the output to a file // Write the output to a file
try (FileOutputStream fileOut = new FileOutputStream("ooxml-line-chart.xlsx")) { try (FileOutputStream fileOut = new FileOutputStream("ooxml-line-chart.xlsx")) {

View File

@ -23,21 +23,22 @@ import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Chart;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.charts.AxisCrosses;
import org.apache.poi.ss.usermodel.charts.AxisPosition;
import org.apache.poi.ss.usermodel.charts.ChartDataSource;
import org.apache.poi.ss.usermodel.charts.ChartLegend;
import org.apache.poi.ss.usermodel.charts.DataSources;
import org.apache.poi.ss.usermodel.charts.LegendPosition;
import org.apache.poi.ss.usermodel.charts.ScatterChartData;
import org.apache.poi.ss.usermodel.charts.ValueAxis;
import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xddf.usermodel.chart.AxisCrosses;
import org.apache.poi.xddf.usermodel.chart.AxisPosition;
import org.apache.poi.xddf.usermodel.chart.ChartTypes;
import org.apache.poi.xddf.usermodel.chart.LegendPosition;
import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend;
import org.apache.poi.xddf.usermodel.chart.XDDFDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory;
import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFValueAxis;
import org.apache.poi.xssf.usermodel.XSSFChart;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/** /**
@ -46,8 +47,8 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ScatterChart { public class ScatterChart {
public static void main(String[] args) throws IOException { public static void main(String[] args) throws IOException {
try (Workbook wb = new XSSFWorkbook()) { try (XSSFWorkbook wb = new XSSFWorkbook()) {
Sheet sheet = wb.createSheet("Sheet 1"); XSSFSheet sheet = wb.createSheet("Sheet 1");
final int NUM_OF_ROWS = 3; final int NUM_OF_ROWS = 3;
final int NUM_OF_COLUMNS = 10; final int NUM_OF_COLUMNS = 10;
@ -61,29 +62,28 @@ public class ScatterChart {
cell.setCellValue(colIndex * (rowIndex + 1)); cell.setCellValue(colIndex * (rowIndex + 1));
} }
} }
Drawing<?> drawing = sheet.createDrawingPatriarch(); XSSFDrawing drawing = sheet.createDrawingPatriarch();
ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15); XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15);
Chart chart = drawing.createChart(anchor); XSSFChart chart = drawing.createChart(anchor);
ChartLegend legend = chart.getOrCreateLegend(); XDDFChartLegend legend = chart.getOrAddLegend();
legend.setPosition(LegendPosition.TOP_RIGHT); legend.setPosition(LegendPosition.TOP_RIGHT);
ScatterChartData data = chart.getChartDataFactory().createScatterChartData(); XDDFValueAxis bottomAxis = chart.createValueAxis(AxisPosition.BOTTOM);
XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
ValueAxis bottomAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.BOTTOM);
ValueAxis leftAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT);
leftAxis.setCrosses(AxisCrosses.AUTO_ZERO); leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
ChartDataSource<Number> xs = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(0, 0, 0, NUM_OF_COLUMNS - 1)); XDDFDataSource<Double> xs = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(0, 0, 0, NUM_OF_COLUMNS - 1));
ChartDataSource<Number> ys1 = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, NUM_OF_COLUMNS - 1)); XDDFNumericalDataSource<Double> ys1 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, NUM_OF_COLUMNS - 1));
ChartDataSource<Number> ys2 = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, NUM_OF_COLUMNS - 1)); XDDFNumericalDataSource<Double> ys2 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, NUM_OF_COLUMNS - 1));
data.addSerie(xs, ys1); XDDFChartData data = chart.createData(ChartTypes.SCATTER, bottomAxis, leftAxis);
data.addSerie(xs, ys2);
data.addSeries(xs, ys1);
chart.plot(data, bottomAxis, leftAxis); data.addSeries(xs, ys2);
chart.plot(data);
// Write the output to a file // Write the output to a file
try (FileOutputStream fileOut = new FileOutputStream("ooxml-scatter-chart.xlsx")) { try (FileOutputStream fileOut = new FileOutputStream("ooxml-scatter-chart.xlsx")) {

View File

@ -45,13 +45,11 @@ import org.apache.poi.hssf.record.ObjRecord;
import org.apache.poi.ss.util.CellReference; import org.apache.poi.ss.util.CellReference;
import org.apache.poi.poifs.filesystem.DirectoryEntry; import org.apache.poi.poifs.filesystem.DirectoryEntry;
import org.apache.poi.poifs.filesystem.DirectoryNode; import org.apache.poi.poifs.filesystem.DirectoryNode;
import org.apache.poi.ss.usermodel.Chart;
import org.apache.poi.ss.usermodel.ClientAnchor; import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.Drawing; import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.util.HexDump; import org.apache.poi.util.HexDump;
import org.apache.poi.util.Internal; import org.apache.poi.util.Internal;
import org.apache.poi.util.NotImplemented;
import org.apache.poi.util.StringUtil; import org.apache.poi.util.StringUtil;
/** /**
@ -523,13 +521,6 @@ public final class HSSFPatriarch implements HSSFShapeContainer, Drawing<HSSFShap
return new HSSFClientAnchor(dx1, dy1, dx2, dy2, (short) col1, row1, (short) col2, row2); return new HSSFClientAnchor(dx1, dy1, dx2, dy2, (short) col1, row1, (short) col2, row2);
} }
@Override
@NotImplemented
public Chart createChart(ClientAnchor anchor) {
throw new RuntimeException("NotImplemented");
}
/** /**
* create shape tree from existing escher records tree * create shape tree from existing escher records tree
*/ */

View File

@ -19,20 +19,23 @@ package org.apache.poi.ss.usermodel;
import java.util.List; import java.util.List;
import org.apache.poi.ss.usermodel.charts.ChartData;
import org.apache.poi.ss.usermodel.charts.ChartAxis; import org.apache.poi.ss.usermodel.charts.ChartAxis;
import org.apache.poi.ss.usermodel.charts.ChartAxisFactory;
import org.apache.poi.ss.usermodel.charts.ChartData;
import org.apache.poi.ss.usermodel.charts.ChartDataFactory;
import org.apache.poi.ss.usermodel.charts.ChartLegend; import org.apache.poi.ss.usermodel.charts.ChartLegend;
import org.apache.poi.ss.usermodel.charts.ManuallyPositionable; import org.apache.poi.ss.usermodel.charts.ManuallyPositionable;
import org.apache.poi.ss.usermodel.charts.ChartDataFactory; import org.apache.poi.util.Removal;
import org.apache.poi.ss.usermodel.charts.ChartAxisFactory;
/** /**
* High level representation of a chart. * High level representation of a chart.
* *
* @author Roman Kashitsyn * @deprecated
*/ */
@Deprecated
@Removal(version="4.2")
public interface Chart extends ManuallyPositionable { public interface Chart extends ManuallyPositionable {
/** /**
* @return an appropriate ChartDataFactory implementation * @return an appropriate ChartDataFactory implementation
*/ */

View File

@ -39,14 +39,6 @@ public interface Drawing<T extends Shape> extends ShapeContainer<T> {
*/ */
Comment createCellComment(ClientAnchor anchor); Comment createCellComment(ClientAnchor anchor);
/**
* Creates a chart.
* @param anchor the client anchor describes how this chart is attached to
* the sheet.
* @return the newly created chart
*/
Chart createChart(ClientAnchor anchor);
/** /**
* Creates a new client anchor and sets the top-left and bottom-right * Creates a new client anchor and sets the top-left and bottom-right
* coordinates of the anchor. * coordinates of the anchor.
@ -62,10 +54,10 @@ public interface Drawing<T extends Shape> extends ShapeContainer<T> {
* @return the newly created client anchor * @return the newly created client anchor
*/ */
ClientAnchor createAnchor(int dx1, int dy1, int dx2, int dy2, int col1, int row1, int col2, int row2); ClientAnchor createAnchor(int dx1, int dy1, int dx2, int dy2, int col1, int row1, int col2, int row2);
/** /**
* Adds a new OLE Package Shape * Adds a new OLE Package Shape
* *
* @param anchor the client anchor describes how this picture is * @param anchor the client anchor describes how this picture is
* attached to the sheet. * attached to the sheet.
* @param storageId the storageId returned by {@link Workbook#addOlePackage(byte[], String, String, String)} * @param storageId the storageId returned by {@link Workbook#addOlePackage(byte[], String, String, String)}

View File

@ -17,11 +17,15 @@
package org.apache.poi.ss.usermodel.charts; package org.apache.poi.ss.usermodel.charts;
import org.apache.poi.util.Removal;
/** /**
* Specifies the possible crossing states of an axis. * Specifies the possible crossing states of an axis.
* *
* @author Roman Kashitsyn * @deprecated use XDDF AxisCrossBetween
*/ */
@Deprecated
@Removal(version="4.2")
public enum AxisCrossBetween { public enum AxisCrossBetween {
/** /**
* Specifies the value axis shall cross the category axis * Specifies the value axis shall cross the category axis

View File

@ -17,11 +17,15 @@
package org.apache.poi.ss.usermodel.charts; package org.apache.poi.ss.usermodel.charts;
import org.apache.poi.util.Removal;
/** /**
* Specifies the possible crossing points for an axis. * Specifies the possible crossing points for an axis.
* *
* @author Roman Kashitsyn * @deprecated use XDDF AxisCrosses instead
*/ */
@Deprecated
@Removal(version="4.2")
public enum AxisCrosses { public enum AxisCrosses {
/** /**
* The category axis crosses at the zero point of the value axis (if * The category axis crosses at the zero point of the value axis (if

View File

@ -17,11 +17,15 @@
package org.apache.poi.ss.usermodel.charts; package org.apache.poi.ss.usermodel.charts;
import org.apache.poi.util.Removal;
/** /**
* Specifies the possible ways to place a picture on a data point, series, wall, or floor. * Specifies the possible ways to place a picture on a data point, series, wall, or floor.
* *
* @author Roman Kashitsyn * @deprecated use XDDF AxisOrientation
*/ */
@Deprecated
@Removal(version="4.2")
public enum AxisOrientation { public enum AxisOrientation {
/** /**
* Specifies that the values on the axis shall be reversed * Specifies that the values on the axis shall be reversed

View File

@ -17,11 +17,15 @@
package org.apache.poi.ss.usermodel.charts; package org.apache.poi.ss.usermodel.charts;
import org.apache.poi.util.Removal;
/** /**
* Enumeration of all possible axis positions. * Enumeration of all possible axis positions.
* *
* @author Roman Kashitsyn * @deprecated use XDDF AxisPosition instead
*/ */
@Deprecated
@Removal(version="4.2")
public enum AxisPosition { public enum AxisPosition {
BOTTOM, BOTTOM,
LEFT, LEFT,

View File

@ -17,11 +17,15 @@
package org.apache.poi.ss.usermodel.charts; package org.apache.poi.ss.usermodel.charts;
import org.apache.poi.util.Removal;
/** /**
* Enumeration of possible axis tick marks. * Enumeration of possible axis tick marks.
* *
* @author Martin Andersson * @deprecated use XDDF AxisTickMark instead
*/ */
@Deprecated
@Removal(version="4.2")
public enum AxisTickMark { public enum AxisTickMark {
NONE, NONE,
CROSS, CROSS,

View File

@ -17,14 +17,15 @@
package org.apache.poi.ss.usermodel.charts; package org.apache.poi.ss.usermodel.charts;
import org.apache.poi.util.Beta; import org.apache.poi.util.Removal;
/** /**
* High level representation of chart axis. * High level representation of chart axis.
* *
* @author Roman Kashitsyn * @deprecated use XDDFChartAxis instead
*/ */
@Beta @Deprecated
@Removal(version="4.2")
public interface ChartAxis { public interface ChartAxis {
/** /**
@ -153,7 +154,7 @@ public interface ChartAxis {
* @param tickMark minor tick mark type. * @param tickMark minor tick mark type.
*/ */
void setMinorTickMark(AxisTickMark tickMark); void setMinorTickMark(AxisTickMark tickMark);
/** /**
* Use this to check before retrieving a number format, as calling {@link #getNumberFormat()} may create a default one if none exists. * Use this to check before retrieving a number format, as calling {@link #getNumberFormat()} may create a default one if none exists.
* @return true if a number format element is defined, false if not * @return true if a number format element is defined, false if not

View File

@ -17,31 +17,31 @@
package org.apache.poi.ss.usermodel.charts; package org.apache.poi.ss.usermodel.charts;
import org.apache.poi.util.Beta; import org.apache.poi.util.Removal;
/** /**
* A factory for different chart axis. * A factory for different chart axis.
* *
* @author Roman Kashitsyn * @deprecated
* @author Martin Andersson
*/ */
@Beta @Deprecated
@Removal(version="4.2")
public interface ChartAxisFactory { public interface ChartAxisFactory {
/** /**
* @param pos * @param pos
* @return new value axis at the end of the list at the specified chart position * @return new value axis at the end of the list at the specified chart position
*/ */
ValueAxis createValueAxis(AxisPosition pos); ValueAxis createValueAxis(AxisPosition pos);
/** /**
* @param pos * @param pos
* @return new category axis at the end of the list at the specified chart position * @return new category axis at the end of the list at the specified chart position
*/ */
ChartAxis createCategoryAxis(AxisPosition pos); ChartAxis createCategoryAxis(AxisPosition pos);
/** /**
* @param pos * @param pos
* @return new date category axis at the end of the list at the specified chart position * @return new date category axis at the end of the list at the specified chart position
*/ */
ChartAxis createDateAxis(AxisPosition pos); ChartAxis createDateAxis(AxisPosition pos);

View File

@ -18,14 +18,15 @@
package org.apache.poi.ss.usermodel.charts; package org.apache.poi.ss.usermodel.charts;
import org.apache.poi.ss.usermodel.Chart; import org.apache.poi.ss.usermodel.Chart;
import org.apache.poi.util.Beta; import org.apache.poi.util.Removal;
/** /**
* A base for all charts data types. * A base for all charts data types.
* *
* @author Roman Kashitsyn * @deprecated use XDDFChartData instead
*/ */
@Beta @Deprecated
@Removal(version="4.2")
public interface ChartData { public interface ChartData {
/** /**

View File

@ -17,14 +17,15 @@
package org.apache.poi.ss.usermodel.charts; package org.apache.poi.ss.usermodel.charts;
import org.apache.poi.util.Beta; import org.apache.poi.util.Removal;
/** /**
* A factory for different charts data types. * A factory for different charts data types.
* *
* @author Roman Kashitsyn, Martin Andersson * @deprecated
*/ */
@Beta @Deprecated
@Removal(version="4.2")
public interface ChartDataFactory { public interface ChartDataFactory {
/** /**

View File

@ -18,15 +18,16 @@
*/ */
package org.apache.poi.ss.usermodel.charts; package org.apache.poi.ss.usermodel.charts;
import org.apache.poi.util.Beta; import org.apache.poi.util.Removal;
/** /**
* Represents data model of the charts. * Represents data model of the charts.
* *
* @param <T> type of points the data source contents * @param <T> type of points the data source contents
* @author Roman Kashitsyn * @deprecated use XDDFDataSource instead
*/ */
@Beta @Deprecated
@Removal(version="4.2")
public interface ChartDataSource<T> { public interface ChartDataSource<T> {
/** /**

View File

@ -17,15 +17,15 @@
package org.apache.poi.ss.usermodel.charts; package org.apache.poi.ss.usermodel.charts;
import org.apache.poi.util.Beta; import org.apache.poi.util.Removal;
/** /**
* High level representation of chart legend. * High level representation of chart legend.
* *
* @author Roman Kashitsyn * @deprecated use XDDFChartLegend instead
* @author Martin Andersson
*/ */
@Beta @Deprecated
@Removal(version="4.2")
public interface ChartLegend extends ManuallyPositionable { public interface ChartLegend extends ManuallyPositionable {
/** /**

View File

@ -18,10 +18,14 @@
package org.apache.poi.ss.usermodel.charts; package org.apache.poi.ss.usermodel.charts;
import org.apache.poi.ss.util.CellReference; import org.apache.poi.ss.util.CellReference;
import org.apache.poi.util.Removal;
/** /**
* Basic settings for all chart series. * Basic settings for all chart series.
* @deprecated
*/ */
@Deprecated
@Removal(version="4.2")
public interface ChartSeries { public interface ChartSeries {
/** /**

View File

@ -19,16 +19,21 @@
package org.apache.poi.ss.usermodel.charts; package org.apache.poi.ss.usermodel.charts;
import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.CellValue;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.util.Beta; import org.apache.poi.util.Removal;
/** /**
* Class {@code DataSources} is a factory for {@link ChartDataSource} instances. * Class {@code DataSources} is a factory for {@link ChartDataSource} instances.
* *
* @author Roman Kashitsyn *@deprecated use XDDFDataSourcesFactory instead
*/ */
@Beta @Deprecated
@Removal(version="4.2")
public class DataSources { public class DataSources {
private DataSources() { private DataSources() {

View File

@ -17,10 +17,14 @@
package org.apache.poi.ss.usermodel.charts; package org.apache.poi.ss.usermodel.charts;
import org.apache.poi.util.Removal;
/** /**
* Specifies the possible ways to store a chart element's position. * Specifies the possible ways to store a chart element's position.
* @author Roman Kashitsyn * @use XDDF LayoutMode instead
*/ */
@Deprecated
@Removal(version="4.2")
public enum LayoutMode { public enum LayoutMode {
/** /**
* Specifies that the Width or Height shall be interpreted as the * Specifies that the Width or Height shall be interpreted as the

View File

@ -17,12 +17,16 @@
package org.apache.poi.ss.usermodel.charts; package org.apache.poi.ss.usermodel.charts;
import org.apache.poi.util.Removal;
/** /**
* Specifies whether to layout the plot area by its inside (not including axis * Specifies whether to layout the plot area by its inside (not including axis
* and axis labels) or outside (including axis and axis labels). * and axis labels) or outside (including axis and axis labels).
* *
* @author Roman Kashitsyn * @deprecated use XDDF LayoutTarget instead
*/ */
@Deprecated
@Removal(version="4.2")
public enum LayoutTarget { public enum LayoutTarget {
/** /**
* Specifies that the plot area size shall determine the * Specifies that the plot area size shall determine the

View File

@ -17,11 +17,15 @@
package org.apache.poi.ss.usermodel.charts; package org.apache.poi.ss.usermodel.charts;
import org.apache.poi.util.Removal;
/** /**
* Enumeration of all possible chart legend positions. * Enumeration of all possible chart legend positions.
* *
* @author Roman Kashitsyn * @deprecated use XDDF LayoutPosition instead
*/ */
@Deprecated
@Removal(version="4.2")
public enum LegendPosition { public enum LegendPosition {
BOTTOM, BOTTOM,
LEFT, LEFT,

View File

@ -19,12 +19,15 @@ package org.apache.poi.ss.usermodel.charts;
import java.util.List; import java.util.List;
import org.apache.poi.util.Beta; import org.apache.poi.util.Removal;
/** /**
* Data for a Line Chart * Data for a Line Chart
*
* @deprecated use XDDFLineChartData instead
*/ */
@Beta @Deprecated
@Removal(version="4.2")
public interface LineChartData extends ChartData { public interface LineChartData extends ChartData {
/** /**

View File

@ -17,12 +17,15 @@
package org.apache.poi.ss.usermodel.charts; package org.apache.poi.ss.usermodel.charts;
import org.apache.poi.util.Beta; import org.apache.poi.util.Removal;
/** /**
* Represents a line chart series. * Represents a line chart series.
*
* @deprecated use XDDFLineChartData.Series instead
*/ */
@Beta @Deprecated
@Removal(version="4.2")
public interface LineChartSeries extends ChartSeries { public interface LineChartSeries extends ChartSeries {
/** /**

View File

@ -17,14 +17,15 @@
package org.apache.poi.ss.usermodel.charts; package org.apache.poi.ss.usermodel.charts;
import org.apache.poi.util.Beta; import org.apache.poi.util.Removal;
/** /**
* High level representation of chart element manual layout. * High level representation of chart element manual layout.
* *
* @author Roman Kashitsyn * @deprecated use XDDFManualLayout instead
*/ */
@Beta @Deprecated
@Removal(version="4.2")
public interface ManualLayout { public interface ManualLayout {
/** /**
@ -117,7 +118,7 @@ public interface ManualLayout {
public void setHeightMode(LayoutMode mode); public void setHeightMode(LayoutMode mode);
/** /**
* Returns current height mode of this * Returns current height mode of this
* @return height mode of this manual layout. * @return height mode of this manual layout.
*/ */
public LayoutMode getHeightMode(); public LayoutMode getHeightMode();

View File

@ -17,15 +17,16 @@
package org.apache.poi.ss.usermodel.charts; package org.apache.poi.ss.usermodel.charts;
import org.apache.poi.util.Beta; import org.apache.poi.util.Removal;
/** /**
* Abstraction of chart element that can be positioned with manual * Abstraction of chart element that can be positioned with manual
* layout. * layout.
* *
* @author Roman Kashitsyn * @deprecated
*/ */
@Beta @Deprecated
@Removal(version="4.2")
public interface ManuallyPositionable { public interface ManuallyPositionable {
/** /**

View File

@ -19,9 +19,15 @@ package org.apache.poi.ss.usermodel.charts;
import java.util.List; import java.util.List;
import org.apache.poi.util.Removal;
/** /**
* Data for a Scatter Chart * Data for a Scatter Chart
*
* @deprecated use XDDFScatterChartData instead
*/ */
@Deprecated
@Removal(version="4.2")
public interface ScatterChartData extends ChartData { public interface ScatterChartData extends ChartData {
/** /**
* @param xs data source to be used for X axis values * @param xs data source to be used for X axis values

View File

@ -17,12 +17,15 @@
package org.apache.poi.ss.usermodel.charts; package org.apache.poi.ss.usermodel.charts;
import org.apache.poi.util.Beta; import org.apache.poi.util.Removal;
/** /**
* Represents scatter charts series. * Represents scatter charts series.
*
* @deprecated use XDFFScatterChartData.Series instead
*/ */
@Beta @Deprecated
@Removal(version="4.2")
public interface ScatterChartSeries extends ChartSeries { public interface ScatterChartSeries extends ChartSeries {
/** /**

View File

@ -17,11 +17,15 @@
package org.apache.poi.ss.usermodel.charts; package org.apache.poi.ss.usermodel.charts;
import org.apache.poi.util.Removal;
/** /**
* Title types for charts. * Title types for charts.
* *
* @author Martin Andersson * @deprecated
*/ */
@Deprecated
@Removal(version="4.2")
public enum TitleType { public enum TitleType {
STRING, STRING,
CELL_REFERENCE CELL_REFERENCE

View File

@ -17,12 +17,13 @@
package org.apache.poi.ss.usermodel.charts; package org.apache.poi.ss.usermodel.charts;
import org.apache.poi.util.Beta; import org.apache.poi.util.Removal;
/** /**
* @author Roman Kashitsyn * @deprecated use XDDFValueAxis instead
*/ */
@Beta @Deprecated
@Removal(version="4.2")
public interface ValueAxis extends ChartAxis { public interface ValueAxis extends ChartAxis {
/** /**

View File

@ -0,0 +1,44 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import java.util.HashMap;
import org.openxmlformats.schemas.drawingml.x2006.chart.STCrossBetween;
public enum AxisCrossBetween {
BETWEEN(STCrossBetween.BETWEEN),
MIDPOINT_CATEGORY(STCrossBetween.MID_CAT);
final STCrossBetween.Enum underlying;
AxisCrossBetween(STCrossBetween.Enum crossBetween) {
this.underlying = crossBetween;
}
private final static HashMap<STCrossBetween.Enum, AxisCrossBetween> reverse = new HashMap<STCrossBetween.Enum, AxisCrossBetween>();
static {
for (AxisCrossBetween value : values()) {
reverse.put(value.underlying, value);
}
}
static AxisCrossBetween valueOf(STCrossBetween.Enum crossBetween) {
return reverse.get(crossBetween);
}
}

View File

@ -0,0 +1,45 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import java.util.HashMap;
import org.openxmlformats.schemas.drawingml.x2006.chart.STCrosses;
public enum AxisCrosses {
AUTO_ZERO(STCrosses.AUTO_ZERO),
MAX(STCrosses.MAX),
MIN(STCrosses.MIN);
final STCrosses.Enum underlying;
AxisCrosses(STCrosses.Enum crosses) {
this.underlying = crosses;
}
private final static HashMap<STCrosses.Enum, AxisCrosses> reverse = new HashMap<STCrosses.Enum, AxisCrosses>();
static {
for (AxisCrosses value : values()) {
reverse.put(value.underlying, value);
}
}
static AxisCrosses valueOf(STCrosses.Enum crosses) {
return reverse.get(crosses);
}
}

View File

@ -0,0 +1,45 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import java.util.HashMap;
import org.openxmlformats.schemas.drawingml.x2006.chart.STLblAlgn;
public enum AxisLabelAlignment {
CENTER(STLblAlgn.CTR),
LEFT(STLblAlgn.L),
RIGHT(STLblAlgn.R);
final STLblAlgn.Enum underlying;
AxisLabelAlignment(STLblAlgn.Enum alignment) {
this.underlying = alignment;
}
private final static HashMap<STLblAlgn.Enum, AxisLabelAlignment> reverse = new HashMap<STLblAlgn.Enum, AxisLabelAlignment>();
static {
for (AxisLabelAlignment value : values()) {
reverse.put(value.underlying, value);
}
}
static AxisLabelAlignment valueOf(STLblAlgn.Enum alignment) {
return reverse.get(alignment);
}
}

View File

@ -0,0 +1,44 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import java.util.HashMap;
import org.openxmlformats.schemas.drawingml.x2006.chart.STOrientation;
public enum AxisOrientation {
MIN_MAX(STOrientation.MIN_MAX),
MAX_MIN(STOrientation.MAX_MIN);
final STOrientation.Enum underlying;
AxisOrientation(STOrientation.Enum orientation) {
this.underlying = orientation;
}
private final static HashMap<STOrientation.Enum, AxisOrientation> reverse = new HashMap<STOrientation.Enum, AxisOrientation>();
static {
for (AxisOrientation value : values()) {
reverse.put(value.underlying, value);
}
}
static AxisOrientation valueOf(STOrientation.Enum orientation) {
return reverse.get(orientation);
}
}

View File

@ -0,0 +1,46 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import java.util.HashMap;
import org.openxmlformats.schemas.drawingml.x2006.chart.STAxPos;
public enum AxisPosition {
BOTTOM(STAxPos.B),
LEFT(STAxPos.L),
RIGHT(STAxPos.R),
TOP(STAxPos.T);
final STAxPos.Enum underlying;
AxisPosition(STAxPos.Enum position) {
this.underlying = position;
}
private final static HashMap<STAxPos.Enum, AxisPosition> reverse = new HashMap<STAxPos.Enum, AxisPosition>();
static {
for (AxisPosition value : values()) {
reverse.put(value.underlying, value);
}
}
static AxisPosition valueOf(STAxPos.Enum position) {
return reverse.get(position);
}
}

View File

@ -0,0 +1,46 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import java.util.HashMap;
import org.openxmlformats.schemas.drawingml.x2006.chart.STTickLblPos;
public enum AxisTickLabelPosition {
HIGH(STTickLblPos.HIGH),
LOW(STTickLblPos.LOW),
NEXT_TO(STTickLblPos.NEXT_TO),
NONE(STTickLblPos.NONE);
final STTickLblPos.Enum underlying;
AxisTickLabelPosition(STTickLblPos.Enum position) {
this.underlying = position;
}
private final static HashMap<STTickLblPos.Enum, AxisTickLabelPosition> reverse = new HashMap<STTickLblPos.Enum, AxisTickLabelPosition>();
static {
for (AxisTickLabelPosition value : values()) {
reverse.put(value.underlying, value);
}
}
static AxisTickLabelPosition valueOf(STTickLblPos.Enum position) {
return reverse.get(position);
}
}

View File

@ -0,0 +1,46 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import java.util.HashMap;
import org.openxmlformats.schemas.drawingml.x2006.chart.STTickMark;
public enum AxisTickMark {
CROSS(STTickMark.CROSS),
IN(STTickMark.IN),
NONE(STTickMark.NONE),
OUT(STTickMark.OUT);
final STTickMark.Enum underlying;
AxisTickMark(STTickMark.Enum tickMark) {
this.underlying = tickMark;
}
private final static HashMap<STTickMark.Enum, AxisTickMark> reverse = new HashMap<STTickMark.Enum, AxisTickMark>();
static {
for (AxisTickMark value : values()) {
reverse.put(value.underlying, value);
}
}
static AxisTickMark valueOf(STTickMark.Enum tickMark) {
return reverse.get(tickMark);
}
}

View File

@ -0,0 +1,44 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import java.util.HashMap;
import org.openxmlformats.schemas.drawingml.x2006.chart.STBarDir;
public enum BarDirection {
BAR(STBarDir.BAR),
COL(STBarDir.COL);
final STBarDir.Enum underlying;
BarDirection(STBarDir.Enum direction) {
this.underlying = direction;
}
private final static HashMap<STBarDir.Enum, BarDirection> reverse = new HashMap<STBarDir.Enum, BarDirection>();
static {
for (BarDirection value : values()) {
reverse.put(value.underlying, value);
}
}
static BarDirection valueOf(STBarDir.Enum direction) {
return reverse.get(direction);
}
}

View File

@ -0,0 +1,46 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import java.util.HashMap;
import org.openxmlformats.schemas.drawingml.x2006.chart.STBarGrouping;
public enum BarGrouping {
STANDARD(STBarGrouping.STANDARD),
CLUSTERED(STBarGrouping.CLUSTERED),
STACKED(STBarGrouping.STACKED),
PERCENT_STACKED(STBarGrouping.PERCENT_STACKED);
final STBarGrouping.Enum underlying;
BarGrouping(STBarGrouping.Enum grouping) {
this.underlying = grouping;
}
private final static HashMap<STBarGrouping.Enum, BarGrouping> reverse = new HashMap<STBarGrouping.Enum, BarGrouping>();
static {
for (BarGrouping value : values()) {
reverse.put(value.underlying, value);
}
}
static BarGrouping valueOf(STBarGrouping.Enum grouping) {
return reverse.get(grouping);
}
}

View File

@ -0,0 +1,25 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
public enum ChartTypes {
BAR,
LINE,
PIE,
RADAR,
SCATTER;
}

View File

@ -0,0 +1,45 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import java.util.HashMap;
import org.openxmlformats.schemas.drawingml.x2006.chart.STGrouping;
public enum Grouping {
STANDARD(STGrouping.STANDARD),
STACKED(STGrouping.STACKED),
PERCENT_STACKED(STGrouping.PERCENT_STACKED);
final STGrouping.Enum underlying;
Grouping(STGrouping.Enum grouping) {
this.underlying = grouping;
}
private final static HashMap<STGrouping.Enum, Grouping> reverse = new HashMap<STGrouping.Enum, Grouping>();
static {
for (Grouping value : values()) {
reverse.put(value.underlying, value);
}
}
static Grouping valueOf(STGrouping.Enum grouping) {
return reverse.get(grouping);
}
}

View File

@ -0,0 +1,44 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import java.util.HashMap;
import org.openxmlformats.schemas.drawingml.x2006.chart.STLayoutMode;;
public enum LayoutMode {
EDGE(STLayoutMode.EDGE),
FACTOR(STLayoutMode.FACTOR);
final STLayoutMode.Enum underlying;
LayoutMode(STLayoutMode.Enum layoutMode) {
this.underlying = layoutMode;
}
private final static HashMap<STLayoutMode.Enum, LayoutMode> reverse = new HashMap<STLayoutMode.Enum, LayoutMode>();
static {
for (LayoutMode value : values()) {
reverse.put(value.underlying, value);
}
}
static LayoutMode valueOf(STLayoutMode.Enum layoutMode) {
return reverse.get(layoutMode);
}
}

View File

@ -0,0 +1,44 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import java.util.HashMap;
import org.openxmlformats.schemas.drawingml.x2006.chart.STLayoutTarget;;
public enum LayoutTarget {
INNER(STLayoutTarget.INNER),
OUTER(STLayoutTarget.OUTER);
final STLayoutTarget.Enum underlying;
LayoutTarget(STLayoutTarget.Enum layoutTarget) {
this.underlying = layoutTarget;
}
private final static HashMap<STLayoutTarget.Enum, LayoutTarget> reverse = new HashMap<STLayoutTarget.Enum, LayoutTarget>();
static {
for (LayoutTarget value : values()) {
reverse.put(value.underlying, value);
}
}
static LayoutTarget valueOf(STLayoutTarget.Enum layoutTarget) {
return reverse.get(layoutTarget);
}
}

View File

@ -0,0 +1,47 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import java.util.HashMap;
import org.openxmlformats.schemas.drawingml.x2006.chart.STLegendPos;
public enum LegendPosition {
BOTTOM(STLegendPos.B),
LEFT(STLegendPos.L),
RIGHT(STLegendPos.R),
TOP(STLegendPos.T),
TOP_RIGHT(STLegendPos.TR);
final STLegendPos.Enum underlying;
LegendPosition(STLegendPos.Enum position) {
this.underlying = position;
}
private final static HashMap<STLegendPos.Enum, LegendPosition> reverse = new HashMap<STLegendPos.Enum, LegendPosition>();
static {
for (LegendPosition value : values()) {
reverse.put(value.underlying, value);
}
}
static LegendPosition valueOf(STLegendPos.Enum position) {
return reverse.get(position);
}
}

View File

@ -0,0 +1,53 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import java.util.HashMap;
import org.openxmlformats.schemas.drawingml.x2006.chart.STMarkerStyle;
public enum MarkerStyle {
CIRCLE(STMarkerStyle.CIRCLE),
DASH(STMarkerStyle.DASH),
DIAMOND(STMarkerStyle.DIAMOND),
DOT(STMarkerStyle.DOT),
NONE(STMarkerStyle.NONE),
PICTURE(STMarkerStyle.PICTURE),
PLUS(STMarkerStyle.PLUS),
SQUARE(STMarkerStyle.SQUARE),
STAR(STMarkerStyle.STAR),
TRIANGLE(STMarkerStyle.TRIANGLE),
X(STMarkerStyle.X);
final STMarkerStyle.Enum underlying;
MarkerStyle(STMarkerStyle.Enum style) {
this.underlying = style;
}
private final static HashMap<STMarkerStyle.Enum, MarkerStyle> reverse = new HashMap<STMarkerStyle.Enum, MarkerStyle>();
static {
for (MarkerStyle value : values()) {
reverse.put(value.underlying, value);
}
}
static MarkerStyle valueOf(STMarkerStyle.Enum style) {
return reverse.get(style);
}
}

View File

@ -0,0 +1,45 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import java.util.HashMap;
import org.openxmlformats.schemas.drawingml.x2006.chart.STRadarStyle;
public enum RadarStyle {
FILLED(STRadarStyle.FILLED),
MARKER(STRadarStyle.MARKER),
STANDARD(STRadarStyle.STANDARD);
final STRadarStyle.Enum underlying;
RadarStyle(STRadarStyle.Enum style) {
this.underlying = style;
}
private final static HashMap<STRadarStyle.Enum, RadarStyle> reverse = new HashMap<STRadarStyle.Enum, RadarStyle>();
static {
for (RadarStyle value : values()) {
reverse.put(value.underlying, value);
}
}
static RadarStyle valueOf(STRadarStyle.Enum style) {
return reverse.get(style);
}
}

View File

@ -0,0 +1,48 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import java.util.HashMap;
import org.openxmlformats.schemas.drawingml.x2006.chart.STScatterStyle;
public enum ScatterStyle {
LINE(STScatterStyle.LINE),
LINE_MARKER(STScatterStyle.LINE_MARKER),
MARKER(STScatterStyle.MARKER),
NONE(STScatterStyle.NONE),
SMOOTH(STScatterStyle.SMOOTH),
SMOOTH_MARKER(STScatterStyle.SMOOTH_MARKER);
final STScatterStyle.Enum underlying;
ScatterStyle(STScatterStyle.Enum style) {
this.underlying = style;
}
private final static HashMap<STScatterStyle.Enum, ScatterStyle> reverse = new HashMap<STScatterStyle.Enum, ScatterStyle>();
static {
for (ScatterStyle value : values()) {
reverse.put(value.underlying, value);
}
}
static ScatterStyle valueOf(STScatterStyle.Enum style) {
return reverse.get(style);
}
}

View File

@ -0,0 +1,146 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import java.util.Map;
import org.apache.poi.util.Beta;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBarChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBarSer;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx;
@Beta
public class XDDFBarChartData extends XDDFChartData {
private CTBarChart chart;
public XDDFBarChartData(CTBarChart chart, Map<Long, XDDFChartAxis> categories,
Map<Long, XDDFValueAxis> values) {
this.chart = chart;
for (CTBarSer series : chart.getSerList()) {
this.series.add(new Series(series, series.getCat(), series.getVal()));
}
defineAxes(chart.getAxIdArray(), categories, values);
}
@Override
public void setVaryColors(boolean varyColors) {
if (chart.isSetVaryColors()) {
chart.getVaryColors().setVal(varyColors);
} else {
chart.addNewVaryColors().setVal(varyColors);
}
}
public BarDirection getBarDirection() {
return BarDirection.valueOf(chart.getBarDir().getVal());
}
public void setBarDirection(BarDirection direction) {
chart.getBarDir().setVal(direction.underlying);
}
public BarGrouping getBarGrouping() {
if (chart.isSetGrouping()) {
return BarGrouping.valueOf(chart.getGrouping().getVal());
} else {
return BarGrouping.STANDARD;
}
}
public void setBarGrouping(BarGrouping grouping) {
if (chart.isSetGrouping()) {
chart.getGrouping().setVal(grouping.underlying);
} else {
chart.addNewGrouping().setVal(grouping.underlying);
}
}
public int getGapWidth() {
if (chart.isSetGapWidth()) {
return chart.getGapWidth().getVal();
} else {
return 0;
}
}
public void setGapWidth(int width) {
if (chart.isSetGapWidth()) {
chart.getGapWidth().setVal(width);
} else {
chart.addNewGapWidth().setVal(width);
}
}
@Override
public XDDFChartData.Series addSeries(XDDFDataSource<?> category,
XDDFNumericalDataSource<? extends Number> values) {
final int index = this.series.size();
final CTBarSer ctSer = this.chart.addNewSer();
ctSer.addNewCat();
ctSer.addNewVal();
ctSer.addNewIdx().setVal(index);
ctSer.addNewOrder().setVal(index);
final Series added = new Series(ctSer, category, values);
this.series.add(added);
return added;
}
public class Series extends XDDFChartData.Series {
private CTBarSer series;
protected Series(CTBarSer series, XDDFDataSource<?> category,
XDDFNumericalDataSource<? extends Number> values) {
super(category, values);
this.series = series;
}
protected Series(CTBarSer series, CTAxDataSource category, CTNumDataSource values) {
super(XDDFDataSourcesFactory.fromDataSource(category), XDDFDataSourcesFactory.fromDataSource(values));
this.series = series;
}
@Override
protected CTSerTx getSeriesText() {
return series.getTx();
}
@Override
public void setShowLeaderLines(boolean showLeaderLines) {
if (!series.isSetDLbls()) {
series.addNewDLbls();
}
if (series.getDLbls().isSetShowLeaderLines()) {
series.getDLbls().getShowLeaderLines().setVal(showLeaderLines);
} else {
series.getDLbls().addNewShowLeaderLines().setVal(showLeaderLines);
}
}
@Override
protected CTAxDataSource getAxDS() {
return series.getCat();
}
@Override
protected CTNumDataSource getNumDS() {
return series.getVal();
}
}
}

View File

@ -0,0 +1,151 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import org.apache.poi.util.Beta;
import org.apache.poi.util.Internal;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTCatAx;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTCrosses;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumFmt;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTScaling;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTTickMark;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTUnsignedInt;
import org.openxmlformats.schemas.drawingml.x2006.chart.STTickLblPos;
import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
@Beta
public class XDDFCategoryAxis extends XDDFChartAxis {
private CTCatAx ctCatAx;
public XDDFCategoryAxis(CTPlotArea plotArea, AxisPosition position) {
initializeAxis(plotArea, position);
}
public XDDFCategoryAxis(CTCatAx ctCatAx) {
this.ctCatAx = ctCatAx;
}
@Override
@Internal
public CTShapeProperties getMajorGridLines() {
if (!ctCatAx.isSetMajorGridlines()) {
ctCatAx.addNewMajorGridlines();
}
if (!ctCatAx.getMajorGridlines().isSetSpPr()) {
ctCatAx.getMajorGridlines().addNewSpPr();
}
return ctCatAx.getMajorGridlines().getSpPr();
}
@Override
@Internal
public CTShapeProperties getLine() {
return ctCatAx.getSpPr();
}
@Override
public void crossAxis(XDDFChartAxis axis) {
ctCatAx.getCrossAx().setVal(axis.getId());
}
@Override
protected CTUnsignedInt getCTAxId() {
return ctCatAx.getAxId();
}
@Override
protected CTAxPos getCTAxPos() {
return ctCatAx.getAxPos();
}
@Override
public boolean hasNumberFormat() {
return ctCatAx.isSetNumFmt();
}
@Override
protected CTNumFmt getCTNumFmt() {
if (ctCatAx.isSetNumFmt()) {
return ctCatAx.getNumFmt();
}
return ctCatAx.addNewNumFmt();
}
@Override
protected CTScaling getCTScaling() {
return ctCatAx.getScaling();
}
@Override
protected CTCrosses getCTCrosses() {
CTCrosses crosses = ctCatAx.getCrosses();
if (crosses == null) {
return ctCatAx.addNewCrosses();
} else {
return crosses;
}
}
@Override
protected CTBoolean getDelete() {
return ctCatAx.getDelete();
}
@Override
protected CTTickMark getMajorCTTickMark() {
return ctCatAx.getMajorTickMark();
}
@Override
protected CTTickMark getMinorCTTickMark() {
return ctCatAx.getMinorTickMark();
}
public AxisLabelAlignment getLabelAlignment() {
return AxisLabelAlignment.valueOf(ctCatAx.getLblAlgn().getVal());
}
public void setLabelAlignment(AxisLabelAlignment labelAlignment) {
ctCatAx.getLblAlgn().setVal(labelAlignment.underlying);
}
private void initializeAxis(CTPlotArea plotArea, AxisPosition position) {
final long id = getNextAxId(plotArea);
ctCatAx = plotArea.addNewCatAx();
ctCatAx.addNewAxId().setVal(id);
ctCatAx.addNewAxPos();
ctCatAx.addNewScaling();
ctCatAx.addNewCrosses();
ctCatAx.addNewCrossAx();
ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
ctCatAx.addNewDelete();
ctCatAx.addNewMajorTickMark();
ctCatAx.addNewMinorTickMark();
setPosition(position);
setOrientation(AxisOrientation.MIN_MAX);
setCrosses(AxisCrosses.AUTO_ZERO);
setVisible(true);
setMajorTickMark(AxisTickMark.CROSS);
setMinorTickMark(AxisTickMark.NONE);
}
}

View File

@ -0,0 +1,26 @@
/*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
package org.apache.poi.xddf.usermodel.chart;
import org.apache.poi.util.Beta;
@Beta
public interface XDDFCategoryDataSource extends XDDFDataSource<String> {
}

View File

@ -0,0 +1,331 @@
/*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
package org.apache.poi.xddf.usermodel.chart;
import static org.apache.poi.POIXMLTypeLoader.DEFAULT_XML_OPTIONS;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.util.Beta;
import org.apache.poi.util.Internal;
import org.apache.xmlbeans.XmlException;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBarChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTCatAx;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTDateAx;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLineChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTRadarChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTScatterChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSurface;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTValAx;
import org.openxmlformats.schemas.drawingml.x2006.chart.ChartSpaceDocument;
@Beta
public abstract class XDDFChart extends POIXMLDocumentPart {
protected List<XDDFChartAxis> axes = new ArrayList<>();
/**
* Root element of the Chart part
*/
protected final CTChartSpace chartSpace;
/**
* Chart element in the chart space
*/
protected final CTChart chart;
/**
* Construct a chart.
*/
protected XDDFChart() {
super();
chartSpace = CTChartSpace.Factory.newInstance();
chart = chartSpace.addNewChart();
chart.addNewPlotArea();
}
/**
* Construct a DrawingML chart from a package part.
*
* @param part the package part holding the chart data,
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code>
*
* @since POI 3.14-Beta1
*/
protected XDDFChart(PackagePart part) throws IOException, XmlException {
super(part);
chartSpace = ChartSpaceDocument.Factory.parse(part.getInputStream(), DEFAULT_XML_OPTIONS).getChartSpace();
chart = chartSpace.getChart();
}
/**
* Return the underlying CTChartSpace bean, the root element of the Chart part.
*
* @return the underlying CTChartSpace bean
*/
@Internal
public CTChartSpace getCTChartSpace() {
return chartSpace;
}
/**
* Return the underlying CTChart bean, within the Chart Space
*
* @return the underlying CTChart bean
*/
@Internal
public CTChart getCTChart() {
return chart;
}
/**
* Return the underlying CTPlotArea bean, within the Chart
*
* @return the underlying CTPlotArea bean
*/
@Internal
protected CTPlotArea getCTPlotArea() {
return chart.getPlotArea();
}
/**
* @return true if only visible cells will be present on the chart,
* false otherwise
*/
public boolean isPlotOnlyVisibleCells() {
if (chart.isSetPlotVisOnly()) {
return chart.getPlotVisOnly().getVal();
} else {
return false;
}
}
/**
* @param only a flag specifying if only visible cells should be
* present on the chart
*/
public void setPlotOnlyVisibleCells(boolean only) {
if (!chart.isSetPlotVisOnly()) {
chart.setPlotVisOnly(CTBoolean.Factory.newInstance());
}
chart.getPlotVisOnly().setVal(only);
}
public void setFloor(int thickness) {
if (!chart.isSetFloor()) {
chart.setFloor(CTSurface.Factory.newInstance());
}
chart.getFloor().getThickness().setVal(thickness);
}
public void setBackWall(int thickness) {
if (!chart.isSetBackWall()) {
chart.setBackWall(CTSurface.Factory.newInstance());
}
chart.getBackWall().getThickness().setVal(thickness);
}
public void setSideWall(int thickness) {
if (!chart.isSetSideWall()) {
chart.setSideWall(CTSurface.Factory.newInstance());
}
chart.getSideWall().getThickness().setVal(thickness);
}
public void setAutoTitleDeleted(boolean deleted) {
if (!chart.isSetAutoTitleDeleted()) {
chart.setAutoTitleDeleted(CTBoolean.Factory.newInstance());
}
chart.getAutoTitleDeleted().setVal(deleted);
}
public XDDFChartLegend getOrAddLegend() {
return new XDDFChartLegend(chart);
}
public void deleteLegend() {
if (chart.isSetLegend()) {
chart.unsetLegend();
}
}
public XDDFManualLayout getOrAddManualLayout() {
return new XDDFManualLayout(chart.getPlotArea());
}
public void plot(XDDFChartData data) {
for (XDDFChartData.Series series : data.getSeries()) {
series.plot();
}
}
public List<XDDFChartData> getChartSeries() {
List<XDDFChartData> series = new LinkedList<>();
CTPlotArea plotArea = getCTPlotArea();
Map<Long, XDDFChartAxis> categories = getCategoryAxes();
Map<Long, XDDFValueAxis> values = getValueAxes();
for (int i = 0; i < plotArea.sizeOfBarChartArray(); i++) {
CTBarChart barChart = plotArea.getBarChartArray(i);
series.add(new XDDFBarChartData(barChart, categories, values));
}
for (int i = 0; i < plotArea.sizeOfLineChartArray(); i++) {
CTLineChart lineChart = plotArea.getLineChartArray(i);
series.add(new XDDFLineChartData(lineChart, categories, values));
}
for (int i = 0; i < plotArea.sizeOfPieChartArray(); i++) {
CTPieChart pieChart = plotArea.getPieChartArray(i);
series.add(new XDDFPieChartData(pieChart));
}
for (int i = 0; i < plotArea.sizeOfRadarChartArray(); i++) {
CTRadarChart radarChart = plotArea.getRadarChartArray(i);
series.add(new XDDFRadarChartData(radarChart, categories, values));
}
for (int i = 0; i < plotArea.sizeOfScatterChartArray(); i++) {
CTScatterChart scatterChart = plotArea.getScatterChartArray(i);
series.add(new XDDFScatterChartData(scatterChart, categories, values));
}
// TODO repeat above code for all kind of charts
return series;
}
private Map<Long, XDDFChartAxis> getCategoryAxes() {
CTPlotArea plotArea = getCTPlotArea();
int sizeOfArray = plotArea.sizeOfCatAxArray();
Map<Long, XDDFChartAxis> axes = new HashMap<Long, XDDFChartAxis>(sizeOfArray);
for (int i = 0; i < sizeOfArray; i++) {
CTCatAx category = plotArea.getCatAxArray(i);
axes.put(category.getAxId().getVal(), new XDDFCategoryAxis(category));
}
return axes;
}
private Map<Long, XDDFValueAxis> getValueAxes() {
CTPlotArea plotArea = getCTPlotArea();
int sizeOfArray = plotArea.sizeOfValAxArray();
Map<Long, XDDFValueAxis> axes = new HashMap<>(sizeOfArray);
for (int i = 0; i < sizeOfArray; i++) {
CTValAx values = plotArea.getValAxArray(i);
axes.put(values.getAxId().getVal(), new XDDFValueAxis(values));
}
return axes;
}
public XDDFValueAxis createValueAxis(AxisPosition pos) {
XDDFValueAxis valueAxis = new XDDFValueAxis(chart.getPlotArea(), pos);
if (axes.size() == 1) {
XDDFChartAxis axis = axes.get(0);
axis.crossAxis(valueAxis);
valueAxis.crossAxis(axis);
}
axes.add(valueAxis);
return valueAxis;
}
public XDDFCategoryAxis createCategoryAxis(AxisPosition pos) {
XDDFCategoryAxis categoryAxis = new XDDFCategoryAxis(chart.getPlotArea(), pos);
if (axes.size() == 1) {
XDDFChartAxis axis = axes.get(0);
axis.crossAxis(categoryAxis);
categoryAxis.crossAxis(axis);
}
axes.add(categoryAxis);
return categoryAxis;
}
public XDDFDateAxis createDateAxis(AxisPosition pos) {
XDDFDateAxis dateAxis = new XDDFDateAxis(chart.getPlotArea(), pos);
if (axes.size() == 1) {
XDDFChartAxis axis = axes.get(0);
axis.crossAxis(dateAxis);
dateAxis.crossAxis(axis);
}
axes.add(dateAxis);
return dateAxis;
}
public XDDFChartData createData(ChartTypes type, XDDFChartAxis category, XDDFValueAxis values) {
Map<Long, XDDFChartAxis> categories = Collections.singletonMap(category.getId(), category);
Map<Long, XDDFValueAxis> mapValues = Collections.singletonMap(values.getId(), values);
final CTPlotArea plotArea = getCTPlotArea();
switch (type) {
case BAR:
return new XDDFBarChartData(plotArea.addNewBarChart(), categories, mapValues);
case LINE:
return new XDDFLineChartData(plotArea.addNewLineChart(), categories, mapValues);
case PIE:
return new XDDFPieChartData(plotArea.addNewPieChart());
case RADAR:
return new XDDFRadarChartData(plotArea.addNewRadarChart(), categories, mapValues);
case SCATTER:
return new XDDFScatterChartData(plotArea.addNewScatterChart(), categories, mapValues);
default:
return null;
}
}
public List<? extends XDDFChartAxis> getAxes() {
if (axes.isEmpty() && hasAxes()) {
parseAxes();
}
return axes;
}
private boolean hasAxes() {
CTPlotArea ctPlotArea = chart.getPlotArea();
int totalAxisCount = ctPlotArea.sizeOfValAxArray() + ctPlotArea.sizeOfCatAxArray() + ctPlotArea.sizeOfDateAxArray() + ctPlotArea.sizeOfSerAxArray();
return totalAxisCount > 0;
}
private void parseAxes() {
// TODO: add other axis types
for (CTCatAx catAx : chart.getPlotArea().getCatAxArray()) {
axes.add(new XDDFCategoryAxis(catAx));
}
for (CTDateAx dateAx : chart.getPlotArea().getDateAxArray()) {
axes.add(new XDDFDateAxis(dateAx));
}
for (CTValAx valAx : chart.getPlotArea().getValAxArray()) {
axes.add(new XDDFValueAxis(valAx));
}
}
}

View File

@ -0,0 +1,302 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import org.apache.poi.util.Beta;
import org.apache.poi.util.Internal;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTCrosses;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLogBase;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumFmt;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTScaling;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTTickMark;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTUnsignedInt;
import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
/**
* Base class for all axis types.
*/
@Beta
public abstract class XDDFChartAxis {
protected abstract CTUnsignedInt getCTAxId();
protected abstract CTAxPos getCTAxPos();
protected abstract CTNumFmt getCTNumFmt();
protected abstract CTScaling getCTScaling();
protected abstract CTCrosses getCTCrosses();
protected abstract CTBoolean getDelete();
protected abstract CTTickMark getMajorCTTickMark();
protected abstract CTTickMark getMinorCTTickMark();
@Internal
public abstract CTShapeProperties getMajorGridLines();
@Internal
public abstract CTShapeProperties getLine();
/**
* @return axis id
*/
public long getId() {
return getCTAxId().getVal();
}
/**
* @return axis position
*/
public AxisPosition getPosition() {
return AxisPosition.valueOf(getCTAxPos().getVal());
}
/**
* @param position
* new axis position
*/
public void setPosition(AxisPosition position) {
getCTAxPos().setVal(position.underlying);
}
/**
* Use this to check before retrieving a number format, as calling {@link #getNumberFormat()} may create a default
* one if none exists.
*
* @return true if a number format element is defined, false if not
*/
public abstract boolean hasNumberFormat();
/**
* @param format
* axis number format
*/
public void setNumberFormat(String format) {
getCTNumFmt().setFormatCode(format);
getCTNumFmt().setSourceLinked(true);
}
/**
* @return axis number format
*/
public String getNumberFormat() {
return getCTNumFmt().getFormatCode();
}
/**
* @return true if log base is defined, false otherwise
*/
public boolean isSetLogBase() {
return getCTScaling().isSetLogBase();
}
private static final double MIN_LOG_BASE = 2.0;
private static final double MAX_LOG_BASE = 1000.0;
/**
* @param logBase
* a number between 2 and 1000 (inclusive)
* @throws IllegalArgumentException
* if log base not within allowed range
*/
public void setLogBase(double logBase) {
if (logBase < MIN_LOG_BASE || MAX_LOG_BASE < logBase) {
throw new IllegalArgumentException("Axis log base must be between 2 and 1000 (inclusive), got: " + logBase);
}
CTScaling scaling = getCTScaling();
if (scaling.isSetLogBase()) {
scaling.getLogBase().setVal(logBase);
} else {
scaling.addNewLogBase().setVal(logBase);
}
}
/**
* @return axis log base or 0.0 if not set
*/
public double getLogBase() {
CTLogBase logBase = getCTScaling().getLogBase();
if (logBase != null) {
return logBase.getVal();
}
return 0.0;
}
/**
* @return true if minimum value is defined, false otherwise
*/
public boolean isSetMinimum() {
return getCTScaling().isSetMin();
}
/**
* @param min
* axis minimum
*/
public void setMinimum(double min) {
CTScaling scaling = getCTScaling();
if (scaling.isSetMin()) {
scaling.getMin().setVal(min);
} else {
scaling.addNewMin().setVal(min);
}
}
/**
* @return axis minimum or 0.0 if not set
*/
public double getMinimum() {
CTScaling scaling = getCTScaling();
if (scaling.isSetMin()) {
return scaling.getMin().getVal();
} else {
return 0.0;
}
}
/**
* @return true if maximum value is defined, false otherwise
*/
public boolean isSetMaximum() {
return getCTScaling().isSetMax();
}
/**
* @param max
* axis maximum
*/
public void setMaximum(double max) {
CTScaling scaling = getCTScaling();
if (scaling.isSetMax()) {
scaling.getMax().setVal(max);
} else {
scaling.addNewMax().setVal(max);
}
}
/**
* @return axis maximum or 0.0 if not set
*/
public double getMaximum() {
CTScaling scaling = getCTScaling();
if (scaling.isSetMax()) {
return scaling.getMax().getVal();
} else {
return 0.0;
}
}
/**
* @return axis orientation
*/
public AxisOrientation getOrientation() {
return AxisOrientation.valueOf(getCTScaling().getOrientation().getVal());
}
/**
* @param orientation
* axis orientation
*/
public void setOrientation(AxisOrientation orientation) {
CTScaling scaling = getCTScaling();
if (scaling.isSetOrientation()) {
scaling.getOrientation().setVal(orientation.underlying);
} else {
scaling.addNewOrientation().setVal(orientation.underlying);
}
}
/**
* @return axis cross type
*/
public AxisCrosses getCrosses() {
return AxisCrosses.valueOf(getCTCrosses().getVal());
}
/**
* @param crosses
* axis cross type
*/
public void setCrosses(AxisCrosses crosses) {
getCTCrosses().setVal(crosses.underlying);
}
/**
* Declare this axis cross another axis.
*
* @param axis
* that this axis should cross
*/
public abstract void crossAxis(XDDFChartAxis axis);
/**
* @return visibility of the axis.
*/
public boolean isVisible() {
return !getDelete().getVal();
}
/**
* @param value
* visibility of the axis.
*/
public void setVisible(boolean value) {
getDelete().setVal(!value);
}
/**
* @return major tick mark.
*/
public AxisTickMark getMajorTickMark() {
return AxisTickMark.valueOf(getMajorCTTickMark().getVal());
}
/**
* @param tickMark
* major tick mark type.
*/
public void setMajorTickMark(AxisTickMark tickMark) {
getMajorCTTickMark().setVal(tickMark.underlying);
}
/**
* @return minor tick mark.
*/
public AxisTickMark getMinorTickMark() {
return AxisTickMark.valueOf(getMinorCTTickMark().getVal());
}
/**
* @param tickMark
* minor tick mark type.
*/
public void setMinorTickMark(AxisTickMark tickMark) {
getMinorCTTickMark().setVal(tickMark.underlying);
}
protected long getNextAxId(CTPlotArea plotArea) {
long totalAxisCount = plotArea.sizeOfValAxArray() + plotArea.sizeOfCatAxArray() + plotArea.sizeOfDateAxArray()
+ plotArea.sizeOfSerAxArray();
return totalAxisCount;
}
}

View File

@ -0,0 +1,291 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.util.Beta;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumData;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumRef;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumVal;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrData;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrRef;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrVal;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTUnsignedInt;
/**
* Base of all XDDF Chart Data
*/
@Beta
public abstract class XDDFChartData {
protected List<Series> series;
private XDDFCategoryAxis categoryAxis;
private List<XDDFValueAxis> valueAxes;
protected XDDFChartData() {
this.series = new ArrayList<Series>();
}
protected void defineAxes(CTUnsignedInt[] axes, Map<Long, XDDFChartAxis> categories,
Map<Long, XDDFValueAxis> values) {
List<XDDFValueAxis> list = new ArrayList<XDDFValueAxis>(axes.length);
for (CTUnsignedInt axe : axes) {
Long axisId = axe.getVal();
XDDFChartAxis category = categories.get(axisId);
if (category == null) {
XDDFValueAxis axis = values.get(axisId);
if (axis != null) {
list.add(axis);
}
} else if (category instanceof XDDFCategoryAxis) {
this.categoryAxis = (XDDFCategoryAxis) category;
}
}
this.valueAxes = Collections.unmodifiableList(list);
}
public XDDFCategoryAxis getCategoryAxis() {
return categoryAxis;
}
public List<XDDFValueAxis> getValueAxes() {
return valueAxes;
}
public List<Series> getSeries() {
return series;
}
public abstract void setVaryColors(boolean varyColors);
public abstract XDDFChartData.Series addSeries(XDDFDataSource<?> category,
XDDFNumericalDataSource<? extends Number> values);
public abstract class Series {
protected abstract CTSerTx getSeriesText();
public abstract void setShowLeaderLines(boolean showLeaderLines);
protected XDDFDataSource<?> categoryData;
protected XDDFNumericalDataSource<? extends Number> valuesData;
protected abstract CTAxDataSource getAxDS();
protected abstract CTNumDataSource getNumDS();
protected Series(XDDFDataSource<?> category, XDDFNumericalDataSource<? extends Number> values) {
replaceData(category, values);
}
public void replaceData(XDDFDataSource<?> category, XDDFNumericalDataSource<? extends Number> values) {
if (category == null || values == null) {
throw new IllegalStateException("Category and values must be defined before filling chart data.");
}
int numOfPoints = category.getPointCount();
if (numOfPoints != values.getPointCount()) {
throw new IllegalStateException("Category and values must have the same point count.");
}
this.categoryData = category;
this.valuesData = values;
}
public void setTitle(String title, CellReference titleRef) {
if (titleRef == null) {
getSeriesText().setV(title);
} else {
CTStrRef ref;
if (getSeriesText().isSetStrRef()) {
ref = getSeriesText().getStrRef();
} else {
ref = getSeriesText().addNewStrRef();
}
CTStrData cache;
if (ref.isSetStrCache()) {
cache = ref.getStrCache();
} else {
cache = ref.addNewStrCache();
}
cache.getPtArray(0).setV(title);
ref.setF(titleRef.formatAsString());
}
}
public XDDFDataSource<?> getCategoryData() {
return categoryData;
}
public XDDFNumericalDataSource<? extends Number> getValuesData() {
return valuesData;
}
public void plot() {
int numOfPoints = categoryData.getPointCount();
if (categoryData.isNumeric()) {
CTNumData cache = retrieveNumCache(getAxDS(), categoryData);
fillNumCache(cache, numOfPoints, (XDDFNumericalDataSource<?>) categoryData);
} else {
CTStrData cache = retrieveStrCache(getAxDS(), categoryData);
fillStringCache(cache, numOfPoints, categoryData);
}
CTNumData cache = retrieveNumCache(getNumDS(), valuesData);
fillNumCache(cache, numOfPoints, valuesData);
}
private CTNumData retrieveNumCache(final CTAxDataSource axDataSource, XDDFDataSource<?> data) {
CTNumData numCache;
if (data.isReference()) {
CTNumRef numRef;
if (axDataSource.isSetNumRef()) {
numRef = axDataSource.getNumRef();
} else {
numRef = axDataSource.addNewNumRef();
}
if (numRef.isSetNumCache()) {
numCache = numRef.getNumCache();
} else {
numCache = numRef.addNewNumCache();
}
numRef.setF(data.getDataRangeReference());
if (axDataSource.isSetNumLit()) {
axDataSource.unsetNumLit();
}
} else {
if (axDataSource.isSetNumLit()) {
numCache = axDataSource.getNumLit();
} else {
numCache = axDataSource.addNewNumLit();
}
if (axDataSource.isSetNumRef()) {
axDataSource.unsetNumRef();
}
}
return numCache;
}
private CTStrData retrieveStrCache(final CTAxDataSource axDataSource, XDDFDataSource<?> data) {
CTStrData strCache;
if (data.isReference()) {
CTStrRef strRef;
if (axDataSource.isSetStrRef()) {
strRef = axDataSource.getStrRef();
} else {
strRef = axDataSource.addNewStrRef();
}
if (strRef.isSetStrCache()) {
strCache = strRef.getStrCache();
} else {
strCache = strRef.addNewStrCache();
}
strRef.setF(data.getDataRangeReference());
if (axDataSource.isSetStrLit()) {
axDataSource.unsetStrLit();
}
} else {
if (axDataSource.isSetStrLit()) {
strCache = axDataSource.getStrLit();
} else {
strCache = axDataSource.addNewStrLit();
}
if (axDataSource.isSetStrRef()) {
axDataSource.unsetStrRef();
}
}
return strCache;
}
private CTNumData retrieveNumCache(final CTNumDataSource numDataSource, XDDFDataSource<?> data) {
CTNumData numCache;
if (data.isReference()) {
CTNumRef numRef;
if (numDataSource.isSetNumRef()) {
numRef = numDataSource.getNumRef();
} else {
numRef = numDataSource.addNewNumRef();
}
if (numRef.isSetNumCache()) {
numCache = numRef.getNumCache();
} else {
numCache = numRef.addNewNumCache();
}
numRef.setF(data.getDataRangeReference());
if (numDataSource.isSetNumLit()) {
numDataSource.unsetNumLit();
}
} else {
if (numDataSource.isSetNumLit()) {
numCache = numDataSource.getNumLit();
} else {
numCache = numDataSource.addNewNumLit();
}
if (numDataSource.isSetNumRef()) {
numDataSource.unsetNumRef();
}
}
return numCache;
}
private void fillStringCache(CTStrData cache, int numOfPoints, XDDFDataSource<?> data) {
cache.setPtArray(null); // unset old values
if (cache.isSetPtCount()) {
cache.getPtCount().setVal(numOfPoints);
} else {
cache.addNewPtCount().setVal(numOfPoints);
}
for (int i = 0; i < numOfPoints; ++i) {
String value = data.getPointAt(i).toString();
if (value != null) {
CTStrVal ctStrVal = cache.addNewPt();
ctStrVal.setIdx(i);
ctStrVal.setV(value);
}
}
}
private void fillNumCache(CTNumData cache, int numOfPoints, XDDFNumericalDataSource<?> data) {
String formatCode = data.getFormatCode();
if (formatCode == null) {
if (cache.isSetFormatCode()) {
cache.unsetFormatCode();
}
} else {
cache.setFormatCode(formatCode);
}
cache.setPtArray(null); // unset old values
if (cache.isSetPtCount()) {
cache.getPtCount().setVal(numOfPoints);
} else {
cache.addNewPtCount().setVal(numOfPoints);
}
for (int i = 0; i < numOfPoints; ++i) {
Object value = data.getPointAt(i);
if (value != null) {
CTNumVal ctNumVal = cache.addNewPt();
ctNumVal.setIdx(i);
ctNumVal.setV(value.toString());
}
}
}
}
}

View File

@ -0,0 +1,41 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import org.apache.poi.util.Beta;
import org.apache.poi.util.Internal;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTExtensionList;
@Beta
public class XDDFChartExtensionList {
private CTExtensionList list;
public XDDFChartExtensionList() {
this(CTExtensionList.Factory.newInstance());
}
@Internal
protected XDDFChartExtensionList(CTExtensionList list) {
this.list = list;
}
@Internal
public CTExtensionList getXmlObject() {
return list;
}
}

View File

@ -0,0 +1,184 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.poi.util.Beta;
import org.apache.poi.util.Internal;
import org.apache.poi.xddf.usermodel.text.XDDFTextBody;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLegend;
import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
/**
* Represents a DrawingML chart legend
*/
@Beta
public final class XDDFChartLegend {
/**
* Underlying CTLegend bean
*/
private CTLegend legend;
/**
* Create a new DrawingML chart legend
*/
public XDDFChartLegend(CTChart ctChart) {
this.legend = (ctChart.isSetLegend()) ? ctChart.getLegend() : ctChart.addNewLegend();
setDefaults();
}
/**
* Set sensible default styling.
*/
private void setDefaults() {
if (!legend.isSetOverlay()) {
legend.addNewOverlay();
}
legend.getOverlay().setVal(false);
}
/**
* Return the underlying CTLegend bean.
*
* @return the underlying CTLegend bean
*/
@Internal
protected CTLegend getXmlObject() {
return legend;
}
@Internal // will later replace with XDDFShapeProperties
public CTShapeProperties getShapeProperties() {
if (legend.isSetSpPr()) {
return legend.getSpPr();
} else {
return null;
}
}
@Internal // will later replace with XDDFShapeProperties
public void setShapeProperties(CTShapeProperties properties) {
if (properties == null) {
legend.unsetSpPr();
} else {
legend.setSpPr(properties);
}
}
public XDDFTextBody getTextBody() {
if (legend.isSetTxPr()) {
return new XDDFTextBody(legend.getTxPr());
} else {
return null;
}
}
public void setTextBody(XDDFTextBody body) {
if (body == null) {
legend.unsetTxPr();
} else {
legend.setTxPr(body.getXmlObject());
}
}
public XDDFLegendEntry addEntry() {
return new XDDFLegendEntry(legend.addNewLegendEntry());
}
public XDDFLegendEntry getEntry(int index) {
return new XDDFLegendEntry(legend.getLegendEntryArray(index));
}
public List<XDDFLegendEntry> getEntries() {
return legend
.getLegendEntryList()
.stream()
.map(entry -> new XDDFLegendEntry(entry))
.collect(Collectors.toList());
}
public void setExtensionList(XDDFChartExtensionList list) {
if (list == null) {
legend.unsetExtLst();
} else {
legend.setExtLst(list.getXmlObject());
}
}
public XDDFChartExtensionList getExtensionList() {
if (legend.isSetExtLst()) {
return new XDDFChartExtensionList(legend.getExtLst());
} else {
return null;
}
}
public void setLayout(XDDFLayout layout) {
if (layout == null) {
legend.unsetLayout();
} else {
legend.setLayout(layout.getXmlObject());
}
}
public XDDFLayout getLayout() {
if (legend.isSetLayout()) {
return new XDDFLayout(legend.getLayout());
} else {
return null;
}
}
public void setPosition(LegendPosition position) {
if (!legend.isSetLegendPos()) {
legend.addNewLegendPos();
}
legend.getLegendPos().setVal(position.underlying);
}
/*
* According to ECMA-376 default position is RIGHT.
*/
public LegendPosition getPosition() {
if (legend.isSetLegendPos()) {
return LegendPosition.valueOf(legend.getLegendPos().getVal());
} else {
return LegendPosition.RIGHT;
}
}
public XDDFManualLayout getOrAddManualLayout() {
if (!legend.isSetLayout()) {
legend.addNewLayout();
}
return new XDDFManualLayout(legend.getLayout());
}
public boolean isOverlay() {
return legend.getOverlay().getVal();
}
public void setOverlay(boolean value) {
legend.getOverlay().setVal(value);
}
}

View File

@ -0,0 +1,35 @@
/*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
package org.apache.poi.xddf.usermodel.chart;
import org.apache.poi.util.Beta;
@Beta
public interface XDDFDataSource<T> {
int getPointCount();
T getPointAt(int index);
boolean isReference();
boolean isNumeric();
String getDataRangeReference();
}

View File

@ -0,0 +1,299 @@
/*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
package org.apache.poi.xddf.usermodel.chart;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.CellValue;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.util.Beta;
import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumData;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrData;
/**
* Class {@code XDDFDataSourcesFactory} is a factory for {@link XDDFDataSource} instances.
*/
@Beta
public class XDDFDataSourcesFactory {
private XDDFDataSourcesFactory() {
}
public static XDDFCategoryDataSource fromDataSource(final CTAxDataSource categoryDS) {
return new XDDFCategoryDataSource() {
private CTStrData category = (CTStrData) categoryDS.getStrRef().getStrCache().copy();
@Override
public boolean isNumeric() {
return false;
}
@Override
public boolean isReference() {
return true;
}
@Override
public int getPointCount() {
return (int) category.getPtCount().getVal();
}
@Override
public String getPointAt(int index) {
return category.getPtArray(index).getV();
}
@Override
public String getDataRangeReference() {
return categoryDS.getStrRef().getF();
}
};
}
public static XDDFNumericalDataSource<Double> fromDataSource(final CTNumDataSource valuesDS) {
return new XDDFNumericalDataSource<Double>() {
private CTNumData values = (CTNumData) valuesDS.getNumRef().getNumCache().copy();
private String formatCode = values.isSetFormatCode() ? values.getFormatCode() : null;
@Override
public String getFormatCode() {
return formatCode;
}
@Override
public void setFormatCode(String formatCode) {
this.formatCode = formatCode;
}
@Override
public boolean isNumeric() {
return true;
}
@Override
public boolean isReference() {
return true;
}
@Override
public int getPointCount() {
return (int) values.getPtCount().getVal();
}
@Override
public Double getPointAt(int index) {
return Double.valueOf(values.getPtArray(index).getV());
}
@Override
public String getDataRangeReference() {
return valuesDS.getNumRef().getF();
}
};
}
public static <T extends Number> XDDFNumericalDataSource<T> fromArray(T[] elements, String dataRange) {
return new NumericalArrayDataSource<T>(elements, dataRange);
}
public static XDDFCategoryDataSource fromArray(String[] elements, String dataRange) {
return new StringArrayDataSource(elements, dataRange);
}
public static XDDFNumericalDataSource<Double> fromNumericCellRange(XSSFSheet sheet,
CellRangeAddress cellRangeAddress) {
return new NumericalCellRangeDataSource(sheet, cellRangeAddress);
}
public static XDDFCategoryDataSource fromStringCellRange(XSSFSheet sheet, CellRangeAddress cellRangeAddress) {
return new StringCellRangeDataSource(sheet, cellRangeAddress);
}
private abstract static class AbstractArrayDataSource<T> implements XDDFDataSource<T> {
private final T[] elements;
private final String dataRange;
public AbstractArrayDataSource(T[] elements, String dataRange) {
this.elements = elements.clone();
this.dataRange = dataRange;
}
@Override
public int getPointCount() {
return elements.length;
}
@Override
public T getPointAt(int index) {
return elements[index];
}
@Override
public boolean isReference() {
return dataRange != null;
}
@Override
public boolean isNumeric() {
Class<?> arrayComponentType = elements.getClass().getComponentType();
return (Number.class.isAssignableFrom(arrayComponentType));
}
@Override
public String getDataRangeReference() {
if (dataRange == null) {
throw new UnsupportedOperationException("Literal data source can not be expressed by reference.");
} else {
return dataRange;
}
}
}
private static class NumericalArrayDataSource<T extends Number> extends AbstractArrayDataSource<T>
implements XDDFNumericalDataSource<T> {
private String formatCode;
public NumericalArrayDataSource(T[] elements, String dataRange) {
super(elements, dataRange);
}
@Override
public String getFormatCode() {
return formatCode;
}
@Override
public void setFormatCode(String formatCode) {
this.formatCode = formatCode;
}
}
private static class StringArrayDataSource extends AbstractArrayDataSource<String>
implements XDDFCategoryDataSource {
public StringArrayDataSource(String[] elements, String dataRange) {
super(elements, dataRange);
}
}
private abstract static class AbstractCellRangeDataSource<T> implements XDDFDataSource<T> {
private final XSSFSheet sheet;
private final CellRangeAddress cellRangeAddress;
private final int numOfCells;
private XSSFFormulaEvaluator evaluator;
protected AbstractCellRangeDataSource(XSSFSheet sheet, CellRangeAddress cellRangeAddress) {
this.sheet = sheet;
// Make copy since CellRangeAddress is mutable.
this.cellRangeAddress = cellRangeAddress.copy();
this.numOfCells = this.cellRangeAddress.getNumberOfCells();
this.evaluator = sheet.getWorkbook().getCreationHelper().createFormulaEvaluator();
}
@Override
public int getPointCount() {
return numOfCells;
}
@Override
public boolean isReference() {
return true;
}
@Override
public String getDataRangeReference() {
return cellRangeAddress.formatAsString(sheet.getSheetName(), true);
}
protected CellValue getCellValueAt(int index) {
if (index < 0 || index >= numOfCells) {
throw new IndexOutOfBoundsException(
"Index must be between 0 and " + (numOfCells - 1) + " (inclusive), given: " + index);
}
int firstRow = cellRangeAddress.getFirstRow();
int firstCol = cellRangeAddress.getFirstColumn();
int lastCol = cellRangeAddress.getLastColumn();
int width = lastCol - firstCol + 1;
int rowIndex = firstRow + index / width;
int cellIndex = firstCol + index % width;
XSSFRow row = sheet.getRow(rowIndex);
return (row == null) ? null : evaluator.evaluate(row.getCell(cellIndex));
}
}
private static class NumericalCellRangeDataSource extends AbstractCellRangeDataSource<Double>
implements XDDFNumericalDataSource<Double> {
protected NumericalCellRangeDataSource(XSSFSheet sheet, CellRangeAddress cellRangeAddress) {
super(sheet, cellRangeAddress);
}
private String formatCode;
@Override
public String getFormatCode() {
return formatCode;
}
@Override
public void setFormatCode(String formatCode) {
this.formatCode = formatCode;
}
@Override
public Double getPointAt(int index) {
CellValue cellValue = getCellValueAt(index);
if (cellValue != null && cellValue.getCellTypeEnum() == CellType.NUMERIC) {
return Double.valueOf(cellValue.getNumberValue());
} else {
return null;
}
}
@Override
public boolean isNumeric() {
return true;
}
}
private static class StringCellRangeDataSource extends AbstractCellRangeDataSource<String>
implements XDDFCategoryDataSource {
protected StringCellRangeDataSource(XSSFSheet sheet, CellRangeAddress cellRangeAddress) {
super(sheet, cellRangeAddress);
}
@Override
public String getPointAt(int index) {
CellValue cellValue = getCellValueAt(index);
if (cellValue != null && cellValue.getCellTypeEnum() == CellType.STRING) {
return cellValue.getStringValue();
} else {
return null;
}
}
@Override
public boolean isNumeric() {
return false;
}
}
}

View File

@ -0,0 +1,147 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import org.apache.poi.util.Beta;
import org.apache.poi.util.Internal;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTCrosses;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTDateAx;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumFmt;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTScaling;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTTickMark;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTUnsignedInt;
import org.openxmlformats.schemas.drawingml.x2006.chart.STTickLblPos;
import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
/**
* Date axis type. Currently only implements the same values as {@link XDDFCategoryAxis}, since the two are nearly
* identical.
*/
@Beta
public class XDDFDateAxis extends XDDFChartAxis {
private CTDateAx ctDateAx;
public XDDFDateAxis(CTPlotArea plotArea, AxisPosition position) {
initializeAxis(plotArea, position);
}
public XDDFDateAxis(CTDateAx ctDateAx) {
this.ctDateAx = ctDateAx;
}
@Override
@Internal
public CTShapeProperties getMajorGridLines() {
if (!ctDateAx.isSetMajorGridlines()) {
ctDateAx.addNewMajorGridlines();
}
if (!ctDateAx.getMajorGridlines().isSetSpPr()) {
ctDateAx.getMajorGridlines().addNewSpPr();
}
return ctDateAx.getMajorGridlines().getSpPr();
}
@Override
@Internal
public CTShapeProperties getLine() {
return ctDateAx.getSpPr();
}
@Override
public void crossAxis(XDDFChartAxis axis) {
ctDateAx.getCrossAx().setVal(axis.getId());
}
@Override
protected CTUnsignedInt getCTAxId() {
return ctDateAx.getAxId();
}
@Override
protected CTAxPos getCTAxPos() {
return ctDateAx.getAxPos();
}
@Override
public boolean hasNumberFormat() {
return ctDateAx.isSetNumFmt();
}
@Override
protected CTNumFmt getCTNumFmt() {
if (ctDateAx.isSetNumFmt()) {
return ctDateAx.getNumFmt();
}
return ctDateAx.addNewNumFmt();
}
@Override
protected CTScaling getCTScaling() {
return ctDateAx.getScaling();
}
@Override
protected CTCrosses getCTCrosses() {
CTCrosses crosses = ctDateAx.getCrosses();
if (crosses == null) {
return ctDateAx.addNewCrosses();
} else {
return crosses;
}
}
@Override
protected CTBoolean getDelete() {
return ctDateAx.getDelete();
}
@Override
protected CTTickMark getMajorCTTickMark() {
return ctDateAx.getMajorTickMark();
}
@Override
protected CTTickMark getMinorCTTickMark() {
return ctDateAx.getMinorTickMark();
}
private void initializeAxis(CTPlotArea plotArea, AxisPosition position) {
final long id = getNextAxId(plotArea);
ctDateAx = plotArea.addNewDateAx();
ctDateAx.addNewAxId().setVal(id);
ctDateAx.addNewAxPos();
ctDateAx.addNewScaling();
ctDateAx.addNewCrosses();
ctDateAx.addNewCrossAx();
ctDateAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
ctDateAx.addNewDelete();
ctDateAx.addNewMajorTickMark();
ctDateAx.addNewMinorTickMark();
setPosition(position);
setOrientation(AxisOrientation.MIN_MAX);
setCrosses(AxisCrosses.AUTO_ZERO);
setVisible(true);
setMajorTickMark(AxisTickMark.CROSS);
setMinorTickMark(AxisTickMark.NONE);
}
}

View File

@ -0,0 +1,73 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import org.apache.poi.util.Beta;
import org.apache.poi.util.Internal;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLayout;
@Beta
public class XDDFLayout {
private CTLayout layout;
public XDDFLayout() {
this(CTLayout.Factory.newInstance());
}
@Internal
protected XDDFLayout(CTLayout layout) {
this.layout = layout;
}
@Internal
protected CTLayout getXmlObject() {
return layout;
}
public void setExtensionList(XDDFChartExtensionList list) {
if (list == null) {
layout.unsetExtLst();
} else {
layout.setExtLst(list.getXmlObject());
}
}
public XDDFChartExtensionList getExtensionList() {
if (layout.isSetExtLst()) {
return new XDDFChartExtensionList(layout.getExtLst());
} else {
return null;
}
}
public void setManualLayout(XDDFManualLayout manual) {
if (manual == null) {
layout.unsetManualLayout();
} else {
layout.setManualLayout(manual.getXmlObject());
}
}
public XDDFManualLayout getManualLayout() {
if (layout.isSetManualLayout()) {
return new XDDFManualLayout(layout);
} else {
return null;
}
}
}

View File

@ -0,0 +1,98 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import org.apache.poi.util.Beta;
import org.apache.poi.util.Internal;
import org.apache.poi.xddf.usermodel.text.XDDFTextBody;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLegendEntry;
@Beta
public class XDDFLegendEntry {
private CTLegendEntry entry;
@Internal
protected XDDFLegendEntry(CTLegendEntry entry) {
this.entry = entry;
}
@Internal
protected CTLegendEntry getXmlObject() {
return entry;
}
public XDDFTextBody getTextBody() {
if (entry.isSetTxPr()) {
return new XDDFTextBody(entry.getTxPr());
} else {
return null;
}
}
public void setTextBody(XDDFTextBody body) {
if (body == null) {
entry.unsetTxPr();
} else {
entry.setTxPr(body.getXmlObject());
}
}
public boolean getDelete() {
if (entry.isSetDelete()) {
return entry.getDelete().getVal();
} else {
return false;
}
}
public void setDelete(Boolean delete) {
if (delete == null) {
entry.unsetDelete();
} else {
if (entry.isSetDelete()) {
entry.getDelete().setVal(delete);
} else {
entry.addNewDelete().setVal(delete);
}
}
}
public long getIndex() {
return entry.getIdx().getVal();
}
public void setIndex(long index) {
entry.getIdx().setVal(index);
}
public void setExtensionList(XDDFChartExtensionList list) {
if (list == null) {
entry.unsetExtLst();
} else {
entry.setExtLst(list.getXmlObject());
}
}
public XDDFChartExtensionList getExtensionList() {
if (entry.isSetExtLst()) {
return new XDDFChartExtensionList(entry.getExtLst());
} else {
return null;
}
}
}

View File

@ -0,0 +1,141 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import java.util.Map;
import org.apache.poi.util.Beta;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLineChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLineSer;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTMarker;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx;
@Beta
public class XDDFLineChartData extends XDDFChartData {
private CTLineChart chart;
public XDDFLineChartData(CTLineChart chart, Map<Long, XDDFChartAxis> categories,
Map<Long, XDDFValueAxis> values) {
this.chart = chart;
for (CTLineSer series : chart.getSerList()) {
this.series.add(new Series(series, series.getCat(), series.getVal()));
}
defineAxes(chart.getAxIdArray(), categories, values);
}
@Override
public void setVaryColors(boolean varyColors) {
if (chart.isSetVaryColors()) {
chart.getVaryColors().setVal(varyColors);
} else {
chart.addNewVaryColors().setVal(varyColors);
}
}
public Grouping getGrouping() {
return Grouping.valueOf(chart.getGrouping().getVal());
}
public void setGrouping(Grouping grouping) {
chart.getGrouping().setVal(grouping.underlying);
}
@Override
public XDDFChartData.Series addSeries(XDDFDataSource<?> category,
XDDFNumericalDataSource<? extends Number> values) {
final int index = this.series.size();
final CTLineSer ctSer = this.chart.addNewSer();
ctSer.addNewCat();
ctSer.addNewVal();
ctSer.addNewIdx().setVal(index);
ctSer.addNewOrder().setVal(index);
final Series added = new Series(ctSer, category, values);
this.series.add(added);
return added;
}
public class Series extends XDDFChartData.Series {
private CTLineSer series;
protected Series(CTLineSer series, XDDFDataSource<?> category,
XDDFNumericalDataSource<? extends Number> values) {
super(category, values);
this.series = series;
}
protected Series(CTLineSer series, CTAxDataSource category, CTNumDataSource values) {
super(XDDFDataSourcesFactory.fromDataSource(category), XDDFDataSourcesFactory.fromDataSource(values));
this.series = series;
}
@Override
protected CTSerTx getSeriesText() {
return series.getTx();
}
@Override
public void setShowLeaderLines(boolean showLeaderLines) {
if (!series.isSetDLbls()) {
series.addNewDLbls();
}
if (series.getDLbls().isSetShowLeaderLines()) {
series.getDLbls().getShowLeaderLines().setVal(showLeaderLines);
} else {
series.getDLbls().addNewShowLeaderLines().setVal(showLeaderLines);
}
}
public void setMarkerSize(short size) {
CTMarker marker = getMarker();
if (marker.isSetSize()) {
marker.getSize().setVal(size);
} else {
marker.addNewSize().setVal(size);
}
}
public void setMarkerStyle(MarkerStyle style) {
CTMarker marker = getMarker();
if (marker.isSetSymbol()) {
marker.getSymbol().setVal(style.underlying);
} else {
marker.addNewSymbol().setVal(style.underlying);
}
}
private CTMarker getMarker() {
if (series.isSetMarker()) {
return series.getMarker();
} else {
return series.addNewMarker();
}
}
@Override
protected CTAxDataSource getAxDS() {
return series.getCat();
}
@Override
protected CTNumDataSource getNumDS() {
return series.getVal();
}
}
}

View File

@ -0,0 +1,221 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import org.apache.poi.util.Beta;
import org.apache.poi.util.Internal;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLayout;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTManualLayout;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
/**
* Represents a DrawingML manual layout.
*/
@Beta
public final class XDDFManualLayout {
/**
* Underlaying CTManualLayout bean.
*/
private CTManualLayout layout;
private static final LayoutMode defaultLayoutMode = LayoutMode.EDGE;
private static final LayoutTarget defaultLayoutTarget = LayoutTarget.INNER;
/**
* Create a new DrawingML manual layout.
*
* @param ctLayout
* a DrawingML layout that should be used as base.
*/
public XDDFManualLayout(CTLayout ctLayout) {
initializeLayout(ctLayout);
}
/**
* Create a new DrawingML manual layout for chart.
*
* @param ctPlotArea
* a chart's plot area to create layout for.
*/
public XDDFManualLayout(CTPlotArea ctPlotArea) {
CTLayout ctLayout = ctPlotArea.isSetLayout() ? ctPlotArea.getLayout() : ctPlotArea.addNewLayout();
initializeLayout(ctLayout);
}
/**
* Return the underlying CTManualLayout bean.
*
* @return the underlying CTManualLayout bean.
*/
@Internal
protected CTManualLayout getXmlObject() {
return layout;
}
public void setExtensionList(XDDFChartExtensionList list) {
if (list == null) {
layout.unsetExtLst();
} else {
layout.setExtLst(list.getXmlObject());
}
}
public XDDFChartExtensionList getExtensionList() {
if (layout.isSetExtLst()) {
return new XDDFChartExtensionList(layout.getExtLst());
} else {
return null;
}
}
public void setWidthRatio(double ratio) {
if (!layout.isSetW()) {
layout.addNewW();
}
layout.getW().setVal(ratio);
}
public double getWidthRatio() {
if (!layout.isSetW()) {
return 0.0;
}
return layout.getW().getVal();
}
public void setHeightRatio(double ratio) {
if (!layout.isSetH()) {
layout.addNewH();
}
layout.getH().setVal(ratio);
}
public double getHeightRatio() {
if (!layout.isSetH()) {
return 0.0;
}
return layout.getH().getVal();
}
public LayoutTarget getTarget() {
if (!layout.isSetLayoutTarget()) {
return defaultLayoutTarget;
}
return LayoutTarget.valueOf(layout.getLayoutTarget().getVal());
}
public void setTarget(LayoutTarget target) {
if (!layout.isSetLayoutTarget()) {
layout.addNewLayoutTarget();
}
layout.getLayoutTarget().setVal(target.underlying);
}
public LayoutMode getXMode() {
if (!layout.isSetXMode()) {
return defaultLayoutMode;
}
return LayoutMode.valueOf(layout.getXMode().getVal());
}
public void setXMode(LayoutMode mode) {
if (!layout.isSetXMode()) {
layout.addNewXMode();
}
layout.getXMode().setVal(mode.underlying);
}
public LayoutMode getYMode() {
if (!layout.isSetYMode()) {
return defaultLayoutMode;
}
return LayoutMode.valueOf(layout.getYMode().getVal());
}
public void setYMode(LayoutMode mode) {
if (!layout.isSetYMode()) {
layout.addNewYMode();
}
layout.getYMode().setVal(mode.underlying);
}
public double getX() {
if (!layout.isSetX()) {
return 0.0;
}
return layout.getX().getVal();
}
public void setX(double x) {
if (!layout.isSetX()) {
layout.addNewX();
}
layout.getX().setVal(x);
}
public double getY() {
if (!layout.isSetY()) {
return 0.0;
}
return layout.getY().getVal();
}
public void setY(double y) {
if (!layout.isSetY()) {
layout.addNewY();
}
layout.getY().setVal(y);
}
public LayoutMode getWidthMode() {
if (!layout.isSetWMode()) {
return defaultLayoutMode;
}
return LayoutMode.valueOf(layout.getWMode().getVal());
}
public void setWidthMode(LayoutMode mode) {
if (!layout.isSetWMode()) {
layout.addNewWMode();
}
layout.getWMode().setVal(mode.underlying);
}
public LayoutMode getHeightMode() {
if (!layout.isSetHMode()) {
return defaultLayoutMode;
}
return LayoutMode.valueOf(layout.getHMode().getVal());
}
public void setHeightMode(LayoutMode mode) {
if (!layout.isSetHMode()) {
layout.addNewHMode();
}
layout.getHMode().setVal(mode.underlying);
}
private void initializeLayout(CTLayout ctLayout) {
if (ctLayout.isSetManualLayout()) {
this.layout = ctLayout.getManualLayout();
} else {
this.layout = ctLayout.addNewManualLayout();
}
}
}

View File

@ -0,0 +1,29 @@
/*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
package org.apache.poi.xddf.usermodel.chart;
import org.apache.poi.util.Beta;
@Beta
public interface XDDFNumericalDataSource<T extends Number> extends XDDFDataSource<T> {
String getFormatCode();
void setFormatCode(String formatCode);
}

View File

@ -0,0 +1,118 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import org.apache.poi.util.Beta;
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.CTSerTx;
@Beta
public class XDDFPieChartData extends XDDFChartData {
private CTPieChart chart;
public XDDFPieChartData(CTPieChart chart) {
this.chart = chart;
for (CTPieSer series : chart.getSerList()) {
this.series.add(new Series(series, series.getCat(), series.getVal()));
}
}
@Override
public void setVaryColors(boolean varyColors) {
if (chart.isSetVaryColors()) {
chart.getVaryColors().setVal(varyColors);
} else {
chart.addNewVaryColors().setVal(varyColors);
}
}
@Override
public XDDFChartData.Series addSeries(XDDFDataSource<?> category,
XDDFNumericalDataSource<? extends Number> values) {
final int index = this.series.size();
final CTPieSer ctSer = this.chart.addNewSer();
ctSer.addNewCat();
ctSer.addNewVal();
ctSer.addNewIdx().setVal(index);
ctSer.addNewOrder().setVal(index);
final Series added = new Series(ctSer, category, values);
this.series.add(added);
return added;
}
public class Series extends XDDFChartData.Series {
private CTPieSer series;
protected Series(CTPieSer series, XDDFDataSource<?> category,
XDDFNumericalDataSource<? extends Number> values) {
super(category, values);
this.series = series;
}
protected Series(CTPieSer series, CTAxDataSource category, CTNumDataSource values) {
super(XDDFDataSourcesFactory.fromDataSource(category), XDDFDataSourcesFactory.fromDataSource(values));
this.series = series;
}
@Override
protected CTSerTx getSeriesText() {
return series.getTx();
}
@Override
public void setShowLeaderLines(boolean showLeaderLines) {
if (!series.isSetDLbls()) {
series.addNewDLbls();
}
if (series.getDLbls().isSetShowLeaderLines()) {
series.getDLbls().getShowLeaderLines().setVal(showLeaderLines);
} else {
series.getDLbls().addNewShowLeaderLines().setVal(showLeaderLines);
}
}
public long getExplosion() {
if (series.isSetExplosion()) {
return series.getExplosion().getVal();
} else {
return 0;
}
}
public void setExplosion(long explosion) {
if (series.isSetExplosion()) {
series.getExplosion().setVal(explosion);
} else {
series.addNewExplosion().setVal(explosion);
}
}
@Override
protected CTAxDataSource getAxDS() {
return series.getCat();
}
@Override
protected CTNumDataSource getNumDS() {
return series.getVal();
}
}
}

View File

@ -0,0 +1,119 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import java.util.Map;
import org.apache.poi.util.Beta;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTRadarChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTRadarSer;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTRadarStyle;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx;
@Beta
public class XDDFRadarChartData extends XDDFChartData {
private CTRadarChart chart;
public XDDFRadarChartData(CTRadarChart chart, Map<Long, XDDFChartAxis> categories,
Map<Long, XDDFValueAxis> values) {
this.chart = chart;
for (CTRadarSer series : chart.getSerList()) {
this.series.add(new Series(series, series.getCat(), series.getVal()));
}
defineAxes(chart.getAxIdArray(), categories, values);
}
@Override
public void setVaryColors(boolean varyColors) {
if (chart.isSetVaryColors()) {
chart.getVaryColors().setVal(varyColors);
} else {
chart.addNewVaryColors().setVal(varyColors);
}
}
public RadarStyle getStyle() {
return RadarStyle.valueOf(chart.getRadarStyle().getVal());
}
public void setStyle(RadarStyle style) {
CTRadarStyle radarStyle = chart.getRadarStyle();
if (radarStyle == null) {
radarStyle = chart.addNewRadarStyle();
}
radarStyle.setVal(style.underlying);
}
@Override
public XDDFChartData.Series addSeries(XDDFDataSource<?> category,
XDDFNumericalDataSource<? extends Number> values) {
final int index = this.series.size();
final CTRadarSer ctSer = this.chart.addNewSer();
ctSer.addNewCat();
ctSer.addNewVal();
ctSer.addNewIdx().setVal(index);
ctSer.addNewOrder().setVal(index);
final Series added = new Series(ctSer, category, values);
this.series.add(added);
return added;
}
public class Series extends XDDFChartData.Series {
private CTRadarSer series;
protected Series(CTRadarSer series, XDDFDataSource<?> category,
XDDFNumericalDataSource<? extends Number> values) {
super(category, values);
this.series = series;
}
protected Series(CTRadarSer series, CTAxDataSource category, CTNumDataSource values) {
super(XDDFDataSourcesFactory.fromDataSource(category), XDDFDataSourcesFactory.fromDataSource(values));
this.series = series;
}
@Override
protected CTSerTx getSeriesText() {
return series.getTx();
}
@Override
public void setShowLeaderLines(boolean showLeaderLines) {
if (!series.isSetDLbls()) {
series.addNewDLbls();
}
if (series.getDLbls().isSetShowLeaderLines()) {
series.getDLbls().getShowLeaderLines().setVal(showLeaderLines);
} else {
series.getDLbls().addNewShowLeaderLines().setVal(showLeaderLines);
}
}
@Override
protected CTAxDataSource getAxDS() {
return series.getCat();
}
@Override
protected CTNumDataSource getNumDS() {
return series.getVal();
}
}
}

View File

@ -0,0 +1,123 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import java.util.Map;
import org.apache.poi.util.Beta;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTScatterChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTScatterSer;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTScatterStyle;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx;
@Beta
public class XDDFScatterChartData extends XDDFChartData {
private CTScatterChart chart;
public XDDFScatterChartData(CTScatterChart chart, Map<Long, XDDFChartAxis> categories,
Map<Long, XDDFValueAxis> values) {
this.chart = chart;
for (CTScatterSer series : chart.getSerList()) {
this.series.add(new Series(series, series.getXVal(), series.getYVal()));
}
defineAxes(chart.getAxIdArray(), categories, values);
}
@Override
public void setVaryColors(boolean varyColors) {
if (chart.isSetVaryColors()) {
chart.getVaryColors().setVal(varyColors);
} else {
chart.addNewVaryColors().setVal(varyColors);
}
}
public ScatterStyle getStyle() {
CTScatterStyle scatterStyle = chart.getScatterStyle();
if (scatterStyle == null) {
scatterStyle = chart.addNewScatterStyle();
scatterStyle.setVal(ScatterStyle.LINE_MARKER.underlying);
}
return ScatterStyle.valueOf(scatterStyle.getVal());
}
public void setStyle(ScatterStyle style) {
CTScatterStyle scatterStyle = chart.getScatterStyle();
if (scatterStyle == null) {
scatterStyle = chart.addNewScatterStyle();
}
scatterStyle.setVal(style.underlying);
}
@Override
public XDDFChartData.Series addSeries(XDDFDataSource<?> category,
XDDFNumericalDataSource<? extends Number> values) {
final int index = this.series.size();
final CTScatterSer ctSer = this.chart.addNewSer();
ctSer.addNewXVal();
ctSer.addNewYVal();
ctSer.addNewIdx().setVal(index);
ctSer.addNewOrder().setVal(index);
final Series added = new Series(ctSer, category, values);
this.series.add(added);
return added;
}
public class Series extends XDDFChartData.Series {
private CTScatterSer series;
protected Series(CTScatterSer series, XDDFDataSource<?> category, XDDFNumericalDataSource<?> values) {
super(category, values);
this.series = series;
}
protected Series(CTScatterSer series, CTAxDataSource category, CTNumDataSource values) {
super(XDDFDataSourcesFactory.fromDataSource(category), XDDFDataSourcesFactory.fromDataSource(values));
this.series = series;
}
@Override
protected CTSerTx getSeriesText() {
return series.getTx();
}
@Override
public void setShowLeaderLines(boolean showLeaderLines) {
if (!series.isSetDLbls()) {
series.addNewDLbls();
}
if (series.getDLbls().isSetShowLeaderLines()) {
series.getDLbls().getShowLeaderLines().setVal(showLeaderLines);
} else {
series.getDLbls().addNewShowLeaderLines().setVal(showLeaderLines);
}
}
@Override
protected CTAxDataSource getAxDS() {
return series.getXVal();
}
@Override
protected CTNumDataSource getNumDS() {
return series.getYVal();
}
}
}

View File

@ -0,0 +1,153 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import org.apache.poi.util.Beta;
import org.apache.poi.util.Internal;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTCrosses;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumFmt;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTScaling;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTTickMark;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTUnsignedInt;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTValAx;
import org.openxmlformats.schemas.drawingml.x2006.chart.STTickLblPos;
import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
@Beta
public class XDDFValueAxis extends XDDFChartAxis {
private CTValAx ctValAx;
public XDDFValueAxis(CTPlotArea plotArea, AxisPosition position) {
initializeAxis(plotArea, position);
}
public XDDFValueAxis(CTValAx ctValAx) {
this.ctValAx = ctValAx;
}
@Override
@Internal
public CTShapeProperties getMajorGridLines() {
if (!ctValAx.isSetMajorGridlines()) {
ctValAx.addNewMajorGridlines();
}
if (!ctValAx.getMajorGridlines().isSetSpPr()) {
ctValAx.getMajorGridlines().addNewSpPr();
}
return ctValAx.getMajorGridlines().getSpPr();
}
@Override
@Internal
public CTShapeProperties getLine() {
return ctValAx.getSpPr();
}
@Override
public void crossAxis(XDDFChartAxis axis) {
ctValAx.getCrossAx().setVal(axis.getId());
}
@Override
protected CTUnsignedInt getCTAxId() {
return ctValAx.getAxId();
}
@Override
protected CTAxPos getCTAxPos() {
return ctValAx.getAxPos();
}
@Override
public boolean hasNumberFormat() {
return ctValAx.isSetNumFmt();
}
@Override
protected CTNumFmt getCTNumFmt() {
if (ctValAx.isSetNumFmt()) {
return ctValAx.getNumFmt();
}
return ctValAx.addNewNumFmt();
}
@Override
protected CTScaling getCTScaling() {
return ctValAx.getScaling();
}
@Override
protected CTCrosses getCTCrosses() {
CTCrosses crosses = ctValAx.getCrosses();
if (crosses == null) {
return ctValAx.addNewCrosses();
} else {
return crosses;
}
}
@Override
protected CTBoolean getDelete() {
return ctValAx.getDelete();
}
@Override
protected CTTickMark getMajorCTTickMark() {
return ctValAx.getMajorTickMark();
}
@Override
protected CTTickMark getMinorCTTickMark() {
return ctValAx.getMinorTickMark();
}
public AxisCrossBetween getCrossBetween() {
return AxisCrossBetween.valueOf(ctValAx.getCrossBetween().getVal());
}
public void setCrossBetween(AxisCrossBetween crossBetween) {
ctValAx.getCrossBetween().setVal(crossBetween.underlying);
}
private void initializeAxis(CTPlotArea plotArea, AxisPosition position) {
final long id = getNextAxId(plotArea);
ctValAx = plotArea.addNewValAx();
ctValAx.addNewAxId().setVal(id);
ctValAx.addNewAxPos();
ctValAx.addNewScaling();
ctValAx.addNewCrossBetween();
ctValAx.addNewCrosses();
ctValAx.addNewCrossAx();
ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
ctValAx.addNewDelete();
ctValAx.addNewMajorTickMark();
ctValAx.addNewMinorTickMark();
setPosition(position);
setOrientation(AxisOrientation.MIN_MAX);
setCrossBetween(AxisCrossBetween.MIDPOINT_CATEGORY);
setCrosses(AxisCrosses.AUTO_ZERO);
setVisible(true);
setMajorTickMark(AxisTickMark.CROSS);
setMinorTickMark(AxisTickMark.NONE);
}
}

View File

@ -0,0 +1,41 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.text;
import org.apache.poi.util.Beta;
import org.apache.poi.util.Internal;
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
@Beta
public class XDDFTextBody {
private CTTextBody body;
public XDDFTextBody() {
this(CTTextBody.Factory.newInstance());
}
@Internal
public XDDFTextBody(CTTextBody body) {
this.body = body;
}
@Internal
public CTTextBody getXmlObject() {
return body;
}
}

View File

@ -38,6 +38,7 @@ import org.apache.poi.POIXMLException;
import org.apache.poi.openxml4j.exceptions.OpenXML4JException; import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackageRelationship;
import org.apache.poi.sl.usermodel.MasterSheet; import org.apache.poi.sl.usermodel.MasterSheet;
import org.apache.poi.sl.usermodel.PictureData.PictureType; import org.apache.poi.sl.usermodel.PictureData.PictureType;
import org.apache.poi.sl.usermodel.Resources; import org.apache.poi.sl.usermodel.Resources;
@ -80,6 +81,7 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
private List<XSLFSlide> _slides; private List<XSLFSlide> _slides;
private List<XSLFSlideMaster> _masters; private List<XSLFSlideMaster> _masters;
private List<XSLFPictureData> _pictures; private List<XSLFPictureData> _pictures;
private List<XSLFChart> _charts;
private XSLFTableStyles _tableStyles; private XSLFTableStyles _tableStyles;
private XSLFNotesMaster _notesMaster; private XSLFNotesMaster _notesMaster;
private XSLFCommentAuthors _commentAuthors; private XSLFCommentAuthors _commentAuthors;
@ -93,7 +95,7 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
try { try {
if(getCorePart().getContentType().equals(XSLFRelation.THEME_MANAGER.getContentType())) { if(getCorePart().getContentType().equals(XSLFRelation.THEME_MANAGER.getContentType())) {
rebase(getPackage()); rebase(getPackage());
} }
//build a tree of POIXMLDocumentParts, this presentation being the root //build a tree of POIXMLDocumentParts, this presentation being the root
@ -130,10 +132,16 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
Map<String, XSLFSlideMaster> masterMap = new HashMap<>(); Map<String, XSLFSlideMaster> masterMap = new HashMap<>();
Map<String, XSLFSlide> shIdMap = new HashMap<>(); Map<String, XSLFSlide> shIdMap = new HashMap<>();
Map<String, XSLFChart> chartMap = new HashMap<>();
for (RelationPart rp : getRelationParts()) { for (RelationPart rp : getRelationParts()) {
POIXMLDocumentPart p = rp.getDocumentPart(); POIXMLDocumentPart p = rp.getDocumentPart();
if (p instanceof XSLFSlide) { if (p instanceof XSLFSlide) {
shIdMap.put(rp.getRelationship().getId(), (XSLFSlide) p); shIdMap.put(rp.getRelationship().getId(), (XSLFSlide) p);
for (POIXMLDocumentPart c : p.getRelations()) {
if (c instanceof XSLFChart) {
chartMap.put(c.getPackagePart().getPartName().getName(), (XSLFChart) c);
}
}
} else if (p instanceof XSLFSlideMaster) { } else if (p instanceof XSLFSlideMaster) {
masterMap.put(getRelationId(p), (XSLFSlideMaster) p); masterMap.put(getRelationId(p), (XSLFSlideMaster) p);
} else if (p instanceof XSLFTableStyles){ } else if (p instanceof XSLFTableStyles){
@ -145,6 +153,11 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
} }
} }
_charts = new ArrayList<>(chartMap.size());
for(XSLFChart chart : chartMap.values()) {
_charts.add(chart);
}
_masters = new ArrayList<>(masterMap.size()); _masters = new ArrayList<>(masterMap.size());
for (CTSlideMasterIdListEntry masterId : _presentation.getSldMasterIdLst().getSldMasterIdList()) { for (CTSlideMasterIdListEntry masterId : _presentation.getSldMasterIdLst().getSldMasterIdList()) {
XSLFSlideMaster master = masterMap.get(masterId.getId2()); XSLFSlideMaster master = masterMap.get(masterId.getId2());
@ -208,6 +221,7 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
public XSLFSlide createSlide(XSLFSlideLayout layout) { public XSLFSlide createSlide(XSLFSlideLayout layout) {
int slideNumber = 256, cnt = 1; int slideNumber = 256, cnt = 1;
CTSlideIdList slideList; CTSlideIdList slideList;
XSLFRelation relationType = XSLFRelation.SLIDE;
if (!_presentation.isSetSldIdLst()) { if (!_presentation.isSetSldIdLst()) {
slideList = _presentation.addNewSldIdLst(); slideList = _presentation.addNewSldIdLst();
} else { } else {
@ -217,35 +231,11 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
cnt++; cnt++;
} }
// Bug 55791: We also need to check that the resulting file name is not already taken cnt = findNextAvailableFileNameIndex(relationType, cnt);
// this can happen when removing/adding slides
while(true) {
String slideName = XSLFRelation.SLIDE.getFileName(cnt);
boolean found = false;
for (POIXMLDocumentPart relation : getRelations()) {
if (relation.getPackagePart() != null &&
slideName.equals(relation.getPackagePart().getPartName().getName())) {
// name is taken => try next one
found = true;
break;
}
}
if(!found &&
getPackage().getPartsByName(Pattern.compile(Pattern.quote(slideName))).size() > 0) {
// name is taken => try next one
found = true;
}
if (!found) {
break;
}
cnt++;
}
} }
RelationPart rp = createRelationship( RelationPart rp = createRelationship
XSLFRelation.SLIDE, XSLFFactory.getInstance(), cnt, false); (relationType, XSLFFactory.getInstance(), cnt, false);
XSLFSlide slide = rp.getDocumentPart(); XSLFSlide slide = rp.getDocumentPart();
CTSlideIdListEntry slideId = slideList.addNewSldId(); CTSlideIdListEntry slideId = slideList.addNewSldId();
@ -260,6 +250,35 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
return slide; return slide;
} }
private int findNextAvailableFileNameIndex(XSLFRelation relationType, int idx) {
// Bug 55791: We also need to check that the resulting file name is not already taken
// this can happen when removing/adding slides, notes or charts
while(true) {
String fileName = relationType.getFileName(idx);
boolean found = false;
for (POIXMLDocumentPart relation : getRelations()) {
if (relation.getPackagePart() != null &&
fileName.equals(relation.getPackagePart().getPartName().getName())) {
// name is taken => try next one
found = true;
break;
}
}
if(!found &&
getPackage().getPartsByName(Pattern.compile(Pattern.quote(fileName))).size() > 0) {
// name is taken => try next one
found = true;
}
if (!found) {
break;
}
idx++;
}
return idx;
}
/** /**
* Create a blank slide using the default (first) master. * Create a blank slide using the default (first) master.
*/ */
@ -275,10 +294,27 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
} }
layout = sl[0]; layout = sl[0];
} }
return createSlide(layout); return createSlide(layout);
} }
/**
* Create a blank chart on the given slide.
*/
public XSLFChart createChart(XSLFSlide slide) {
int chartIdx = findNextAvailableFileNameIndex(XSLFRelation.CHART, _charts.size() + 1);
XSLFChart chart = (XSLFChart) createRelationship(XSLFRelation.CHART, XSLFFactory.getInstance(), chartIdx, true).getDocumentPart();
slide.addRelation(null, XSLFRelation.CHART, chart);
createWorkbookRelationship(chart, chartIdx);
_charts.add(chart);
return chart;
}
protected PackageRelationship createWorkbookRelationship(XSLFChart chart, int chartIdx) {
POIXMLDocumentPart worksheet = createRelationship(XSLFChart.WORKBOOK_RELATIONSHIP, XSLFFactory.getInstance(), chartIdx, true).getDocumentPart();
return chart.addRelation(null, XSLFChart.WORKBOOK_RELATIONSHIP, worksheet).getRelationship();
}
/** /**
* Return notes slide for the specified slide or create new if it does not exist yet. * Return notes slide for the specified slide or create new if it does not exist yet.
*/ */
@ -301,39 +337,16 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
createNotesMaster(); createNotesMaster();
} }
Integer slideIndex = XSLFRelation.SLIDE.getFileNameIndex(slide); int slideIndex = XSLFRelation.SLIDE.getFileNameIndex(slide);
// Bug 55791: We also need to check that the resulting file name is not already taken XSLFRelation relationType = XSLFRelation.NOTES;
// this can happen when removing/adding slides slideIndex = findNextAvailableFileNameIndex(relationType, slideIndex);
while(true) {
String slideName = XSLFRelation.NOTES.getFileName(slideIndex);
boolean found = false;
for (POIXMLDocumentPart relation : getRelations()) {
if (relation.getPackagePart() != null &&
slideName.equals(relation.getPackagePart().getPartName().getName())) {
// name is taken => try next one
found = true;
break;
}
}
if(!found &&
getPackage().getPartsByName(Pattern.compile(Pattern.quote(slideName))).size() > 0) {
// name is taken => try next one
found = true;
}
if (!found) {
break;
}
slideIndex++;
}
// add notes slide to presentation // add notes slide to presentation
XSLFNotes notesSlide = (XSLFNotes) createRelationship XSLFNotes notesSlide = (XSLFNotes) createRelationship
(XSLFRelation.NOTES, XSLFFactory.getInstance(), slideIndex); (relationType, XSLFFactory.getInstance(), slideIndex);
// link slide and notes slide with each other // link slide and notes slide with each other
slide.addRelation(null, XSLFRelation.NOTES, notesSlide); slide.addRelation(null, relationType, notesSlide);
notesSlide.addRelation(null, XSLFRelation.NOTES_MASTER, _notesMaster); notesSlide.addRelation(null, XSLFRelation.NOTES_MASTER, _notesMaster);
notesSlide.addRelation(null, XSLFRelation.SLIDE, slide); notesSlide.addRelation(null, XSLFRelation.SLIDE, slide);
@ -404,6 +417,13 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
return _slides; return _slides;
} }
/**
* Return all the charts in the slideshow
*/
public List<XSLFChart> getCharts() {
return _charts;
}
/** /**
* Returns the list of comment authors, if there is one. * Returns the list of comment authors, if there is one.
* Will only be present if at least one slide has comments on it. * Will only be present if at least one slide has comments on it.
@ -444,7 +464,17 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
public XSLFSlide removeSlide(int index){ public XSLFSlide removeSlide(int index){
XSLFSlide slide = _slides.remove(index); XSLFSlide slide = _slides.remove(index);
removeRelation(slide); removeRelation(slide);
_presentation.getSldIdLst().removeSldId(index); _presentation.getSldIdLst().removeSldId(index);
for (POIXMLDocumentPart p : slide.getRelations()) {
if (p instanceof XSLFChart) {
XSLFChart chart = (XSLFChart) p;
slide.removeChartRelation(chart);
_charts.remove(chart);
} else if (p instanceof XSLFSlideLayout) {
XSLFSlideLayout layout = (XSLFSlideLayout) p;
slide.removeLayoutRelation(layout);
}
}
return slide; return slide;
} }

View File

@ -26,15 +26,28 @@ import java.io.OutputStream;
import javax.xml.namespace.QName; import javax.xml.namespace.QName;
import org.apache.poi.POIXMLDocument;
import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.POIXMLException;
import org.apache.poi.POIXMLRelation;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.exceptions.NotOfficeXmlFileException;
import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.util.Beta; import org.apache.poi.util.Beta;
import org.apache.poi.util.Internal; import org.apache.poi.xddf.usermodel.chart.XDDFChart;
import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
import org.apache.poi.xddf.usermodel.chart.XDDFDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
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.chart.CTChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace; import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace;
import org.openxmlformats.schemas.drawingml.x2006.chart.ChartSpaceDocument; import org.openxmlformats.schemas.drawingml.x2006.chart.CTTitle;
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
/** /**
* Represents a Chart in a .pptx presentation * Represents a Chart in a .pptx presentation
@ -42,63 +55,173 @@ import org.openxmlformats.schemas.drawingml.x2006.chart.ChartSpaceDocument;
* *
*/ */
@Beta @Beta
public final class XSLFChart extends POIXMLDocumentPart { public final class XSLFChart extends XDDFChart {
protected static final POIXMLRelation WORKBOOK_RELATIONSHIP = new POIXMLRelation(
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
POIXMLDocument.PACK_OBJECT_REL_TYPE,
"/ppt/embeddings/Microsoft_Excel_Worksheet#.xlsx",
XSSFWorkbook.class
){};
/**
* Root element of the Chart part
*/
private CTChartSpace chartSpace;
/** /**
* The Chart within that * Underlying workbook
*/ */
private CTChart chart; private XSSFWorkbook workbook;
/** /**
* Construct a chart from a package part. * Construct a PresentationML chart.
*/
protected XSLFChart() {
super();
}
/**
* Construct a PresentationML chart from a package part.
* *
* @param part the package part holding the chart data, * @param part the package part holding the chart data,
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code> * the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code>
* *
* @since POI 3.14-Beta1 * @since POI 3.14-Beta1
*/ */
protected XSLFChart(PackagePart part) throws IOException, XmlException { protected XSLFChart(PackagePart part) throws IOException, XmlException {
super(part); super(part);
chartSpace = ChartSpaceDocument.Factory.parse(part.getInputStream(), DEFAULT_XML_OPTIONS).getChartSpace();
chart = chartSpace.getChart();
} }
/** public XSLFTextShape getTitle() {
* Return the underlying CTChartSpace bean, the root element of the Chart part. if (!chart.isSetTitle()) {
* chart.addNewTitle();
* @return the underlying CTChartSpace bean }
*/ final CTTitle title = chart.getTitle();
@Internal if (title.getTx() != null && title.getTx().isSetRich()) {
public CTChartSpace getCTChartSpace(){ return new XSLFTextShape(title, null) {
return chartSpace; @Override
} protected CTTextBody getTextBody(boolean create) {
return title.getTx().getRich();
}
};
} else {
return new XSLFTextShape(title, null) {
@Override
protected CTTextBody getTextBody(boolean create) {
return title.getTxPr();
}
};
}
}
/** public CellReference setSheetTitle(String title) {
* Return the underlying CTChart bean, within the Chart Space XSSFSheet sheet = getSheet();
* sheet.createRow(0).createCell(1).setCellValue(title);
* @return the underlying CTChart bean return new CellReference(sheet.getSheetName(), 0, 1, true, true);
*/ }
@Internal
public CTChart getCTChart(){
return chart;
}
@Override public String formatRange(CellRangeAddress range) {
protected void commit() throws IOException { return range.formatAsString(getSheet().getSheetName(), true);
XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS); }
xmlOptions.setSaveSyntheticDocumentElement(new QName(CTChartSpace.type.getName().getNamespaceURI(), "chartSpace", "c"));
PackagePart part = getPackagePart(); private XSSFSheet getSheet() {
OutputStream out = part.getOutputStream(); XSSFSheet sheet = null;
chartSpace.save(out, xmlOptions); try {
out.close(); sheet = getWorkbook().getSheetAt(0);
} } catch (InvalidFormatException ife) {
} catch (IOException ioe) {
}
return sheet;
}
private PackagePart getWorksheetPart() throws InvalidFormatException {
for (RelationPart part : getRelationParts()) {
if (WORKBOOK_RELATIONSHIP.getRelation().equals(part.getRelationship().getRelationshipType())) {
return getTargetPart(part.getRelationship());
}
}
return null;
}
protected XSSFWorkbook getWorkbook() throws IOException, InvalidFormatException {
if (workbook == null) {
try {
PackagePart worksheetPart = getWorksheetPart();
if (worksheetPart == null) {
workbook = new XSSFWorkbook();
workbook.createSheet();
} else {
workbook = new XSSFWorkbook(worksheetPart.getInputStream());
}
} catch (NotOfficeXmlFileException e) {
workbook = new XSSFWorkbook();
workbook.createSheet();
}
}
return workbook;
}
private XMLSlideShow getSlideShow() {
POIXMLDocumentPart p = getParent();
while(p != null) {
if(p instanceof XMLSlideShow){
return (XMLSlideShow)p;
}
p = p.getParent();
}
throw new IllegalStateException("SlideShow was not found");
}
private PackagePart createWorksheetPart() throws InvalidFormatException {
Integer chartIdx = XSLFRelation.CHART.getFileNameIndex(this);
return getTargetPart(getSlideShow().createWorkbookRelationship(this, chartIdx));
}
protected void saveWorkbook(XSSFWorkbook workbook) throws IOException, InvalidFormatException {
PackagePart worksheetPart = getWorksheetPart();
if (worksheetPart == null) {
worksheetPart = createWorksheetPart();
}
try (OutputStream xlsOut = worksheetPart.getOutputStream()) {
workbook.write(xlsOut);
}
}
private void fillSheet(XSSFSheet sheet, XDDFDataSource<?> categoryData, XDDFNumericalDataSource<?> valuesData) {
int numOfPoints = categoryData.getPointCount();
for (int i = 0; i < numOfPoints; i++) {
XSSFRow row = sheet.createRow(i + 1); // first row is for title
row.createCell(0).setCellValue(categoryData.getPointAt(i).toString());
row.createCell(1).setCellValue(valuesData.getPointAt(i).doubleValue());
}
}
@Override
public void plot(XDDFChartData data) {
super.plot(data);
XSSFSheet sheet = getSheet();
for(XDDFChartData.Series series : data.getSeries()) {
fillSheet(sheet, series.getCategoryData(), series.getValuesData());
}
}
public void importContent(XSLFChart other) {
this.chart.set(other.chart);
}
@Override
protected void commit() throws IOException {
XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
xmlOptions.setSaveSyntheticDocumentElement(new QName(CTChartSpace.type.getName().getNamespaceURI(), "chartSpace", "c"));
if (workbook != null) {
try {
saveWorkbook(workbook);
} catch (InvalidFormatException e) {
throw new POIXMLException(e);
}
}
PackagePart part = getPackagePart();
try (OutputStream out = part.getOutputStream()) {
chartSpace.save(out, xmlOptions);
}
}
} }

View File

@ -20,6 +20,7 @@
package org.apache.poi.xslf.usermodel; package org.apache.poi.xslf.usermodel;
import java.awt.geom.Rectangle2D; import java.awt.geom.Rectangle2D;
import java.io.IOException;
import javax.xml.namespace.QName; import javax.xml.namespace.QName;
@ -102,6 +103,7 @@ public class XSLFGraphicFrame extends XSLFShape implements GraphicalFrame<XSLFSh
* *
* @param theta the rotation angle in degrees. * @param theta the rotation angle in degrees.
*/ */
@Override
public void setRotation(double theta){ public void setRotation(double theta){
throw new IllegalArgumentException("Operation not supported"); throw new IllegalArgumentException("Operation not supported");
} }
@ -115,15 +117,18 @@ public class XSLFGraphicFrame extends XSLFShape implements GraphicalFrame<XSLFSh
* *
* @return rotation angle in degrees * @return rotation angle in degrees
*/ */
public double getRotation(){ @Override
public double getRotation(){
return 0; return 0;
} }
public void setFlipHorizontal(boolean flip){ @Override
public void setFlipHorizontal(boolean flip){
throw new IllegalArgumentException("Operation not supported"); throw new IllegalArgumentException("Operation not supported");
} }
public void setFlipVertical(boolean flip){ @Override
public void setFlipVertical(boolean flip){
throw new IllegalArgumentException("Operation not supported"); throw new IllegalArgumentException("Operation not supported");
} }
@ -132,11 +137,13 @@ public class XSLFGraphicFrame extends XSLFShape implements GraphicalFrame<XSLFSh
* *
* @return whether the shape is horizontally flipped * @return whether the shape is horizontally flipped
*/ */
public boolean getFlipHorizontal(){ @Override
public boolean getFlipHorizontal(){
return false; return false;
} }
public boolean getFlipVertical(){ @Override
public boolean getFlipVertical(){
return false; return false;
} }
@ -148,12 +155,39 @@ public class XSLFGraphicFrame extends XSLFShape implements GraphicalFrame<XSLFSh
String uri = data.getUri(); String uri = data.getUri();
if(uri.equals("http://schemas.openxmlformats.org/drawingml/2006/diagram")){ if(uri.equals("http://schemas.openxmlformats.org/drawingml/2006/diagram")){
copyDiagram(data, (XSLFGraphicFrame)sh); copyDiagram(data, (XSLFGraphicFrame)sh);
} if(uri.equals("http://schemas.openxmlformats.org/drawingml/2006/chart")){
copyChart(data, (XSLFGraphicFrame)sh);
} else { } else {
// TODO support other types of objects // TODO support other types of objects
} }
} }
private void copyChart(CTGraphicalObjectData objData, XSLFGraphicFrame srcShape) {
XSLFSlide slide = (XSLFSlide) getSheet();
XSLFSheet src = srcShape.getSheet();
String xpath = "declare namespace c='http://schemas.openxmlformats.org/drawingml/2006/chart' c:chart";
XmlObject[] obj = objData.selectPath(xpath);
if (obj != null && obj.length == 1) {
XmlCursor c = obj[0].newCursor();
try {
// duplicate chart with embedded workbook
QName idQualifiedName = new QName("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "id");
String id = c.getAttributeText(idQualifiedName);
XSLFChart srcChart = (XSLFChart) src.getRelationById(id);
XSLFChart chartCopy = slide.getSlideShow().createChart(slide);
chartCopy.importContent(srcChart);
chartCopy.saveWorkbook(srcChart.getWorkbook());
c.setAttributeText(idQualifiedName, slide.getRelationId(chartCopy));
} catch (InvalidFormatException e) {
throw new POIXMLException(e);
} catch (IOException e) {
throw new POIXMLException(e);
}
c.dispose();
}
}
// TODO should be moved to a sub-class // TODO should be moved to a sub-class
private void copyDiagram(CTGraphicalObjectData objData, XSLFGraphicFrame srcShape){ private void copyDiagram(CTGraphicalObjectData objData, XSLFGraphicFrame srcShape){
String xpath = "declare namespace dgm='http://schemas.openxmlformats.org/drawingml/2006/diagram' $this//dgm:relIds"; String xpath = "declare namespace dgm='http://schemas.openxmlformats.org/drawingml/2006/diagram' $this//dgm:relIds";
@ -216,4 +250,4 @@ public class XSLFGraphicFrame extends XSLFShape implements GraphicalFrame<XSLFSh
return new XSLFPictureShape(gs.getPicArray(0), getSheet()); return new XSLFPictureShape(gs.getPicArray(0), getSheet());
} }
} }

View File

@ -57,7 +57,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.*;
public abstract class XSLFSheet extends POIXMLDocumentPart public abstract class XSLFSheet extends POIXMLDocumentPart
implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> { implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
private static POILogger LOG = POILogFactory.getLogger(XSLFSheet.class); private static POILogger LOG = POILogFactory.getLogger(XSLFSheet.class);
private XSLFDrawing _drawing; private XSLFDrawing _drawing;
private List<XSLFShape> _shapes; private List<XSLFShape> _shapes;
private CTGroupShape _spTree; private CTGroupShape _spTree;
@ -69,13 +69,13 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
public XSLFSheet() { public XSLFSheet() {
super(); super();
} }
/** /**
* @since POI 3.14-Beta1 * @since POI 3.14-Beta1
*/ */
public XSLFSheet(PackagePart part) { public XSLFSheet(PackagePart part) {
super(part); super(part);
} }
/** /**
* @return the XMLSlideShow this sheet belongs to * @return the XMLSlideShow this sheet belongs to
@ -155,7 +155,7 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
initDrawingAndShapes(); initDrawingAndShapes();
return _shapes; return _shapes;
} }
/** /**
* Helper method for initializing drawing and shapes in one go. * Helper method for initializing drawing and shapes in one go.
* If they are initialized separately, there's a risk that shapes * If they are initialized separately, there's a risk that shapes
@ -255,7 +255,7 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
return sh; return sh;
} }
/** /**
* Returns an iterator over the shapes in this sheet * Returns an iterator over the shapes in this sheet
* *
@ -272,7 +272,7 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
"Adding a shape from a different container is not supported -" "Adding a shape from a different container is not supported -"
+ " create it from scratch witht XSLFSheet.create* methods"); + " create it from scratch witht XSLFSheet.create* methods");
} }
/** /**
* Removes the specified shape from this sheet, if it is present * Removes the specified shape from this sheet, if it is present
* (optional operation). If this sheet does not contain the element, * (optional operation). If this sheet does not contain the element,
@ -356,28 +356,35 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
* @return modified 'this' * @return modified 'this'
*/ */
public XSLFSheet importContent(XSLFSheet src){ public XSLFSheet importContent(XSLFSheet src){
_spTree = null;
// first copy the source xml
getSpTree().set(src.getSpTree().copy());
wipeAndReinitialize(src, 0);
return this;
}
private void wipeAndReinitialize(XSLFSheet src, int offset) {
// explicitly initialize drawing and shapes from _spTree
_shapes = null; _shapes = null;
_spTree = null;
_drawing = null; _drawing = null;
_spTree = null; initDrawingAndShapes();
// placeholders will be implicitly initialized when requested
_placeholders = null; _placeholders = null;
// fix-me: wth would this ever happen to work ... // update each shape according to its own additional copy rules
// first copy the source xml
getSpTree().set(src.getSpTree());
// recursively update each shape
List<XSLFShape> tgtShapes = getShapes(); List<XSLFShape> tgtShapes = getShapes();
List<XSLFShape> srcShapes = src.getShapes(); List<XSLFShape> srcShapes = src.getShapes();
for(int i = 0; i < tgtShapes.size(); i++){ for(int i = 0; i < srcShapes.size(); i++){
XSLFShape s1 = srcShapes.get(i); XSLFShape s1 = srcShapes.get(i);
XSLFShape s2 = tgtShapes.get(i); XSLFShape s2 = tgtShapes.get(offset + i);
s2.copy(s1); s2.copy(s1);
} }
return this;
} }
/** /**
@ -387,39 +394,26 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
* @return modified <code>this</code>. * @return modified <code>this</code>.
*/ */
public XSLFSheet appendContent(XSLFSheet src){ public XSLFSheet appendContent(XSLFSheet src){
CTGroupShape spTree = getSpTree();
int numShapes = getShapes().size(); int numShapes = getShapes().size();
CTGroupShape spTree = getSpTree();
CTGroupShape srcTree = src.getSpTree(); CTGroupShape srcTree = src.getSpTree();
for(XmlObject ch : srcTree.selectPath("*")){ for(XmlObject ch : srcTree.selectPath("*")){
if(ch instanceof CTShape){ // simple shape if(ch instanceof CTShape){ // simple shape
spTree.addNewSp().set(ch); spTree.addNewSp().set(ch.copy());
} else if (ch instanceof CTGroupShape){ } else if (ch instanceof CTGroupShape){
spTree.addNewGrpSp().set(ch); spTree.addNewGrpSp().set(ch.copy());
} else if (ch instanceof CTConnector){ } else if (ch instanceof CTConnector){
spTree.addNewCxnSp().set(ch); spTree.addNewCxnSp().set(ch.copy());
} else if (ch instanceof CTPicture){ } else if (ch instanceof CTPicture){
spTree.addNewPic().set(ch); spTree.addNewPic().set(ch.copy());
} else if (ch instanceof CTGraphicalObjectFrame){ } else if (ch instanceof CTGraphicalObjectFrame){
spTree.addNewGraphicFrame().set(ch); spTree.addNewGraphicFrame().set(ch.copy());
} }
} }
_shapes = null; wipeAndReinitialize(src, numShapes);
_spTree = null;
_drawing = null;
_spTree = null;
_placeholders = null;
// recursively update each shape
List<XSLFShape> tgtShapes = getShapes();
List<XSLFShape> srcShapes = src.getShapes();
for(int i = 0; i < srcShapes.size(); i++){
XSLFShape s1 = srcShapes.get(i);
XSLFShape s2 = tgtShapes.get(numShapes + i);
s2.copy(s1);
}
return this; return this;
} }
@ -430,7 +424,7 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
* method and return the corresponding package part. * method and return the corresponding package part.
*/ */
XSLFTheme getTheme(){ XSLFTheme getTheme(){
return null; return null;
} }
protected XSLFTextShape getTextShapeByType(Placeholder type){ protected XSLFTextShape getTextShapeByType(Placeholder type){
@ -574,7 +568,7 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
PackagePart pic = pictureData.getPackagePart(); PackagePart pic = pictureData.getPackagePart();
RelationPart rp = addRelation(blipId, XSLFRelation.IMAGES, new XSLFPictureData(pic)); RelationPart rp = addRelation(blipId, XSLFRelation.IMAGES, new XSLFPictureData(pic));
return rp.getRelationship().getId(); return rp.getRelationship().getId();
} }
@ -584,13 +578,13 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
PackagePart importPart(PackageRelationship srcRel, PackagePart srcPafrt) { PackagePart importPart(PackageRelationship srcRel, PackagePart srcPafrt) {
PackagePart destPP = getPackagePart(); PackagePart destPP = getPackagePart();
PackagePartName srcPPName = srcPafrt.getPartName(); PackagePartName srcPPName = srcPafrt.getPartName();
OPCPackage pkg = destPP.getPackage(); OPCPackage pkg = destPP.getPackage();
if(pkg.containPart(srcPPName)){ if(pkg.containPart(srcPPName)){
// already exists // already exists
return pkg.getPart(srcPPName); return pkg.getPart(srcPPName);
} }
destPP.addRelationship(srcPPName, TargetMode.INTERNAL, srcRel.getRelationshipType()); destPP.addRelationship(srcPPName, TargetMode.INTERNAL, srcRel.getRelationshipType());
PackagePart part = pkg.createPart(srcPPName, srcPafrt.getContentType()); PackagePart part = pkg.createPart(srcPPName, srcPafrt.getContentType());
@ -605,7 +599,7 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
} }
return part; return part;
} }
/** /**
* Helper method for sheet and group shapes * Helper method for sheet and group shapes
* *
@ -614,4 +608,4 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
void removePictureRelation(XSLFPictureShape pictureShape) { void removePictureRelation(XSLFPictureShape pictureShape) {
removeRelation(pictureShape.getBlipId()); removeRelation(pictureShape.getBlipId());
} }
} }

View File

@ -49,10 +49,10 @@ import org.xml.sax.SAXException;
@Beta @Beta
public final class XSLFSlide extends XSLFSheet public final class XSLFSlide extends XSLFSheet
implements Slide<XSLFShape,XSLFTextParagraph> { implements Slide<XSLFShape,XSLFTextParagraph> {
private final CTSlide _slide; private final CTSlide _slide;
private XSLFSlideLayout _layout; private XSLFSlideLayout _layout;
private XSLFComments _comments; private XSLFComments _comments;
private XSLFNotes _notes; private XSLFNotes _notes;
/** /**
* Create a new slide * Create a new slide
@ -67,7 +67,7 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
* *
* @param part the package part holding the slide data, * @param part the package part holding the slide data,
* the content type must be <code>application/vnd.openxmlformats-officedocument.slide+xml</code> * the content type must be <code>application/vnd.openxmlformats-officedocument.slide+xml</code>
* *
* @since POI 3.14-Beta1 * @since POI 3.14-Beta1
*/ */
XSLFSlide(PackagePart part) throws IOException, XmlException { XSLFSlide(PackagePart part) throws IOException, XmlException {
@ -79,11 +79,11 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
} catch (SAXException e) { } catch (SAXException e) {
throw new IOException(e); throw new IOException(e);
} }
SldDocument doc = SldDocument.Factory.parse(_doc, DEFAULT_XML_OPTIONS); SldDocument doc = SldDocument.Factory.parse(_doc, DEFAULT_XML_OPTIONS);
_slide = doc.getSld(); _slide = doc.getSld();
} }
private static CTSlide prototype(){ private static CTSlide prototype(){
CTSlide ctSlide = CTSlide.Factory.newInstance(); CTSlide ctSlide = CTSlide.Factory.newInstance();
CTCommonSlideData cSld = ctSlide.addNewCSld(); CTCommonSlideData cSld = ctSlide.addNewCSld();
@ -115,13 +115,21 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
} }
@Override @Override
public CTSlide getXmlObject() { public CTSlide getXmlObject() {
return _slide; return _slide;
} }
@Override @Override
protected String getRootElementName(){ protected String getRootElementName(){
return "sld"; return "sld";
}
protected void removeChartRelation(XSLFChart chart) {
removeRelation(chart);
}
protected void removeLayoutRelation(XSLFSlideLayout layout) {
removeRelation(layout, false);
} }
@Override @Override
@ -131,9 +139,9 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
public XSLFSlideLayout getSlideLayout(){ public XSLFSlideLayout getSlideLayout(){
if(_layout == null){ if(_layout == null){
for (POIXMLDocumentPart p : getRelations()) { for (POIXMLDocumentPart p : getRelations()) {
if (p instanceof XSLFSlideLayout){ if (p instanceof XSLFSlideLayout){
_layout = (XSLFSlideLayout)p; _layout = (XSLFSlideLayout)p;
} }
} }
} }
@ -148,36 +156,36 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
} }
public XSLFComments getComments() { public XSLFComments getComments() {
if(_comments == null) { if(_comments == null) {
for (POIXMLDocumentPart p : getRelations()) { for (POIXMLDocumentPart p : getRelations()) {
if (p instanceof XSLFComments) { if (p instanceof XSLFComments) {
_comments = (XSLFComments)p; _comments = (XSLFComments)p;
} }
} }
} }
if(_comments == null) { if(_comments == null) {
// This slide lacks comments // This slide lacks comments
// Not all have them, sorry... // Not all have them, sorry...
return null; return null;
} }
return _comments; return _comments;
} }
@Override @Override
public XSLFNotes getNotes() { public XSLFNotes getNotes() {
if(_notes == null) { if(_notes == null) {
for (POIXMLDocumentPart p : getRelations()) { for (POIXMLDocumentPart p : getRelations()) {
if (p instanceof XSLFNotes){ if (p instanceof XSLFNotes){
_notes = (XSLFNotes)p; _notes = (XSLFNotes)p;
} }
} }
} }
if(_notes == null) { if(_notes == null) {
// This slide lacks notes // This slide lacks notes
// Not all have them, sorry... // Not all have them, sorry...
return null; return null;
} }
return _notes; return _notes;
} }
@Override @Override
@ -185,10 +193,10 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
XSLFTextShape txt = getTextShapeByType(Placeholder.TITLE); XSLFTextShape txt = getTextShapeByType(Placeholder.TITLE);
return txt == null ? null : txt.getText(); return txt == null ? null : txt.getText();
} }
@Override @Override
public XSLFTheme getTheme(){ public XSLFTheme getTheme(){
return getSlideLayout().getSlideMaster().getTheme(); return getSlideLayout().getSlideMaster().getTheme();
} }
/** /**
@ -241,7 +249,7 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
if (bgOther == null) { if (bgOther == null) {
return this; return this;
} }
CTBackground bgThis = _slide.getCSld().getBg(); CTBackground bgThis = _slide.getCSld().getBg();
// remove existing background // remove existing background
if (bgThis != null) { if (bgThis != null) {
@ -251,14 +259,14 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
} }
_slide.getCSld().unsetBg(); _slide.getCSld().unsetBg();
} }
bgThis = (CTBackground)_slide.getCSld().addNewBg().set(bgOther); bgThis = (CTBackground)_slide.getCSld().addNewBg().set(bgOther);
if(bgOther.isSetBgPr() && bgOther.getBgPr().isSetBlipFill()){ if(bgOther.isSetBgPr() && bgOther.getBgPr().isSetBlipFill()){
String idOther = bgOther.getBgPr().getBlipFill().getBlip().getEmbed(); String idOther = bgOther.getBgPr().getBlipFill().getBlip().getEmbed();
String idThis = importBlip(idOther, src.getPackagePart()); String idThis = importBlip(idOther, src.getPackagePart());
bgThis.getBgPr().getBlipFill().getBlip().setEmbed(idThis); bgThis.getBgPr().getBlipFill().getBlip().setEmbed(idThis);
} }
return this; return this;
@ -294,7 +302,7 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
assert(notes instanceof XSLFNotes); assert(notes instanceof XSLFNotes);
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
@Override @Override
public int getSlideNumber() { public int getSlideNumber() {
int idx = getSlideShow().getSlides().indexOf(this); int idx = getSlideShow().getSlides().indexOf(this);

View File

@ -19,7 +19,6 @@ package org.apache.poi.xssf.streaming;
import java.util.Iterator; import java.util.Iterator;
import org.apache.poi.ss.usermodel.Chart;
import org.apache.poi.ss.usermodel.ClientAnchor; import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.Comment; import org.apache.poi.ss.usermodel.Comment;
import org.apache.poi.ss.usermodel.Drawing; import org.apache.poi.ss.usermodel.Drawing;
@ -53,11 +52,6 @@ public class SXSSFDrawing implements Drawing<XSSFShape> {
return _drawing.createCellComment(anchor); return _drawing.createCellComment(anchor);
} }
@Override
public Chart createChart(ClientAnchor anchor) {
return _drawing.createChart(anchor);
}
@Override @Override
public ClientAnchor createAnchor(int dx1, int dy1, int dx2, int dy2, int col1, int row1, int col2, int row2) { public ClientAnchor createAnchor(int dx1, int dy1, int dx2, int dy2, int col1, int row1, int col2, int row2) {
return _drawing.createAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2); return _drawing.createAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2);

View File

@ -26,15 +26,13 @@ import java.util.List;
import javax.xml.namespace.QName; import javax.xml.namespace.QName;
import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.ss.usermodel.Chart; import org.apache.poi.ss.usermodel.Chart;
import org.apache.poi.ss.usermodel.charts.AxisPosition;
import org.apache.poi.ss.usermodel.charts.ChartAxis; import org.apache.poi.ss.usermodel.charts.ChartAxis;
import org.apache.poi.ss.usermodel.charts.ChartAxisFactory; import org.apache.poi.ss.usermodel.charts.ChartAxisFactory;
import org.apache.poi.ss.usermodel.charts.ChartData; import org.apache.poi.ss.usermodel.charts.ChartData;
import org.apache.poi.util.Internal;
import org.apache.poi.util.Removal; import org.apache.poi.util.Removal;
import org.apache.poi.xddf.usermodel.chart.XDDFChart;
import org.apache.poi.xssf.usermodel.charts.XSSFCategoryAxis; import org.apache.poi.xssf.usermodel.charts.XSSFCategoryAxis;
import org.apache.poi.xssf.usermodel.charts.XSSFChartAxis; import org.apache.poi.xssf.usermodel.charts.XSSFChartAxis;
import org.apache.poi.xssf.usermodel.charts.XSSFChartDataFactory; import org.apache.poi.xssf.usermodel.charts.XSSFChartDataFactory;
@ -46,7 +44,6 @@ import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlObject; import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlOptions; import org.apache.xmlbeans.XmlOptions;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTCatAx; import org.openxmlformats.schemas.drawingml.x2006.chart.CTCatAx;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace; import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTDateAx; import org.openxmlformats.schemas.drawingml.x2006.chart.CTDateAx;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPageMargins; import org.openxmlformats.schemas.drawingml.x2006.chart.CTPageMargins;
@ -56,7 +53,6 @@ import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrRef;
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.chart.CTValAx; import org.openxmlformats.schemas.drawingml.x2006.chart.CTValAx;
import org.openxmlformats.schemas.drawingml.x2006.chart.ChartSpaceDocument;
import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun; import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun;
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextField; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextField;
@ -68,139 +64,119 @@ import org.w3c.dom.Text;
/** /**
* Represents a SpreadsheetML Chart * Represents a SpreadsheetML Chart
*/ */
public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartAxisFactory { public final class XSSFChart extends XDDFChart implements Chart, ChartAxisFactory {
/** /**
* Parent graphic frame. * Parent graphic frame.
*/ */
private XSSFGraphicFrame frame; private XSSFGraphicFrame frame;
/** @Deprecated
* Root element of the SpreadsheetML Chart part @Removal(version="4.2")
*/ List<XSSFChartAxis> axis = new ArrayList<>();
private CTChartSpace chartSpace;
/**
* The Chart within that
*/
private CTChart chart;
List<XSSFChartAxis> axis = new ArrayList<>(); /**
* Create a new SpreadsheetML chart
*/
protected XSSFChart() {
super();
createChart();
}
/** /**
* Create a new SpreadsheetML chart * Construct a SpreadsheetML chart from a package part.
*/ *
protected XSSFChart() { * @param part
super(); * the package part holding the chart data, the content type must be
createChart(); * <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code>
} *
* @since POI 3.14-Beta1
*/
protected XSSFChart(PackagePart part) throws IOException, XmlException {
super(part);
}
/** /**
* Construct a SpreadsheetML chart from a package part. * Construct a new CTChartSpace bean. By default, it's just an empty placeholder for chart objects.
* */
* @param part the package part holding the chart data, private void createChart() {
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code> CTPlotArea plotArea = getCTPlotArea();
*
* @since POI 3.14-Beta1
*/
protected XSSFChart(PackagePart part) throws IOException, XmlException {
super(part);
chartSpace = ChartSpaceDocument.Factory.parse(part.getInputStream(), DEFAULT_XML_OPTIONS).getChartSpace(); plotArea.addNewLayout();
chart = chartSpace.getChart(); chart.addNewPlotVisOnly().setVal(true);
}
/**
* Construct a new CTChartSpace bean.
* By default, it's just an empty placeholder for chart objects.
*/
private void createChart() {
chartSpace = CTChartSpace.Factory.newInstance();
chart = chartSpace.addNewChart();
CTPlotArea plotArea = chart.addNewPlotArea();
plotArea.addNewLayout(); CTPrintSettings printSettings = chartSpace.addNewPrintSettings();
chart.addNewPlotVisOnly().setVal(true); printSettings.addNewHeaderFooter();
CTPrintSettings printSettings = chartSpace.addNewPrintSettings(); CTPageMargins pageMargins = printSettings.addNewPageMargins();
printSettings.addNewHeaderFooter(); pageMargins.setB(0.75);
pageMargins.setL(0.70);
pageMargins.setR(0.70);
pageMargins.setT(0.75);
pageMargins.setHeader(0.30);
pageMargins.setFooter(0.30);
printSettings.addNewPageSetup();
}
CTPageMargins pageMargins = printSettings.addNewPageMargins(); @Override
pageMargins.setB(0.75); protected void commit() throws IOException {
pageMargins.setL(0.70); XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
pageMargins.setR(0.70);
pageMargins.setT(0.75);
pageMargins.setHeader(0.30);
pageMargins.setFooter(0.30);
printSettings.addNewPageSetup();
}
/** /*
* Return the underlying CTChartSpace bean, the root element of the SpreadsheetML Chart part. * Saved chart space must have the following namespaces set: <c:chartSpace
* * xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart"
* @return the underlying CTChartSpace bean * xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r=
*/ * "http://schemas.openxmlformats.org/officeDocument/2006/relationships">
@Internal */
public CTChartSpace getCTChartSpace(){ xmlOptions.setSaveSyntheticDocumentElement(new QName(CTChartSpace.type.getName().getNamespaceURI(), "chartSpace", "c"));
return chartSpace;
}
/** PackagePart part = getPackagePart();
* Return the underlying CTChart bean, within the Chart Space try (OutputStream out = part.getOutputStream()) {
* chartSpace.save(out, xmlOptions);
* @return the underlying CTChart bean }
*/ }
@Internal
public CTChart getCTChart(){
return chart;
}
@Override /**
protected void commit() throws IOException { * Returns the parent graphic frame.
XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS); *
* @return the graphic frame this chart belongs to
*/
public XSSFGraphicFrame getGraphicFrame() {
return frame;
}
/* /**
Saved chart space must have the following namespaces set: * Sets the parent graphic frame.
<c:chartSpace */
xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart" protected void setGraphicFrame(XSSFGraphicFrame frame) {
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" this.frame = frame;
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"> }
*/
xmlOptions.setSaveSyntheticDocumentElement(new QName(CTChartSpace.type.getName().getNamespaceURI(), "chartSpace", "c"));
PackagePart part = getPackagePart();
OutputStream out = part.getOutputStream();
chartSpace.save(out, xmlOptions);
out.close();
}
/**
* Returns the parent graphic frame.
* @return the graphic frame this chart belongs to
*/
public XSSFGraphicFrame getGraphicFrame() {
return frame;
}
/**
* Sets the parent graphic frame.
*/
protected void setGraphicFrame(XSSFGraphicFrame frame) {
this.frame = frame;
}
@Override
@Deprecated
@Removal(version="4.2")
public XSSFChartDataFactory getChartDataFactory() { public XSSFChartDataFactory getChartDataFactory() {
return XSSFChartDataFactory.getInstance(); return XSSFChartDataFactory.getInstance();
} }
@Override
@Deprecated
@Removal(version="4.2")
public XSSFChart getChartAxisFactory() { public XSSFChart getChartAxisFactory() {
return this; return this;
} }
@Override
@Deprecated
@Removal(version="4.2")
public void plot(ChartData data, ChartAxis... chartAxis) { public void plot(ChartData data, ChartAxis... chartAxis) {
data.fillChart(this, chartAxis); data.fillChart(this, chartAxis);
} }
public XSSFValueAxis createValueAxis(AxisPosition pos) { @Override
@Deprecated
@Removal(version="4.2")
public XSSFValueAxis createValueAxis(org.apache.poi.ss.usermodel.charts.AxisPosition pos) {
long id = axis.size() + 1; long id = axis.size() + 1;
XSSFValueAxis valueAxis = new XSSFValueAxis(this, id, pos); XSSFValueAxis valueAxis = new XSSFValueAxis(this, id, pos);
if (axis.size() == 1) { if (axis.size() == 1) {
@ -212,7 +188,10 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
return valueAxis; return valueAxis;
} }
public XSSFCategoryAxis createCategoryAxis(AxisPosition pos) { @Override
@Deprecated
@Removal(version="4.2")
public XSSFCategoryAxis createCategoryAxis(org.apache.poi.ss.usermodel.charts.AxisPosition pos) {
long id = axis.size() + 1; long id = axis.size() + 1;
XSSFCategoryAxis categoryAxis = new XSSFCategoryAxis(this, id, pos); XSSFCategoryAxis categoryAxis = new XSSFCategoryAxis(this, id, pos);
if (axis.size() == 1) { if (axis.size() == 1) {
@ -224,45 +203,41 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
return categoryAxis; return categoryAxis;
} }
public XSSFDateAxis createDateAxis(AxisPosition pos) { @Override
long id = axis.size() + 1; @Deprecated
XSSFDateAxis dateAxis = new XSSFDateAxis(this, id, pos); @Removal(version="4.2")
if (axis.size() == 1) { public XSSFDateAxis createDateAxis(org.apache.poi.ss.usermodel.charts.AxisPosition pos) {
ChartAxis ax = axis.get(0); long id = axis.size() + 1;
ax.crossAxis(dateAxis); XSSFDateAxis dateAxis = new XSSFDateAxis(this, id, pos);
dateAxis.crossAxis(ax); if (axis.size() == 1) {
} ChartAxis ax = axis.get(0);
axis.add(dateAxis); ax.crossAxis(dateAxis);
return dateAxis; dateAxis.crossAxis(ax);
}
axis.add(dateAxis);
return dateAxis;
} }
/**
* @deprecated use {@link getAxes} instead
*/
@Override
@Deprecated
@Removal(version="4.2")
public List<? extends XSSFChartAxis> getAxis() { public List<? extends XSSFChartAxis> getAxis() {
if (axis.isEmpty() && hasAxis()) { if (axis.isEmpty() && hasAxis()) {
parseAxis(); parseAxis();
} }
return axis; return axis;
} }
@Override
@Deprecated
@Removal(version="4.2")
public XSSFManualLayout getManualLayout() { public XSSFManualLayout getManualLayout() {
return new XSSFManualLayout(this); return new XSSFManualLayout(this);
} }
/**
* @return true if only visible cells will be present on the chart,
* false otherwise
*/
public boolean isPlotOnlyVisibleCells() {
return chart.getPlotVisOnly().getVal();
}
/**
* @param plotVisOnly a flag specifying if only visible cells should be
* present on the chart
*/
public void setPlotOnlyVisibleCells(boolean plotVisOnly) {
chart.getPlotVisOnly().setVal(plotVisOnly);
}
/** /**
* Returns the title static text, or null if none is set. * Returns the title static text, or null if none is set.
* Note that a title formula may be set instead. * Note that a title formula may be set instead.
@ -274,14 +249,14 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
public XSSFRichTextString getTitle() { public XSSFRichTextString getTitle() {
return getTitleText(); return getTitleText();
} }
/** /**
* Returns the title static text, or null if none is set. * Returns the title static text, or null if none is set.
* Note that a title formula may be set instead. * Note that a title formula may be set instead.
* Empty text result is for backward compatibility, and could mean the title text is empty or there is a formula instead. * Empty text result is for backward compatibility, and could mean the title text is empty or there is a formula instead.
* Check for a formula first, falling back on text for cleaner logic. * Check for a formula first, falling back on text for cleaner logic.
* @return static title text if set, * @return static title text if set,
* null if there is no title, * null if there is no title,
* empty string if the title text is empty or the title uses a formula instead * empty string if the title text is empty or the title uses a formula instead
*/ */
public XSSFRichTextString getTitleText() { public XSSFRichTextString getTitleText() {
@ -295,8 +270,8 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
StringBuilder text = new StringBuilder(64); StringBuilder text = new StringBuilder(64);
XmlObject[] t = title XmlObject[] t = title
.selectPath("declare namespace a='"+XSSFDrawing.NAMESPACE_A+"' .//a:t"); .selectPath("declare namespace a='"+XSSFDrawing.NAMESPACE_A+"' .//a:t");
for (int m = 0; m < t.length; m++) { for (XmlObject element : t) {
NodeList kids = t[m].getDomNode().getChildNodes(); NodeList kids = element.getDomNode().getChildNodes();
final int count = kids.getLength(); final int count = kids.getLength();
for (int n = 0; n < count; n++) { for (int n = 0; n < count; n++) {
Node kid = kids.item(n); Node kid = kids.item(n);
@ -315,161 +290,169 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
* @deprecated POI 3.16, use {@link #setTitleText(String)} instead. * @deprecated POI 3.16, use {@link #setTitleText(String)} instead.
*/ */
@Deprecated @Deprecated
@Removal(version="4.0") @Removal(version = "4.0")
public void setTitle(String newTitle) { public void setTitle(String newTitle) {
} }
/** /**
* Sets the title text as a static string. * Sets the title text as a static string.
* @param newTitle to use *
* @param newTitle
* to use
*/ */
public void setTitleText(String newTitle) { public void setTitleText(String newTitle) {
CTTitle ctTitle; CTTitle ctTitle;
if (chart.isSetTitle()) { if (chart.isSetTitle()) {
ctTitle = chart.getTitle(); ctTitle = chart.getTitle();
} else { } else {
ctTitle = chart.addNewTitle(); ctTitle = chart.addNewTitle();
} }
CTTx tx; CTTx tx;
if (ctTitle.isSetTx()) { if (ctTitle.isSetTx()) {
tx = ctTitle.getTx(); tx = ctTitle.getTx();
} else { } else {
tx = ctTitle.addNewTx(); tx = ctTitle.addNewTx();
} }
if (tx.isSetStrRef()) { if (tx.isSetStrRef()) {
tx.unsetStrRef(); tx.unsetStrRef();
} }
CTTextBody rich; CTTextBody rich;
if (tx.isSetRich()) { if (tx.isSetRich()) {
rich = tx.getRich(); rich = tx.getRich();
} else { } else {
rich = tx.addNewRich(); rich = tx.addNewRich();
rich.addNewBodyPr(); // body properties must exist (but can be empty) rich.addNewBodyPr(); // body properties must exist (but can be
} // empty)
}
CTTextParagraph para; CTTextParagraph para;
if (rich.sizeOfPArray() > 0) { if (rich.sizeOfPArray() > 0) {
para = rich.getPArray(0); para = rich.getPArray(0);
} else { } else {
para = rich.addNewP(); para = rich.addNewP();
} }
if (para.sizeOfRArray() > 0) { if (para.sizeOfRArray() > 0) {
CTRegularTextRun run = para.getRArray(0); CTRegularTextRun run = para.getRArray(0);
run.setT(newTitle); run.setT(newTitle);
} else if (para.sizeOfFldArray() > 0) { } else if (para.sizeOfFldArray() > 0) {
CTTextField fld = para.getFldArray(0); CTTextField fld = para.getFldArray(0);
fld.setT(newTitle); fld.setT(newTitle);
} else { } else {
CTRegularTextRun run = para.addNewR(); CTRegularTextRun run = para.addNewR();
run.setT(newTitle); run.setT(newTitle);
} }
} }
/**
* Get the chart title formula expression if there is one
* @return formula expression or null
*/
public String getTitleFormula() {
if(! chart.isSetTitle()) {
return null;
}
CTTitle title = chart.getTitle(); /**
* Get the chart title formula expression if there is one
if (! title.isSetTx()) { *
return null; * @return formula expression or null
} */
public String getTitleFormula() {
CTTx tx = title.getTx(); if (!chart.isSetTitle()) {
return null;
if (! tx.isSetStrRef()) { }
return null;
}
return tx.getStrRef().getF();
}
/**
* Set the formula expression to use for the chart title
* @param formula
*/
public void setTitleFormula(String formula) {
CTTitle ctTitle;
if (chart.isSetTitle()) {
ctTitle = chart.getTitle();
} else {
ctTitle = chart.addNewTitle();
}
CTTx tx; CTTitle title = chart.getTitle();
if (ctTitle.isSetTx()) {
tx = ctTitle.getTx();
} else {
tx = ctTitle.addNewTx();
}
if (tx.isSetRich()) { if (!title.isSetTx()) {
tx.unsetRich(); return null;
} }
CTStrRef strRef;
if (tx.isSetStrRef()) {
strRef = tx.getStrRef();
} else {
strRef = tx.addNewStrRef();
}
strRef.setF(formula);
}
CTTx tx = title.getTx();
if (!tx.isSetStrRef()) {
return null;
}
return tx.getStrRef().getF();
}
/**
* Set the formula expression to use for the chart title
*
* @param formula
*/
public void setTitleFormula(String formula) {
CTTitle ctTitle;
if (chart.isSetTitle()) {
ctTitle = chart.getTitle();
} else {
ctTitle = chart.addNewTitle();
}
CTTx tx;
if (ctTitle.isSetTx()) {
tx = ctTitle.getTx();
} else {
tx = ctTitle.addNewTx();
}
if (tx.isSetRich()) {
tx.unsetRich();
}
CTStrRef strRef;
if (tx.isSetStrRef()) {
strRef = tx.getStrRef();
} else {
strRef = tx.addNewStrRef();
}
strRef.setF(formula);
}
@Override
@Deprecated
@Removal(version="4.2")
public XSSFChartLegend getOrCreateLegend() { public XSSFChartLegend getOrCreateLegend() {
return new XSSFChartLegend(this); return new XSSFChartLegend(this);
} }
public void deleteLegend() { @Deprecated
if (chart.isSetLegend()) { @Removal(version="4.2")
chart.unsetLegend();
}
}
private boolean hasAxis() { private boolean hasAxis() {
CTPlotArea ctPlotArea = chart.getPlotArea(); CTPlotArea ctPlotArea = chart.getPlotArea();
int totalAxisCount = int totalAxisCount = ctPlotArea.sizeOfValAxArray() + ctPlotArea.sizeOfCatAxArray() + ctPlotArea.sizeOfDateAxArray() + ctPlotArea.sizeOfSerAxArray();
ctPlotArea.sizeOfValAxArray() + return totalAxisCount > 0;
ctPlotArea.sizeOfCatAxArray() +
ctPlotArea.sizeOfDateAxArray() +
ctPlotArea.sizeOfSerAxArray();
return totalAxisCount > 0;
} }
private void parseAxis() { @Deprecated
// TODO: add other axis types @Removal(version="4.2")
parseCategoryAxis(); private void parseAxis() {
parseDateAxis(); // TODO: add other axis types
parseValueAxis(); parseCategoryAxis();
} parseDateAxis();
parseValueAxis();
}
private void parseCategoryAxis() { @Deprecated
for (CTCatAx catAx : chart.getPlotArea().getCatAxArray()) { @Removal(version="4.2")
axis.add(new XSSFCategoryAxis(this, catAx)); private void parseCategoryAxis() {
} for (CTCatAx catAx : chart.getPlotArea().getCatAxArray()) {
} axis.add(new XSSFCategoryAxis(this, catAx));
}
}
private void parseDateAxis() { @Deprecated
for (CTDateAx dateAx : chart.getPlotArea().getDateAxArray()) { @Removal(version="4.2")
axis.add(new XSSFDateAxis(this, dateAx)); private void parseDateAxis() {
} for (CTDateAx dateAx : chart.getPlotArea().getDateAxArray()) {
} axis.add(new XSSFDateAxis(this, dateAx));
}
private void parseValueAxis() { }
for (CTValAx valAx : chart.getPlotArea().getValAxArray()) {
axis.add(new XSSFValueAxis(this, valAx)); @Deprecated
} @Removal(version="4.2")
} private void parseValueAxis() {
for (CTValAx valAx : chart.getPlotArea().getValAxArray()) {
axis.add(new XSSFValueAxis(this, valAx));
}
}
} }

View File

@ -239,7 +239,12 @@ public final class XSSFDrawing extends POIXMLDocumentPart implements Drawing<XSS
return chart; return chart;
} }
@Override /**
* Creates a chart.
* @param anchor the client anchor describes how this chart is attached to
* the sheet.
* @return the newly created chart
*/
public XSSFChart createChart(ClientAnchor anchor) { public XSSFChart createChart(ClientAnchor anchor) {
return createChart((XSSFClientAnchor)anchor); return createChart((XSSFClientAnchor)anchor);
} }
@ -389,7 +394,7 @@ public final class XSSFDrawing extends POIXMLDocumentPart implements Drawing<XSS
/* /*
* The shape id of the ole object seems to be a legacy shape id. * The shape id of the ole object seems to be a legacy shape id.
* *
* see 5.3.2.1 legacyDrawing (Legacy Drawing Object): * see 5.3.2.1 legacyDrawing (Legacy Drawing Object):
* Legacy Shape ID that is unique throughout the entire document. * Legacy Shape ID that is unique throughout the entire document.
* Legacy shape IDs should be assigned based on which portion of the document the * Legacy shape IDs should be assigned based on which portion of the document the
@ -439,7 +444,7 @@ public final class XSSFDrawing extends POIXMLDocumentPart implements Drawing<XSS
cur1.insertAttributeWithValue("moveWithCells", "1"); cur1.insertAttributeWithValue("moveWithCells", "1");
CTTwoCellAnchor ctAnchor = createTwoCellAnchor((XSSFClientAnchor)anchor); CTTwoCellAnchor ctAnchor = createTwoCellAnchor((XSSFClientAnchor)anchor);
XmlCursor cur2 = ctAnchor.newCursor(); XmlCursor cur2 = ctAnchor.newCursor();
cur2.copyXmlContents(cur1); cur2.copyXmlContents(cur1);
cur2.dispose(); cur2.dispose();
@ -456,12 +461,12 @@ public final class XSSFDrawing extends POIXMLDocumentPart implements Drawing<XSS
CTShape ctShape = ctAnchor.addNewSp(); CTShape ctShape = ctAnchor.addNewSp();
ctShape.set(XSSFObjectData.prototype()); ctShape.set(XSSFObjectData.prototype());
ctShape.getSpPr().setXfrm(createXfrm((XSSFClientAnchor)anchor)); ctShape.getSpPr().setXfrm(createXfrm((XSSFClientAnchor)anchor));
// workaround for not having the vmlDrawing filled // workaround for not having the vmlDrawing filled
CTBlipFillProperties blipFill = ctShape.getSpPr().addNewBlipFill(); CTBlipFillProperties blipFill = ctShape.getSpPr().addNewBlipFill();
blipFill.addNewBlip().setEmbed(imgDrawPR.getId()); blipFill.addNewBlip().setEmbed(imgDrawPR.getId());
blipFill.addNewStretch().addNewFillRect(); blipFill.addNewStretch().addNewFillRect();
CTNonVisualDrawingProps cNvPr = ctShape.getNvSpPr().getCNvPr(); CTNonVisualDrawingProps cNvPr = ctShape.getNvSpPr().getCNvPr();
cNvPr.setId(shapeId); cNvPr.setId(shapeId);
cNvPr.setName("Object "+shapeId); cNvPr.setName("Object "+shapeId);

View File

@ -20,27 +20,36 @@ package org.apache.poi.xssf.usermodel.charts;
import org.apache.poi.ss.usermodel.charts.ChartSeries; import org.apache.poi.ss.usermodel.charts.ChartSeries;
import org.apache.poi.ss.usermodel.charts.TitleType; import org.apache.poi.ss.usermodel.charts.TitleType;
import org.apache.poi.ss.util.CellReference; import org.apache.poi.ss.util.CellReference;
import org.apache.poi.util.Removal;
import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx; import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx;
/** /**
* Base of all XSSF Chart Series * Base of all XSSF Chart Series
*
* @deprecated use {@link XDDFChartData.Series} instead
*/ */
@Deprecated
@Removal(version="4.2")
public abstract class AbstractXSSFChartSeries implements ChartSeries { public abstract class AbstractXSSFChartSeries implements ChartSeries {
private String titleValue; private String titleValue;
private CellReference titleRef; private CellReference titleRef;
private TitleType titleType; private TitleType titleType;
@Override
public void setTitle(CellReference titleReference) { public void setTitle(CellReference titleReference) {
titleType = TitleType.CELL_REFERENCE; titleType = TitleType.CELL_REFERENCE;
titleRef = titleReference; titleRef = titleReference;
} }
@Override
public void setTitle(String title) { public void setTitle(String title) {
titleType = TitleType.STRING; titleType = TitleType.STRING;
titleValue = title; titleValue = title;
} }
@Override
public CellReference getTitleCellReference() { public CellReference getTitleCellReference() {
if (TitleType.CELL_REFERENCE.equals(titleType)) { if (TitleType.CELL_REFERENCE.equals(titleType)) {
return titleRef; return titleRef;
@ -48,6 +57,7 @@ public abstract class AbstractXSSFChartSeries implements ChartSeries {
throw new IllegalStateException("Title type is not CellReference."); throw new IllegalStateException("Title type is not CellReference.");
} }
@Override
public String getTitleString() { public String getTitleString() {
if (TitleType.STRING.equals(titleType)) { if (TitleType.STRING.equals(titleType)) {
return titleValue; return titleValue;
@ -55,6 +65,7 @@ public abstract class AbstractXSSFChartSeries implements ChartSeries {
throw new IllegalStateException("Title type is not String."); throw new IllegalStateException("Title type is not String.");
} }
@Override
public TitleType getTitleType() { public TitleType getTitleType() {
return titleType; return titleType;
} }

View File

@ -22,8 +22,9 @@ import org.apache.poi.ss.usermodel.charts.AxisOrientation;
import org.apache.poi.ss.usermodel.charts.AxisPosition; import org.apache.poi.ss.usermodel.charts.AxisPosition;
import org.apache.poi.ss.usermodel.charts.AxisTickMark; import org.apache.poi.ss.usermodel.charts.AxisTickMark;
import org.apache.poi.ss.usermodel.charts.ChartAxis; import org.apache.poi.ss.usermodel.charts.ChartAxis;
import org.apache.poi.util.Beta;
import org.apache.poi.util.Internal; import org.apache.poi.util.Internal;
import org.apache.poi.util.Removal;
import org.apache.poi.xddf.usermodel.chart.XDDFCategoryAxis;
import org.apache.poi.xssf.usermodel.XSSFChart; import org.apache.poi.xssf.usermodel.XSSFChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos; import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean; import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
@ -39,9 +40,10 @@ import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
/** /**
* Category axis type. * Category axis type.
* *
* @author Martin Andersson * @deprecated use {@link XDDFCategoryAxis} instead
*/ */
@Beta @Deprecated
@Removal(version="4.2")
public class XSSFCategoryAxis extends XSSFChartAxis { public class XSSFCategoryAxis extends XSSFChartAxis {
private CTCatAx ctCatAx; private CTCatAx ctCatAx;
@ -66,7 +68,7 @@ public class XSSFCategoryAxis extends XSSFChartAxis {
public CTShapeProperties getLine() { public CTShapeProperties getLine() {
return ctCatAx.getSpPr(); return ctCatAx.getSpPr();
} }
@Override @Override
protected CTAxPos getCTAxPos() { protected CTAxPos getCTAxPos() {
return ctCatAx.getAxPos(); return ctCatAx.getAxPos();
@ -110,7 +112,7 @@ public class XSSFCategoryAxis extends XSSFChartAxis {
public CTChartLines getMajorGridLines() { public CTChartLines getMajorGridLines() {
return ctCatAx.getMajorGridlines(); return ctCatAx.getMajorGridlines();
} }
@Override @Override
public void crossAxis(ChartAxis axis) { public void crossAxis(ChartAxis axis) {
ctCatAx.getCrossAx().setVal(axis.getId()); ctCatAx.getCrossAx().setVal(axis.getId());

View File

@ -22,8 +22,9 @@ import org.apache.poi.ss.usermodel.charts.AxisOrientation;
import org.apache.poi.ss.usermodel.charts.AxisPosition; import org.apache.poi.ss.usermodel.charts.AxisPosition;
import org.apache.poi.ss.usermodel.charts.AxisTickMark; import org.apache.poi.ss.usermodel.charts.AxisTickMark;
import org.apache.poi.ss.usermodel.charts.ChartAxis; import org.apache.poi.ss.usermodel.charts.ChartAxis;
import org.apache.poi.util.Beta;
import org.apache.poi.util.Internal; import org.apache.poi.util.Internal;
import org.apache.poi.util.Removal;
import org.apache.poi.xddf.usermodel.chart.XDDFChartAxis;
import org.apache.poi.xssf.usermodel.XSSFChart; import org.apache.poi.xssf.usermodel.XSSFChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos; import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean; import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
@ -43,9 +44,10 @@ import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
/** /**
* Base class for all axis types. * Base class for all axis types.
* *
* @author Roman Kashitsyn * @deprecated use {@link XDDFChartAxis} instead
*/ */
@Beta @Deprecated
@Removal(version="4.2")
public abstract class XSSFChartAxis implements ChartAxis { public abstract class XSSFChartAxis implements ChartAxis {
protected XSSFChart chart; protected XSSFChart chart;
@ -221,7 +223,7 @@ public abstract class XSSFChartAxis implements ChartAxis {
protected abstract CTTickMark getMinorCTTickMark(); protected abstract CTTickMark getMinorCTTickMark();
@Internal public abstract CTChartLines getMajorGridLines(); @Internal public abstract CTChartLines getMajorGridLines();
@Internal public abstract CTShapeProperties getLine(); @Internal public abstract CTShapeProperties getLine();
private static STOrientation.Enum fromAxisOrientation(AxisOrientation orientation) { private static STOrientation.Enum fromAxisOrientation(AxisOrientation orientation) {
switch (orientation) { switch (orientation) {
case MIN_MAX: return STOrientation.MIN_MAX; case MIN_MAX: return STOrientation.MIN_MAX;

View File

@ -17,13 +17,14 @@
package org.apache.poi.xssf.usermodel.charts; package org.apache.poi.xssf.usermodel.charts;
import org.apache.poi.ss.usermodel.charts.*; import org.apache.poi.ss.usermodel.charts.ChartDataFactory;
import org.apache.poi.util.Beta; import org.apache.poi.util.Removal;
/** /**
* @author Roman Kashitsyn * @deprecated
*/ */
@Beta @Deprecated
@Removal(version="4.2")
public class XSSFChartDataFactory implements ChartDataFactory { public class XSSFChartDataFactory implements ChartDataFactory {
private static XSSFChartDataFactory instance; private static XSSFChartDataFactory instance;
@ -35,14 +36,16 @@ public class XSSFChartDataFactory implements ChartDataFactory {
/** /**
* @return new scatter charts data instance * @return new scatter charts data instance
*/ */
public XSSFScatterChartData createScatterChartData() { @Override
public XSSFScatterChartData createScatterChartData() {
return new XSSFScatterChartData(); return new XSSFScatterChartData();
} }
/** /**
* @return new line charts data instance * @return new line charts data instance
*/ */
public XSSFLineChartData createLineChartData() { @Override
public XSSFLineChartData createLineChartData() {
return new XSSFLineChartData(); return new XSSFLineChartData();
} }

View File

@ -17,10 +17,11 @@
package org.apache.poi.xssf.usermodel.charts; package org.apache.poi.xssf.usermodel.charts;
import org.apache.poi.util.Beta;
import org.apache.poi.util.Internal;
import org.apache.poi.ss.usermodel.charts.ChartLegend; import org.apache.poi.ss.usermodel.charts.ChartLegend;
import org.apache.poi.ss.usermodel.charts.LegendPosition; import org.apache.poi.ss.usermodel.charts.LegendPosition;
import org.apache.poi.util.Internal;
import org.apache.poi.util.Removal;
import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend;
import org.apache.poi.xssf.usermodel.XSSFChart; import org.apache.poi.xssf.usermodel.XSSFChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart; import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLegend; import org.openxmlformats.schemas.drawingml.x2006.chart.CTLegend;
@ -29,10 +30,10 @@ import org.openxmlformats.schemas.drawingml.x2006.chart.STLegendPos;
/** /**
* Represents a SpreadsheetML chart legend * Represents a SpreadsheetML chart legend
* @author Roman Kashitsyn * @deprecated use {@link XDDFChartLegend} instead
* @author Martin Andersson
*/ */
@Beta @Deprecated
@Removal(version="4.2")
public final class XSSFChartLegend implements ChartLegend { public final class XSSFChartLegend implements ChartLegend {
/** /**
@ -72,7 +73,8 @@ public final class XSSFChartLegend implements ChartLegend {
return legend; return legend;
} }
public void setPosition(LegendPosition position) { @Override
public void setPosition(LegendPosition position) {
if (!legend.isSetLegendPos()) { if (!legend.isSetLegendPos()) {
legend.addNewLegendPos(); legend.addNewLegendPos();
} }
@ -82,7 +84,8 @@ public final class XSSFChartLegend implements ChartLegend {
/* /*
* According to ECMA-376 default position is RIGHT. * According to ECMA-376 default position is RIGHT.
*/ */
public LegendPosition getPosition() { @Override
public LegendPosition getPosition() {
if (legend.isSetLegendPos()) { if (legend.isSetLegendPos()) {
return toLegendPosition(legend.getLegendPos()); return toLegendPosition(legend.getLegendPos());
} else { } else {
@ -90,18 +93,21 @@ public final class XSSFChartLegend implements ChartLegend {
} }
} }
public XSSFManualLayout getManualLayout() { @Override
public XSSFManualLayout getManualLayout() {
if (!legend.isSetLayout()) { if (!legend.isSetLayout()) {
legend.addNewLayout(); legend.addNewLayout();
} }
return new XSSFManualLayout(legend.getLayout()); return new XSSFManualLayout(legend.getLayout());
} }
public boolean isOverlay() { @Override
public boolean isOverlay() {
return legend.getOverlay().getVal(); return legend.getOverlay().getVal();
} }
public void setOverlay(boolean value) { @Override
public void setOverlay(boolean value) {
legend.getOverlay().setVal(value); legend.getOverlay().setVal(value);
} }

View File

@ -20,13 +20,23 @@
package org.apache.poi.xssf.usermodel.charts; package org.apache.poi.xssf.usermodel.charts;
import org.apache.poi.ss.usermodel.charts.ChartDataSource; import org.apache.poi.ss.usermodel.charts.ChartDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.*; import org.apache.poi.util.Removal;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumData;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumRef;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumVal;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrData;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrRef;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrVal;
/** /**
* Package private class with utility methods. * Package private class with utility methods.
* *
* @author Roman Kashitsyn * @deprecated
*/ */
@Deprecated
@Removal(version="4.2")
class XSSFChartUtil { class XSSFChartUtil {
private XSSFChartUtil() {} private XSSFChartUtil() {}

View File

@ -22,8 +22,9 @@ import org.apache.poi.ss.usermodel.charts.AxisOrientation;
import org.apache.poi.ss.usermodel.charts.AxisPosition; import org.apache.poi.ss.usermodel.charts.AxisPosition;
import org.apache.poi.ss.usermodel.charts.AxisTickMark; import org.apache.poi.ss.usermodel.charts.AxisTickMark;
import org.apache.poi.ss.usermodel.charts.ChartAxis; import org.apache.poi.ss.usermodel.charts.ChartAxis;
import org.apache.poi.util.Beta;
import org.apache.poi.util.Internal; import org.apache.poi.util.Internal;
import org.apache.poi.util.Removal;
import org.apache.poi.xddf.usermodel.chart.XDDFDateAxis;
import org.apache.poi.xssf.usermodel.XSSFChart; import org.apache.poi.xssf.usermodel.XSSFChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos; import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean; import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
@ -38,8 +39,11 @@ import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
/** /**
* Date axis type. Currently only implements the same values as {@link XSSFCategoryAxis}, since the two are nearly identical. * Date axis type. Currently only implements the same values as {@link XSSFCategoryAxis}, since the two are nearly identical.
*
* @deprecated use {@link XDDFDateAxis} instead
*/ */
@Beta @Deprecated
@Removal(version="4.2")
public class XSSFDateAxis extends XSSFChartAxis { public class XSSFDateAxis extends XSSFChartAxis {
private CTDateAx ctDateAx; private CTDateAx ctDateAx;
@ -108,7 +112,7 @@ public class XSSFDateAxis extends XSSFChartAxis {
public CTChartLines getMajorGridLines() { public CTChartLines getMajorGridLines() {
return ctDateAx.getMajorGridlines(); return ctDateAx.getMajorGridlines();
} }
@Override @Override
public void crossAxis(ChartAxis axis) { public void crossAxis(ChartAxis axis) {
ctDateAx.getCrossAx().setVal(axis.getId()); ctDateAx.getCrossAx().setVal(axis.getId());

View File

@ -25,7 +25,8 @@ import org.apache.poi.ss.usermodel.charts.ChartAxis;
import org.apache.poi.ss.usermodel.charts.ChartDataSource; import org.apache.poi.ss.usermodel.charts.ChartDataSource;
import org.apache.poi.ss.usermodel.charts.LineChartData; import org.apache.poi.ss.usermodel.charts.LineChartData;
import org.apache.poi.ss.usermodel.charts.LineChartSeries; import org.apache.poi.ss.usermodel.charts.LineChartSeries;
import org.apache.poi.util.Beta; import org.apache.poi.util.Removal;
import org.apache.poi.xddf.usermodel.chart.XDDFLineChartData;
import org.apache.poi.xssf.usermodel.XSSFChart; import org.apache.poi.xssf.usermodel.XSSFChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource; import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLineChart; import org.openxmlformats.schemas.drawingml.x2006.chart.CTLineChart;
@ -36,8 +37,11 @@ import org.openxmlformats.schemas.drawingml.x2006.chart.STMarkerStyle;
/** /**
* Holds data for a XSSF Line Chart * Holds data for a XSSF Line Chart
*
* @deprecated use {@link XDDFLineChartData} instead
*/ */
@Beta @Deprecated
@Removal(version="4.2")
public class XSSFLineChartData implements LineChartData { public class XSSFLineChartData implements LineChartData {
/** /**
@ -46,7 +50,7 @@ public class XSSFLineChartData implements LineChartData {
private List<Series> series; private List<Series> series;
public XSSFLineChartData() { public XSSFLineChartData() {
series = new ArrayList<>(); series = new ArrayList<Series>();
} }
static class Series extends AbstractXSSFChartSeries implements LineChartSeries { static class Series extends AbstractXSSFChartSeries implements LineChartSeries {
@ -64,10 +68,12 @@ public class XSSFLineChartData implements LineChartData {
this.values = values; this.values = values;
} }
@Override
public ChartDataSource<?> getCategoryAxisData() { public ChartDataSource<?> getCategoryAxisData() {
return categories; return categories;
} }
@Override
public ChartDataSource<? extends Number> getValues() { public ChartDataSource<? extends Number> getValues() {
return values; return values;
} }
@ -91,6 +97,7 @@ public class XSSFLineChartData implements LineChartData {
} }
} }
@Override
public LineChartSeries addSeries(ChartDataSource<?> categoryAxisData, ChartDataSource<? extends Number> values) { public LineChartSeries addSeries(ChartDataSource<?> categoryAxisData, ChartDataSource<? extends Number> values) {
if (!values.isNumeric()) { if (!values.isNumeric()) {
throw new IllegalArgumentException("Value data source must be numeric."); throw new IllegalArgumentException("Value data source must be numeric.");
@ -101,10 +108,12 @@ public class XSSFLineChartData implements LineChartData {
return newSeries; return newSeries;
} }
@Override
public List<? extends LineChartSeries> getSeries() { public List<? extends LineChartSeries> getSeries() {
return series; return series;
} }
@Override
public void fillChart(Chart chart, ChartAxis... axis) { public void fillChart(Chart chart, ChartAxis... axis) {
if (!(chart instanceof XSSFChart)) { if (!(chart instanceof XSSFChart)) {
throw new IllegalArgumentException("Chart must be instance of XSSFChart"); throw new IllegalArgumentException("Chart must be instance of XSSFChart");

View File

@ -17,25 +17,27 @@
package org.apache.poi.xssf.usermodel.charts; package org.apache.poi.xssf.usermodel.charts;
import org.apache.poi.util.Beta;
import org.apache.poi.util.Internal;
import org.apache.poi.ss.usermodel.charts.ManualLayout;
import org.apache.poi.ss.usermodel.charts.LayoutMode; import org.apache.poi.ss.usermodel.charts.LayoutMode;
import org.apache.poi.ss.usermodel.charts.LayoutTarget; import org.apache.poi.ss.usermodel.charts.LayoutTarget;
import org.apache.poi.ss.usermodel.charts.ManualLayout;
import org.apache.poi.util.Internal;
import org.apache.poi.util.Removal;
import org.apache.poi.xddf.usermodel.chart.XDDFManualLayout;
import org.apache.poi.xssf.usermodel.XSSFChart; import org.apache.poi.xssf.usermodel.XSSFChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.STLayoutTarget;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLayout; import org.openxmlformats.schemas.drawingml.x2006.chart.CTLayout;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTManualLayout;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLayoutMode; import org.openxmlformats.schemas.drawingml.x2006.chart.CTLayoutMode;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLayoutTarget; import org.openxmlformats.schemas.drawingml.x2006.chart.CTLayoutTarget;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTManualLayout;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
import org.openxmlformats.schemas.drawingml.x2006.chart.STLayoutMode; import org.openxmlformats.schemas.drawingml.x2006.chart.STLayoutMode;
import org.openxmlformats.schemas.drawingml.x2006.chart.STLayoutTarget;
/** /**
* Represents a SpreadsheetML manual layout. * Represents a SpreadsheetML manual layout.
* @author Roman Kashitsyn * @deprecated use {@link XDDFManualLayout instead}
*/ */
@Beta @Deprecated
@Removal(version="4.2")
public final class XSSFManualLayout implements ManualLayout { public final class XSSFManualLayout implements ManualLayout {
/** /**
@ -75,126 +77,144 @@ public final class XSSFManualLayout implements ManualLayout {
return layout; return layout;
} }
public void setWidthRatio(double ratio) { @Override
public void setWidthRatio(double ratio) {
if (!layout.isSetW()) { if (!layout.isSetW()) {
layout.addNewW(); layout.addNewW();
} }
layout.getW().setVal(ratio); layout.getW().setVal(ratio);
} }
public double getWidthRatio() { @Override
public double getWidthRatio() {
if (!layout.isSetW()) { if (!layout.isSetW()) {
return 0.0; return 0.0;
} }
return layout.getW().getVal(); return layout.getW().getVal();
} }
public void setHeightRatio(double ratio) { @Override
public void setHeightRatio(double ratio) {
if (!layout.isSetH()) { if (!layout.isSetH()) {
layout.addNewH(); layout.addNewH();
} }
layout.getH().setVal(ratio); layout.getH().setVal(ratio);
} }
public double getHeightRatio() { @Override
public double getHeightRatio() {
if (!layout.isSetH()) { if (!layout.isSetH()) {
return 0.0; return 0.0;
} }
return layout.getH().getVal(); return layout.getH().getVal();
} }
public LayoutTarget getTarget() { @Override
public LayoutTarget getTarget() {
if (!layout.isSetLayoutTarget()) { if (!layout.isSetLayoutTarget()) {
return defaultLayoutTarget; return defaultLayoutTarget;
} }
return toLayoutTarget(layout.getLayoutTarget()); return toLayoutTarget(layout.getLayoutTarget());
} }
public void setTarget(LayoutTarget target) { @Override
public void setTarget(LayoutTarget target) {
if (!layout.isSetLayoutTarget()) { if (!layout.isSetLayoutTarget()) {
layout.addNewLayoutTarget(); layout.addNewLayoutTarget();
} }
layout.getLayoutTarget().setVal(fromLayoutTarget(target)); layout.getLayoutTarget().setVal(fromLayoutTarget(target));
} }
public LayoutMode getXMode() { @Override
public LayoutMode getXMode() {
if (!layout.isSetXMode()) { if (!layout.isSetXMode()) {
return defaultLayoutMode; return defaultLayoutMode;
} }
return toLayoutMode(layout.getXMode()); return toLayoutMode(layout.getXMode());
} }
public void setXMode(LayoutMode mode) { @Override
public void setXMode(LayoutMode mode) {
if (!layout.isSetXMode()) { if (!layout.isSetXMode()) {
layout.addNewXMode(); layout.addNewXMode();
} }
layout.getXMode().setVal(fromLayoutMode(mode)); layout.getXMode().setVal(fromLayoutMode(mode));
} }
public LayoutMode getYMode() { @Override
public LayoutMode getYMode() {
if (!layout.isSetYMode()) { if (!layout.isSetYMode()) {
return defaultLayoutMode; return defaultLayoutMode;
} }
return toLayoutMode(layout.getYMode()); return toLayoutMode(layout.getYMode());
} }
public void setYMode(LayoutMode mode) { @Override
public void setYMode(LayoutMode mode) {
if (!layout.isSetYMode()) { if (!layout.isSetYMode()) {
layout.addNewYMode(); layout.addNewYMode();
} }
layout.getYMode().setVal(fromLayoutMode(mode)); layout.getYMode().setVal(fromLayoutMode(mode));
} }
public double getX() { @Override
public double getX() {
if (!layout.isSetX()) { if (!layout.isSetX()) {
return 0.0; return 0.0;
} }
return layout.getX().getVal(); return layout.getX().getVal();
} }
public void setX(double x) { @Override
public void setX(double x) {
if (!layout.isSetX()) { if (!layout.isSetX()) {
layout.addNewX(); layout.addNewX();
} }
layout.getX().setVal(x); layout.getX().setVal(x);
} }
public double getY() { @Override
public double getY() {
if (!layout.isSetY()) { if (!layout.isSetY()) {
return 0.0; return 0.0;
} }
return layout.getY().getVal(); return layout.getY().getVal();
} }
public void setY(double y) { @Override
public void setY(double y) {
if (!layout.isSetY()) { if (!layout.isSetY()) {
layout.addNewY(); layout.addNewY();
} }
layout.getY().setVal(y); layout.getY().setVal(y);
} }
public LayoutMode getWidthMode() { @Override
public LayoutMode getWidthMode() {
if (!layout.isSetWMode()) { if (!layout.isSetWMode()) {
return defaultLayoutMode; return defaultLayoutMode;
} }
return toLayoutMode(layout.getWMode()); return toLayoutMode(layout.getWMode());
} }
public void setWidthMode(LayoutMode mode) { @Override
public void setWidthMode(LayoutMode mode) {
if (!layout.isSetWMode()) { if (!layout.isSetWMode()) {
layout.addNewWMode(); layout.addNewWMode();
} }
layout.getWMode().setVal(fromLayoutMode(mode)); layout.getWMode().setVal(fromLayoutMode(mode));
} }
public LayoutMode getHeightMode() { @Override
public LayoutMode getHeightMode() {
if (!layout.isSetHMode()) { if (!layout.isSetHMode()) {
return defaultLayoutMode; return defaultLayoutMode;
} }
return toLayoutMode(layout.getHMode()); return toLayoutMode(layout.getHMode());
} }
public void setHeightMode(LayoutMode mode) { @Override
public void setHeightMode(LayoutMode mode) {
if (!layout.isSetHMode()) { if (!layout.isSetHMode()) {
layout.addNewHMode(); layout.addNewHMode();
} }

View File

@ -25,7 +25,8 @@ import org.apache.poi.ss.usermodel.charts.ChartAxis;
import org.apache.poi.ss.usermodel.charts.ChartDataSource; import org.apache.poi.ss.usermodel.charts.ChartDataSource;
import org.apache.poi.ss.usermodel.charts.ScatterChartData; import org.apache.poi.ss.usermodel.charts.ScatterChartData;
import org.apache.poi.ss.usermodel.charts.ScatterChartSeries; import org.apache.poi.ss.usermodel.charts.ScatterChartSeries;
import org.apache.poi.util.Beta; import org.apache.poi.util.Removal;
import org.apache.poi.xddf.usermodel.chart.XDDFScatterChartData;
import org.apache.poi.xssf.usermodel.XSSFChart; import org.apache.poi.xssf.usermodel.XSSFChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource; import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource; import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
@ -38,8 +39,11 @@ import org.openxmlformats.schemas.drawingml.x2006.chart.STScatterStyle;
/** /**
* Represents DrawingML scatter charts. * Represents DrawingML scatter charts.
*
* @deprecated use {@link XDDFScatterChartData} instead
*/ */
@Beta @Deprecated
@Removal(version="4.2")
public class XSSFScatterChartData implements ScatterChartData { public class XSSFScatterChartData implements ScatterChartData {
/** /**
@ -48,7 +52,7 @@ public class XSSFScatterChartData implements ScatterChartData {
private List<Series> series; private List<Series> series;
public XSSFScatterChartData() { public XSSFScatterChartData() {
series = new ArrayList<>(); series = new ArrayList<Series>();
} }
/** /**
@ -74,6 +78,7 @@ public class XSSFScatterChartData implements ScatterChartData {
* Returns data source used for X axis values. * Returns data source used for X axis values.
* @return data source used for X axis values * @return data source used for X axis values
*/ */
@Override
public ChartDataSource<?> getXValues() { public ChartDataSource<?> getXValues() {
return xs; return xs;
} }
@ -82,6 +87,7 @@ public class XSSFScatterChartData implements ScatterChartData {
* Returns data source used for Y axis values. * Returns data source used for Y axis values.
* @return data source used for Y axis values * @return data source used for Y axis values
*/ */
@Override
public ChartDataSource<? extends Number> getYValues() { public ChartDataSource<? extends Number> getYValues() {
return ys; return ys;
} }
@ -103,6 +109,7 @@ public class XSSFScatterChartData implements ScatterChartData {
} }
} }
@Override
public ScatterChartSeries addSerie(ChartDataSource<?> xs, public ScatterChartSeries addSerie(ChartDataSource<?> xs,
ChartDataSource<? extends Number> ys) { ChartDataSource<? extends Number> ys) {
if (!ys.isNumeric()) { if (!ys.isNumeric()) {
@ -114,6 +121,7 @@ public class XSSFScatterChartData implements ScatterChartData {
return newSerie; return newSerie;
} }
@Override
public void fillChart(Chart chart, ChartAxis... axis) { public void fillChart(Chart chart, ChartAxis... axis) {
if (!(chart instanceof XSSFChart)) { if (!(chart instanceof XSSFChart)) {
throw new IllegalArgumentException("Chart must be instance of XSSFChart"); throw new IllegalArgumentException("Chart must be instance of XSSFChart");
@ -133,6 +141,7 @@ public class XSSFScatterChartData implements ScatterChartData {
} }
} }
@Override
public List<? extends Series> getSeries() { public List<? extends Series> getSeries() {
return series; return series;
} }

View File

@ -24,8 +24,9 @@ import org.apache.poi.ss.usermodel.charts.AxisPosition;
import org.apache.poi.ss.usermodel.charts.AxisTickMark; import org.apache.poi.ss.usermodel.charts.AxisTickMark;
import org.apache.poi.ss.usermodel.charts.ChartAxis; import org.apache.poi.ss.usermodel.charts.ChartAxis;
import org.apache.poi.ss.usermodel.charts.ValueAxis; import org.apache.poi.ss.usermodel.charts.ValueAxis;
import org.apache.poi.util.Beta;
import org.apache.poi.util.Internal; import org.apache.poi.util.Internal;
import org.apache.poi.util.Removal;
import org.apache.poi.xddf.usermodel.chart.XDDFValueAxis;
import org.apache.poi.xssf.usermodel.XSSFChart; import org.apache.poi.xssf.usermodel.XSSFChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos; import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean; import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
@ -42,9 +43,10 @@ import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
/** /**
* Value axis type. * Value axis type.
* *
* @author Roman Kashitsyn * @deprecated use {@link XDDFValueAxis} instead
*/ */
@Beta @Deprecated
@Removal(version="4.2")
public class XSSFValueAxis extends XSSFChartAxis implements ValueAxis { public class XSSFValueAxis extends XSSFChartAxis implements ValueAxis {
private CTValAx ctValAx; private CTValAx ctValAx;

View File

@ -22,39 +22,23 @@ import static org.apache.poi.POIXMLTypeLoader.DEFAULT_XML_OPTIONS;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.Arrays;
import javax.xml.namespace.QName; import javax.xml.namespace.QName;
import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.POIXMLException; import org.apache.poi.POIXMLException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackageRelationship;
import org.apache.poi.util.Beta; import org.apache.poi.util.Beta;
import org.apache.poi.util.IOUtils; import org.apache.poi.util.IOUtils;
import org.apache.poi.util.Internal; import org.apache.poi.xddf.usermodel.chart.XDDFChart;
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.chart.CTChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace; import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace;
import org.openxmlformats.schemas.drawingml.x2006.chart.ChartSpaceDocument;
/** /**
* Represents a Chart in a .docx file * Represents a Chart in a .docx file
*/ */
@Beta @Beta
public class XWPFChart extends POIXMLDocumentPart { public class XWPFChart extends XDDFChart {
/**
* Root element of the Chart part
*/
private final CTChartSpace chartSpace;
/**
* The Chart within that
*/
private final CTChart chart;
// lazy initialization // lazy initialization
private Long checksum; private Long checksum;
@ -64,39 +48,11 @@ public class XWPFChart extends POIXMLDocumentPart {
* *
* @param part the package part holding the chart data, * @param part the package part holding the chart data,
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code> * the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code>
* *
* @since POI 4.0.0 * @since POI 4.0.0
*/ */
protected XWPFChart(PackagePart part) throws IOException, XmlException { protected XWPFChart(PackagePart part) throws IOException, XmlException {
super(part); super(part);
chartSpace = ChartSpaceDocument.Factory.parse(part.getInputStream(), DEFAULT_XML_OPTIONS).getChartSpace();
chart = chartSpace.getChart();
}
@Override
protected void onDocumentRead() throws IOException {
super.onDocumentRead();
}
/**
* Return the underlying CTChartSpace bean, the root element of the Chart part.
*
* @return the underlying CTChartSpace bean
*/
@Internal
public CTChartSpace getCTChartSpace() {
return chartSpace;
}
/**
* Return the underlying CTChart bean, within the Chart Space
*
* @return the underlying CTChart bean
*/
@Internal
public CTChart getCTChart() {
return chart;
} }
@Override @Override
@ -108,7 +64,7 @@ public class XWPFChart extends POIXMLDocumentPart {
chartSpace.save(out, xmlOptions); chartSpace.save(out, xmlOptions);
} }
} }
public Long getChecksum() { public Long getChecksum() {
if (this.checksum == null) { if (this.checksum == null) {
InputStream is = null; InputStream is = null;
@ -120,7 +76,9 @@ public class XWPFChart extends POIXMLDocumentPart {
throw new POIXMLException(e); throw new POIXMLException(e);
} finally { } finally {
try { try {
if (is != null) is.close(); if (is != null) {
is.close();
}
} catch (IOException e) { } catch (IOException e) {
throw new POIXMLException(e); throw new POIXMLException(e);
} }
@ -157,7 +115,7 @@ public class XWPFChart extends POIXMLDocumentPart {
} }
return false; return false;
} }
@Override @Override
public int hashCode() { public int hashCode() {
return getChecksum().hashCode(); return getChecksum().hashCode();

View File

@ -63,7 +63,27 @@ import org.apache.xmlbeans.XmlCursor;
import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlObject; import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlOptions; import org.apache.xmlbeans.XmlOptions;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTComment;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDocument1;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFtnEdn;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTOnOff;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSdtBlock;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTStyles;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CommentsDocument;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.DocumentDocument;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.EndnotesDocument;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.FootnotesDocument;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.NumberingDocument;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STDocProtect;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STHdrFtr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.StylesDocument;
/** /**
* <p>High(ish) level class for working with .docx files.</p> * <p>High(ish) level class for working with .docx files.</p>
@ -79,7 +99,7 @@ import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
*/ */
public class XWPFDocument extends POIXMLDocument implements Document, IBody { public class XWPFDocument extends POIXMLDocument implements Document, IBody {
private static final POILogger LOG = POILogFactory.getLogger(XWPFDocument.class); private static final POILogger LOG = POILogFactory.getLogger(XWPFDocument.class);
protected List<XWPFFooter> footers = new ArrayList<>(); protected List<XWPFFooter> footers = new ArrayList<>();
protected List<XWPFHeader> headers = new ArrayList<>(); protected List<XWPFHeader> headers = new ArrayList<>();
protected List<XWPFComment> comments = new ArrayList<>(); protected List<XWPFComment> comments = new ArrayList<>();
@ -186,8 +206,9 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
} }
docCursor.dispose(); docCursor.dispose();
// Sort out headers and footers // Sort out headers and footers
if (doc.getDocument().getBody().getSectPr() != null) if (doc.getDocument().getBody().getSectPr() != null) {
headerFooterPolicy = new XWPFHeaderFooterPolicy(this); headerFooterPolicy = new XWPFHeaderFooterPolicy(this);
}
// Create for each XML-part in the Package a PartClass // Create for each XML-part in the Package a PartClass
for (RelationPart rp : getRelationParts()) { for (RelationPart rp : getRelationParts()) {
@ -224,7 +245,7 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
} else if (relation.equals(XWPFRelation.CHART.getRelation())) { } else if (relation.equals(XWPFRelation.CHART.getRelation())) {
//now we can use all methods to modify charts in XWPFDocument //now we can use all methods to modify charts in XWPFDocument
XWPFChart chartData = (XWPFChart) p; XWPFChart chartData = (XWPFChart) p;
chartData.onDocumentRead(); // chartData.onDocumentRead(); // ??? there is nothing to be done there!!!
charts.add(chartData); charts.add(chartData);
} else if (relation.equals(XWPFRelation.GLOSSARY_DOCUMENT.getRelation())) { } else if (relation.equals(XWPFRelation.GLOSSARY_DOCUMENT.getRelation())) {
// We don't currently process the glossary itself // We don't currently process the glossary itself
@ -380,20 +401,25 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
public XWPFHyperlink getHyperlinkByID(String id) { public XWPFHyperlink getHyperlinkByID(String id) {
for (XWPFHyperlink link : hyperlinks) { for (XWPFHyperlink link : hyperlinks) {
if (link.getId().equals(id)) if (link.getId().equals(id)) {
return link; return link;
}
} }
return null; return null;
} }
public XWPFFootnote getFootnoteByID(int id) { public XWPFFootnote getFootnoteByID(int id) {
if (footnotes == null) return null; if (footnotes == null) {
return null;
}
return footnotes.getFootnoteById(id); return footnotes.getFootnoteById(id);
} }
public XWPFFootnote getEndnoteByID(int id) { public XWPFFootnote getEndnoteByID(int id) {
if (endnotes == null) return null; if (endnotes == null) {
return null;
}
return endnotes.get(id); return endnotes.get(id);
} }
@ -410,8 +436,9 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
public XWPFComment getCommentByID(String id) { public XWPFComment getCommentByID(String id) {
for (XWPFComment comment : comments) { for (XWPFComment comment : comments) {
if (comment.getId().equals(id)) if (comment.getId().equals(id)) {
return comment; return comment;
}
} }
return null; return null;
@ -450,7 +477,7 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
} }
return headerFooterPolicy; return headerFooterPolicy;
} }
/** /**
* Create a header of the given type * Create a header of the given type
* *
@ -471,8 +498,8 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
} }
return hfPolicy.createHeader(STHdrFtr.Enum.forInt(type.toInt())); return hfPolicy.createHeader(STHdrFtr.Enum.forInt(type.toInt()));
} }
/** /**
* Create a footer of the given type * Create a footer of the given type
* *
@ -619,7 +646,7 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
String uri = CTP.type.getName().getNamespaceURI(); String uri = CTP.type.getName().getNamespaceURI();
/* /*
* TODO DO not use a coded constant, find the constant in the OOXML * TODO DO not use a coded constant, find the constant in the OOXML
* classes instead, as the child of type CT_Paragraph is defined in the * classes instead, as the child of type CT_Paragraph is defined in the
* OOXML schema as 'p' * OOXML schema as 'p'
*/ */
String localPart = "p"; String localPart = "p";
@ -667,8 +694,9 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
cursor.toCursor(newParaPos); cursor.toCursor(newParaPos);
while (cursor.toPrevSibling()) { while (cursor.toPrevSibling()) {
o = cursor.getObject(); o = cursor.getObject();
if (o instanceof CTP || o instanceof CTTbl) if (o instanceof CTP || o instanceof CTTbl) {
i++; i++;
}
} }
bodyElements.add(i, newP); bodyElements.add(i, newP);
cursor.toCursor(newParaPos); cursor.toCursor(newParaPos);
@ -706,8 +734,9 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
cursor.toCursor(tableCursor); cursor.toCursor(tableCursor);
while (cursor.toPrevSibling()) { while (cursor.toPrevSibling()) {
o = cursor.getObject(); o = cursor.getObject();
if (o instanceof CTP || o instanceof CTTbl) if (o instanceof CTP || o instanceof CTTbl) {
i++; i++;
}
} }
bodyElements.add(i, newT); bodyElements.add(i, newT);
cursor.toCursor(tableCursor); cursor.toCursor(tableCursor);
@ -984,7 +1013,7 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
tables.set(pos, table); tables.set(pos, table);
ctDocument.getBody().setTblArray(pos, table.getCTTbl()); ctDocument.getBody().setTblArray(pos, table.getCTTbl());
} }
/** /**
* Verifies that the documentProtection tag in settings.xml file <br> * Verifies that the documentProtection tag in settings.xml file <br>
* specifies that the protection is enforced (w:enforcement="1") <br> * specifies that the protection is enforced (w:enforcement="1") <br>
@ -1288,7 +1317,7 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
public void setZoomPercent(long zoomPercent) { public void setZoomPercent(long zoomPercent) {
settings.setZoomPercent(zoomPercent); settings.setZoomPercent(zoomPercent);
} }
/** /**
* inserts an existing XWPFTable to the arrays bodyElements and tables * inserts an existing XWPFTable to the arrays bodyElements and tables
* *
@ -1378,7 +1407,9 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
throw new POIXMLException(e); throw new POIXMLException(e);
} finally { } finally {
try { try {
if (out != null) out.close(); if (out != null) {
out.close();
}
} catch (IOException e) { } catch (IOException e) {
// ignore // ignore
} }

View File

@ -0,0 +1,134 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xddf.usermodel.chart;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.SheetBuilder;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import junit.framework.TestCase;
/**
* Tests for {@link XDDFDataSourcesFactory}.
*/
public class TestXDDFDataSourcesFactory extends TestCase {
private static final Object[][] numericCells = {
{0.0, 1.0, 2.0, 3.0, 4.0},
{0.0, "=B1*2", "=C1*2", "=D1*2", "=E1*2"}
};
private static final Object[][] stringCells = {
{ 1, 2, 3, 4, 5},
{"A", "B", "C", "D", "E"}
};
private static final Object[][] mixedCells = {
{1.0, "2.0", 3.0, "4.0", 5.0, "6.0"}
};
public void testNumericArrayDataSource() {
Double[] doubles = new Double[]{1.0, 2.0, 3.0, 4.0, 5.0};
XDDFDataSource<Double> doubleDataSource = XDDFDataSourcesFactory.fromArray(doubles, null);
assertTrue(doubleDataSource.isNumeric());
assertFalse(doubleDataSource.isReference());
assertDataSourceIsEqualToArray(doubleDataSource, doubles);
}
public void testStringArrayDataSource() {
String[] strings = new String[]{"one", "two", "three", "four", "five"};
XDDFDataSource<String> stringDataSource = XDDFDataSourcesFactory.fromArray(strings, null);
assertFalse(stringDataSource.isNumeric());
assertFalse(stringDataSource.isReference());
assertDataSourceIsEqualToArray(stringDataSource, strings);
}
public void testNumericCellDataSource() {
XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet sheet = (XSSFSheet) new SheetBuilder(wb, numericCells).build();
CellRangeAddress numCellRange = CellRangeAddress.valueOf("A2:E2");
XDDFDataSource<Double> numDataSource = XDDFDataSourcesFactory.fromNumericCellRange(sheet, numCellRange);
assertTrue(numDataSource.isReference());
assertTrue(numDataSource.isNumeric());
assertEquals(numericCells[0].length, numDataSource.getPointCount());
for (int i = 0; i < numericCells[0].length; ++i) {
assertEquals(((Double) numericCells[0][i]) * 2,
numDataSource.getPointAt(i), 0.00001);
}
}
public void testStringCellDataSource() {
XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet sheet = (XSSFSheet) new SheetBuilder(wb, stringCells).build();
CellRangeAddress numCellRange = CellRangeAddress.valueOf("A2:E2");
XDDFDataSource<String> numDataSource = XDDFDataSourcesFactory.fromStringCellRange(sheet, numCellRange);
assertTrue(numDataSource.isReference());
assertFalse(numDataSource.isNumeric());
assertEquals(numericCells[0].length, numDataSource.getPointCount());
for (int i = 0; i < stringCells[1].length; ++i) {
assertEquals(stringCells[1][i], numDataSource.getPointAt(i));
}
}
public void testMixedCellDataSource() {
XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet sheet = (XSSFSheet) new SheetBuilder(wb, mixedCells).build();
CellRangeAddress mixedCellRange = CellRangeAddress.valueOf("A1:F1");
XDDFDataSource<String> strDataSource = XDDFDataSourcesFactory.fromStringCellRange(sheet, mixedCellRange);
XDDFDataSource<Double> numDataSource = XDDFDataSourcesFactory.fromNumericCellRange(sheet, mixedCellRange);
for (int i = 0; i < mixedCells[0].length; ++i) {
if (i % 2 == 0) {
assertNull(strDataSource.getPointAt(i));
assertEquals(((Double) mixedCells[0][i]),
numDataSource.getPointAt(i), 0.00001);
} else {
assertNull(numDataSource.getPointAt(i));
assertEquals(mixedCells[0][i], strDataSource.getPointAt(i));
}
}
}
public void testIOBExceptionOnInvalidIndex() {
XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet sheet = (XSSFSheet) new SheetBuilder(wb, numericCells).build();
CellRangeAddress rangeAddress = CellRangeAddress.valueOf("A2:E2");
XDDFDataSource<Double> numDataSource = XDDFDataSourcesFactory.fromNumericCellRange(sheet, rangeAddress);
IndexOutOfBoundsException exception = null;
try {
numDataSource.getPointAt(-1);
} catch (IndexOutOfBoundsException e) {
exception = e;
}
assertNotNull(exception);
exception = null;
try {
numDataSource.getPointAt(numDataSource.getPointCount());
} catch (IndexOutOfBoundsException e) {
exception = e;
}
assertNotNull(exception);
}
private <T> void assertDataSourceIsEqualToArray(XDDFDataSource<T> ds, T[] array) {
assertEquals(ds.getPointCount(), array.length);
for (int i = 0; i < array.length; ++i) {
assertEquals(ds.getPointAt(i), array[i]);
}
}
}

View File

@ -18,44 +18,151 @@
*/ */
package org.apache.poi.xslf.usermodel; package org.apache.poi.xslf.usermodel;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.util.List;
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellReference; import org.apache.poi.xddf.usermodel.chart.AxisCrossBetween;
import org.apache.poi.xddf.usermodel.chart.AxisCrosses;
import org.apache.poi.xddf.usermodel.chart.AxisOrientation;
import org.apache.poi.xddf.usermodel.chart.AxisPosition;
import org.apache.poi.xddf.usermodel.chart.AxisTickMark;
import org.apache.poi.xddf.usermodel.chart.BarDirection;
import org.apache.poi.xddf.usermodel.chart.BarGrouping;
import org.apache.poi.xddf.usermodel.chart.Grouping;
import org.apache.poi.xddf.usermodel.chart.LayoutMode;
import org.apache.poi.xddf.usermodel.chart.LayoutTarget;
import org.apache.poi.xddf.usermodel.chart.LegendPosition;
import org.apache.poi.xddf.usermodel.chart.RadarStyle;
import org.apache.poi.xddf.usermodel.chart.ScatterStyle;
import org.apache.poi.xddf.usermodel.chart.XDDFBarChartData;
import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend;
import org.apache.poi.xddf.usermodel.chart.XDDFDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory;
import org.apache.poi.xddf.usermodel.chart.XDDFLineChartData;
import org.apache.poi.xddf.usermodel.chart.XDDFManualLayout;
import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFPieChartData;
import org.apache.poi.xddf.usermodel.chart.XDDFRadarChartData;
import org.apache.poi.xddf.usermodel.chart.XDDFScatterChartData;
import org.apache.poi.xddf.usermodel.chart.XDDFValueAxis;
import org.apache.poi.xslf.XSLFTestDataSamples; import org.apache.poi.xslf.XSLFTestDataSamples;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.Test; import org.junit.Test;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumData;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumVal;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieSer;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrData;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrVal;
/**
* a modified version from POI-examples
*/
public class TestXSLFChart { public class TestXSLFChart {
/**
* a modified version from POI-examples
*/
@Test @Test
public void testFillChartTemplate() throws IOException { public void testFillPieChartTemplate() throws IOException {
String chartTitle = "Apache POI"; // first line is chart title
XMLSlideShow pptx = XSLFTestDataSamples.openSampleDocument("pie-chart.pptx"); XMLSlideShow pptx = XSLFTestDataSamples.openSampleDocument("pie-chart.pptx");
XSLFSlide slide = pptx.getSlides().get(0); XSLFChart chart = findChart(pptx.getSlides().get(0));
List<XDDFChartData> data = findChartData(chart);
XDDFPieChartData pie = (XDDFPieChartData) data.get(0);
XDDFPieChartData.Series firstSeries = (XDDFPieChartData.Series) pie.getSeries().get(0);
firstSeries.setExplosion(25);
assertEquals(25, firstSeries.getExplosion());
fillChartData(chart, pie);
pptx.close();
}
@Test
public void testFillBarChartTemplate() throws IOException {
XMLSlideShow pptx = XSLFTestDataSamples.openSampleDocument("bar-chart.pptx");
XSLFSlide slide = pptx.getSlides().get(0);
// duplicate slide and chart before applying "destructive" tests to it
XSLFChart chart2 = findChart(pptx.createSlide().importContent(slide));
XSLFChart chart = findChart(slide);
List<XDDFChartData> data = findChartData(chart);
XDDFBarChartData bar = (XDDFBarChartData) data.get(0);
assertEquals(BarDirection.BAR, bar.getBarDirection());
assertEquals(BarGrouping.CLUSTERED, bar.getBarGrouping());
assertEquals(100, bar.getGapWidth());
fillChartData(chart, bar);
XDDFBarChartData column = (XDDFBarChartData) findChartData(chart2).get(0);
column.setBarDirection(BarDirection.COL);
assertEquals(BarDirection.COL, column.getBarDirection());
column.getCategoryAxis().setOrientation(AxisOrientation.MIN_MAX);
column.getValueAxes().get(0).setPosition(AxisPosition.BOTTOM);
fillChartData(chart2, column);
pptx.close();
}
@Test
public void testFillLineChartTemplate() throws IOException {
XMLSlideShow pptx = XSLFTestDataSamples.openSampleDocument("line-chart.pptx");
XSLFChart chart = findChart(pptx.getSlides().get(0));
List<XDDFChartData> data = findChartData(chart);
XDDFLineChartData line = (XDDFLineChartData) data.get(0);
assertEquals(Grouping.STANDARD, line.getGrouping());
line.setGrouping(Grouping.PERCENT_STACKED);
assertEquals(Grouping.PERCENT_STACKED, line.getGrouping());
fillChartData(chart, line);
pptx.close();
}
@Test
public void testFillRadarChartTemplate() throws IOException {
XMLSlideShow pptx = XSLFTestDataSamples.openSampleDocument("radar-chart.pptx");
XSLFChart chart = findChart(pptx.getSlides().get(0));
List<XDDFChartData> data = findChartData(chart);
XDDFRadarChartData radar = (XDDFRadarChartData) data.get(0);
assertEquals(RadarStyle.MARKER, radar.getStyle());
radar.setStyle(RadarStyle.FILLED);
assertEquals(RadarStyle.FILLED, radar.getStyle());
fillChartData(chart, radar);
pptx.close();
}
@Test
public void testFillScatterChartTemplate() throws IOException {
XMLSlideShow pptx = XSLFTestDataSamples.openSampleDocument("scatter-chart.pptx");
XSLFChart chart = findChart(pptx.getSlides().get(0));
List<XDDFChartData> data = findChartData(chart);
XDDFScatterChartData scatter = (XDDFScatterChartData) data.get(0);
assertEquals(ScatterStyle.LINE_MARKER, scatter.getStyle());
scatter.setStyle(ScatterStyle.SMOOTH);
assertEquals(ScatterStyle.SMOOTH, scatter.getStyle());
fillChartData(chart, scatter);
pptx.close();
}
private void fillChartData(XSLFChart chart, XDDFChartData data) {
final int numOfPoints = 3;
final String[] categories = {"First", "Second", "Third"};
final Integer[] values = {1, 3, 4};
final String categoryDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 0, 0));
final String valuesDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 1, 1));
final XDDFChartData.Series series = data.getSeries().get(0);
final XDDFDataSource<?> categoryData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange);
final XDDFNumericalDataSource<Integer> valuesData = XDDFDataSourcesFactory.fromArray(values, valuesDataRange);
series.replaceData(categoryData, valuesData);
final String title = "Apache POI";
series.setTitle(title, chart.setSheetTitle(title));
chart.plot(data);
}
private XSLFChart findChart(XSLFSlide slide) {
// find chart in the slide // find chart in the slide
XSLFChart chart = null; XSLFChart chart = null;
for(POIXMLDocumentPart part : slide.getRelations()){ for(POIXMLDocumentPart part : slide.getRelations()){
@ -65,76 +172,161 @@ public class TestXSLFChart {
} }
} }
if(chart == null) throw new IllegalStateException("chart not found in the template"); if(chart == null) {
throw new IllegalStateException("chart not found in the template");
// embedded Excel workbook that holds the chart data
POIXMLDocumentPart xlsPart = chart.getRelations().get(0);
XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet sheet = wb.createSheet();
CTChart ctChart = chart.getCTChart();
CTPlotArea plotArea = ctChart.getPlotArea();
CTPieChart pieChart = plotArea.getPieChartArray(0);
//Pie Chart Series
CTPieSer ser = pieChart.getSerArray(0);
// Series Text
CTSerTx tx = ser.getTx();
tx.getStrRef().getStrCache().getPtArray(0).setV(chartTitle);
sheet.createRow(0).createCell(1).setCellValue(chartTitle);
String titleRef = new CellReference(sheet.getSheetName(), 0, 1, true, true).formatAsString();
tx.getStrRef().setF(titleRef);
// Category Axis Data
CTAxDataSource cat = ser.getCat();
CTStrData strData = cat.getStrRef().getStrCache();
// Values
CTNumDataSource valSrc = ser.getVal();
CTNumData numData = valSrc.getNumRef().getNumCache();
strData.setPtArray(null); // unset old axis text
numData.setPtArray(null); // unset old values
Map<String, Double> pieModel = new LinkedHashMap<>();
pieModel.put("First", 1.0);
pieModel.put("Second", 3.0);
pieModel.put("Third", 4.0);
// set model
int idx = 0;
int rownum = 1;
for(String key : pieModel.keySet()){
double val = pieModel.get(key);
CTNumVal numVal = numData.addNewPt();
numVal.setIdx(idx);
numVal.setV("" + val);
CTStrVal sVal = strData.addNewPt();
sVal.setIdx(idx);
sVal.setV(key);
idx++;
XSSFRow row = sheet.createRow(rownum++);
row.createCell(0).setCellValue(key);
row.createCell(1).setCellValue(val);
} }
numData.getPtCount().setVal(idx);
strData.getPtCount().setVal(idx);
String numDataRange = new CellRangeAddress(1, rownum-1, 1, 1).formatAsString(sheet.getSheetName(), true); checkLegendOperations(chart);
valSrc.getNumRef().setF(numDataRange); return chart;
String axisDataRange = new CellRangeAddress(1, rownum-1, 0, 0).formatAsString(sheet.getSheetName(), true);
cat.getStrRef().setF(axisDataRange);
// updated the embedded workbook with the data
OutputStream xlsOut = xlsPart.getPackagePart().getOutputStream();
wb.write(xlsOut);
xlsOut.close();
wb.close();
} }
} private List<XDDFChartData> findChartData(XSLFChart chart) {
List<XDDFChartData> data = chart.getChartSeries();
assertNotNull(data);
assertEquals(1, data.size());
XDDFChartData firstSeries = data.get(0);
assertNotNull(firstSeries);
if (firstSeries instanceof XDDFScatterChartData) {
assertEquals(null, firstSeries.getCategoryAxis());
assertEquals(2, firstSeries.getValueAxes().size());
checkAxisOperations(firstSeries.getValueAxes().get(0));
checkAxisOperations(firstSeries.getValueAxes().get(1));
} else if (!(firstSeries instanceof XDDFPieChartData)) {
assertNotNull(firstSeries.getCategoryAxis());
assertEquals(1, firstSeries.getValueAxes().size());
checkAxisOperations(firstSeries.getValueAxes().get(0));
}
return data;
}
private void checkLegendOperations(XSLFChart chart) {
XDDFChartLegend legend = chart.getOrAddLegend();
assertFalse(legend.isOverlay());
legend.setOverlay(true);
assertTrue(legend.isOverlay());
legend.setPosition(LegendPosition.TOP_RIGHT);
assertEquals(LegendPosition.TOP_RIGHT, legend.getPosition());
XDDFManualLayout layout = legend.getOrAddManualLayout();
assertNotNull(layout.getTarget());
assertNotNull(layout.getXMode());
assertNotNull(layout.getYMode());
assertNotNull(layout.getHeightMode());
assertNotNull(layout.getWidthMode());
/*
* According to interface, 0.0 should be returned for
* uninitialized double properties.
*/
assertTrue(layout.getX() == 0.0);
assertTrue(layout.getY() == 0.0);
assertTrue(layout.getWidthRatio() == 0.0);
assertTrue(layout.getHeightRatio() == 0.0);
final double newRatio = 1.1;
final double newCoordinate = 0.3;
final LayoutMode nonDefaultMode = LayoutMode.FACTOR;
final LayoutTarget nonDefaultTarget = LayoutTarget.OUTER;
layout.setWidthRatio(newRatio);
assertTrue(layout.getWidthRatio() == newRatio);
layout.setHeightRatio(newRatio);
assertTrue(layout.getHeightRatio() == newRatio);
layout.setX(newCoordinate);
assertTrue(layout.getX() == newCoordinate);
layout.setY(newCoordinate);
assertTrue(layout.getY() == newCoordinate);
layout.setXMode(nonDefaultMode);
assertTrue(layout.getXMode() == nonDefaultMode);
layout.setYMode(nonDefaultMode);
assertTrue(layout.getYMode() == nonDefaultMode);
layout.setWidthMode(nonDefaultMode);
assertTrue(layout.getWidthMode() == nonDefaultMode);
layout.setHeightMode(nonDefaultMode);
assertTrue(layout.getHeightMode() == nonDefaultMode);
layout.setTarget(nonDefaultTarget);
assertTrue(layout.getTarget() == nonDefaultTarget);
}
private void checkAxisOperations(XDDFValueAxis axis) {
axis.setCrossBetween(AxisCrossBetween.MIDPOINT_CATEGORY);
assertEquals(AxisCrossBetween.MIDPOINT_CATEGORY, axis.getCrossBetween());
axis.setCrosses(AxisCrosses.AUTO_ZERO);
assertEquals(AxisCrosses.AUTO_ZERO, axis.getCrosses());
final String numberFormat = "General";
axis.setNumberFormat(numberFormat);
assertEquals(numberFormat, axis.getNumberFormat());
axis.setPosition(AxisPosition.BOTTOM);
assertEquals(AxisPosition.BOTTOM, axis.getPosition());
axis.setMajorTickMark(AxisTickMark.NONE);
assertEquals(AxisTickMark.NONE, axis.getMajorTickMark());
axis.setMajorTickMark(AxisTickMark.IN);
assertEquals(AxisTickMark.IN, axis.getMajorTickMark());
axis.setMajorTickMark(AxisTickMark.OUT);
assertEquals(AxisTickMark.OUT, axis.getMajorTickMark());
axis.setMajorTickMark(AxisTickMark.CROSS);
assertEquals(AxisTickMark.CROSS, axis.getMajorTickMark());
axis.setMinorTickMark(AxisTickMark.NONE);
assertEquals(AxisTickMark.NONE, axis.getMinorTickMark());
axis.setMinorTickMark(AxisTickMark.IN);
assertEquals(AxisTickMark.IN, axis.getMinorTickMark());
axis.setMinorTickMark(AxisTickMark.OUT);
assertEquals(AxisTickMark.OUT, axis.getMinorTickMark());
axis.setMinorTickMark(AxisTickMark.CROSS);
assertEquals(AxisTickMark.CROSS, axis.getMinorTickMark());
axis.setVisible(true);
assertTrue(axis.isVisible());
axis.setVisible(false);
assertFalse(axis.isVisible());
final double EPSILON = 1E-7;
axis.setLogBase(Math.E);
assertTrue(Math.abs(axis.getLogBase() - Math.E) < EPSILON);
final double newValue = 10.0;
axis.setMinimum(newValue);
assertTrue(Math.abs(axis.getMinimum() - newValue) < EPSILON);
axis.setMaximum(newValue);
assertTrue(Math.abs(axis.getMaximum() - newValue) < EPSILON);
IllegalArgumentException iae = null;
try {
axis.setLogBase(0.0);
} catch (IllegalArgumentException e) {
iae = e;
}
assertNotNull(iae);
iae = null;
try {
axis.setLogBase(30000.0);
} catch (IllegalArgumentException e) {
iae = e;
}
assertNotNull(iae);
}
}

View File

@ -17,46 +17,46 @@
package org.apache.poi.xssf.usermodel; package org.apache.poi.xssf.usermodel;
import junit.framework.TestCase;
import org.apache.poi.xssf.XSSFTestDataSamples; import org.apache.poi.xssf.XSSFTestDataSamples;
import junit.framework.TestCase;
public final class TestXSSFChart extends TestCase { public final class TestXSSFChart extends TestCase {
public void testGetAccessors() { public void testGetAccessors() {
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithThreeCharts.xlsx"); XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithThreeCharts.xlsx");
XSSFSheet s1 = wb.getSheetAt(0); XSSFSheet s1 = wb.getSheetAt(0);
XSSFSheet s2 = wb.getSheetAt(1); XSSFSheet s2 = wb.getSheetAt(1);
XSSFSheet s3 = wb.getSheetAt(2); XSSFSheet s3 = wb.getSheetAt(2);
assertEquals(0, s1.getRelations().size()); assertEquals(0, s1.getRelations().size());
assertEquals(1, s2.getRelations().size()); assertEquals(1, s2.getRelations().size());
assertEquals(1, s3.getRelations().size()); assertEquals(1, s3.getRelations().size());
assertNotNull(XSSFTestDataSamples.writeOutAndReadBack(wb)); assertNotNull(XSSFTestDataSamples.writeOutAndReadBack(wb));
} }
public void testGetCharts() throws Exception { public void testGetCharts() throws Exception {
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithThreeCharts.xlsx"); XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithThreeCharts.xlsx");
XSSFSheet s1 = wb.getSheetAt(0); XSSFSheet s1 = wb.getSheetAt(0);
XSSFSheet s2 = wb.getSheetAt(1); XSSFSheet s2 = wb.getSheetAt(1);
XSSFSheet s3 = wb.getSheetAt(2); XSSFSheet s3 = wb.getSheetAt(2);
assertEquals(0, s1.createDrawingPatriarch().getCharts().size()); assertEquals(0, s1.createDrawingPatriarch().getCharts().size());
assertEquals(2, s2.createDrawingPatriarch().getCharts().size()); assertEquals(2, s2.createDrawingPatriarch().getCharts().size());
assertEquals(1, s3.createDrawingPatriarch().getCharts().size()); assertEquals(1, s3.createDrawingPatriarch().getCharts().size());
// Check the titles // Check the titles
XSSFChart chart = s2.createDrawingPatriarch().getCharts().get(0); XSSFChart chart = s2.createDrawingPatriarch().getCharts().get(0);
assertEquals(null, chart.getTitleText()); assertEquals(null, chart.getTitleText());
chart = s2.createDrawingPatriarch().getCharts().get(1); chart = s2.createDrawingPatriarch().getCharts().get(1);
assertEquals("Pie Chart Title Thingy", chart.getTitleText().getString()); assertEquals("Pie Chart Title Thingy", chart.getTitleText().getString());
chart = s3.createDrawingPatriarch().getCharts().get(0); chart = s3.createDrawingPatriarch().getCharts().get(0);
assertEquals("Sheet 3 Chart with Title", chart.getTitleText().getString()); assertEquals("Sheet 3 Chart with Title", chart.getTitleText().getString());
assertNotNull(XSSFTestDataSamples.writeOutAndReadBack(wb)); assertNotNull(XSSFTestDataSamples.writeOutAndReadBack(wb));
} }
@ -68,14 +68,15 @@ public final class TestXSSFChart extends TestCase {
XSSFChart c1 = d1.createChart(a1); XSSFChart c1 = d1.createChart(a1);
assertEquals(1, d1.getCharts().size()); assertEquals(1, d1.getCharts().size());
assertNotNull(c1.getGraphicFrame()); assertNotNull(c1.getGraphicFrame());
assertNotNull(c1.getOrCreateLegend()); assertNotNull(c1.getOrAddLegend());
XSSFClientAnchor a2 = new XSSFClientAnchor(0, 0, 0, 0, 1, 11, 10, 60); XSSFClientAnchor a2 = new XSSFClientAnchor(0, 0, 0, 0, 1, 11, 10, 60);
XSSFChart c2 = d1.createChart(a2); XSSFChart c2 = d1.createChart(a2);
assertNotNull(c2); assertNotNull(c2);
assertEquals(2, d1.getCharts().size()); assertEquals(2, d1.getCharts().size());
assertNotNull(XSSFTestDataSamples.writeOutAndReadBack(wb)); assertNotNull(XSSFTestDataSamples.writeOutAndReadBack(wb));
} }
} }

View File

@ -17,24 +17,32 @@
package org.apache.poi.xssf.usermodel.charts; package org.apache.poi.xssf.usermodel.charts;
import org.apache.poi.xddf.usermodel.chart.AxisCrosses;
import org.apache.poi.xddf.usermodel.chart.AxisPosition;
import org.apache.poi.xddf.usermodel.chart.XDDFCategoryAxis;
import org.apache.poi.xssf.usermodel.XSSFChart;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.apache.poi.ss.usermodel.charts.*;
import org.apache.poi.xssf.usermodel.*;
public final class TestXSSFCategoryAxis extends TestCase { public final class TestXSSFCategoryAxis extends TestCase {
public void testAccessMethods() throws Exception { public void testAccessMethods() throws Exception {
XSSFWorkbook wb = new XSSFWorkbook(); XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet sheet = wb.createSheet(); XSSFSheet sheet = wb.createSheet();
XSSFDrawing drawing = sheet.createDrawingPatriarch(); XSSFDrawing drawing = sheet.createDrawingPatriarch();
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30); XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
XSSFChart chart = drawing.createChart(anchor); XSSFChart chart = drawing.createChart(anchor);
XSSFCategoryAxis axis = chart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM); XDDFCategoryAxis axis = chart.createCategoryAxis(AxisPosition.BOTTOM);
axis.setCrosses(AxisCrosses.AUTO_ZERO); axis.setCrosses(AxisCrosses.AUTO_ZERO);
assertEquals(axis.getCrosses(), AxisCrosses.AUTO_ZERO); assertEquals(axis.getCrosses(), AxisCrosses.AUTO_ZERO);
assertEquals(chart.getAxis().size(), 1); assertEquals(chart.getAxes().size(), 1);
wb.close();
} }
} }

View File

@ -19,18 +19,22 @@ package org.apache.poi.xssf.usermodel.charts;
import java.util.List; import java.util.List;
import junit.framework.TestCase; import org.apache.poi.xddf.usermodel.chart.AxisPosition;
import org.apache.poi.xddf.usermodel.chart.AxisTickMark;
import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.xddf.usermodel.chart.XDDFChartAxis;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.charts.*;
import org.apache.poi.xssf.XSSFTestDataSamples; import org.apache.poi.xssf.XSSFTestDataSamples;
import org.apache.poi.xssf.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFChart;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import junit.framework.TestCase;
public final class TestXSSFChartAxis extends TestCase { public final class TestXSSFChartAxis extends TestCase {
private static final double EPSILON = 1E-7; private static final double EPSILON = 1E-7;
private final XSSFChartAxis axis; private final XDDFChartAxis axis;
public TestXSSFChartAxis() { public TestXSSFChartAxis() {
super(); super();
@ -39,9 +43,9 @@ public final class TestXSSFChartAxis extends TestCase {
XSSFDrawing drawing = sheet.createDrawingPatriarch(); XSSFDrawing drawing = sheet.createDrawingPatriarch();
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30); XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
XSSFChart chart = drawing.createChart(anchor); XSSFChart chart = drawing.createChart(anchor);
axis = chart.getChartAxisFactory().createValueAxis(AxisPosition.BOTTOM); axis = chart.createValueAxis(AxisPosition.BOTTOM);
} }
public void testLogBaseIllegalArgument() throws Exception { public void testLogBaseIllegalArgument() throws Exception {
IllegalArgumentException iae = null; IllegalArgumentException iae = null;
try { try {
@ -119,13 +123,12 @@ public final class TestXSSFChartAxis extends TestCase {
public void testGetChartAxisBug57362() { public void testGetChartAxisBug57362() {
//Load existing excel with some chart on it having primary and secondary axis. //Load existing excel with some chart on it having primary and secondary axis.
final Workbook workbook = XSSFTestDataSamples.openSampleWorkbook("57362.xlsx"); final XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("57362.xlsx");
final Sheet sh = workbook.getSheetAt(0); final XSSFSheet sh = workbook.getSheetAt(0);
final XSSFSheet xsh = (XSSFSheet) sh; final XSSFDrawing drawing = sh.createDrawingPatriarch();
final XSSFDrawing drawing = xsh.createDrawingPatriarch();
final XSSFChart chart = drawing.getCharts().get(0); final XSSFChart chart = drawing.getCharts().get(0);
final List<? extends XSSFChartAxis> axisList = chart.getAxis(); final List<? extends XDDFChartAxis> axisList = chart.getAxes();
assertEquals(4, axisList.size()); assertEquals(4, axisList.size());
assertNotNull(axisList.get(0)); assertNotNull(axisList.get(0));

View File

@ -23,13 +23,12 @@ import static org.junit.Assert.assertTrue;
import java.io.IOException; import java.io.IOException;
import org.apache.poi.ss.usermodel.Chart; import org.apache.poi.xddf.usermodel.chart.LegendPosition;
import org.apache.poi.ss.usermodel.ClientAnchor; import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend;
import org.apache.poi.ss.usermodel.Drawing; import org.apache.poi.xssf.usermodel.XSSFChart;
import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.ss.usermodel.charts.ChartLegend; import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.ss.usermodel.charts.LegendPosition;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.Test; import org.junit.Test;
@ -39,28 +38,28 @@ import org.junit.Test;
public final class TestXSSFChartLegend { public final class TestXSSFChartLegend {
@Test @Test
public void testLegendPositionAccessMethods() throws IOException { public void testLegendPositionAccessMethods() throws IOException {
Workbook wb = new XSSFWorkbook(); XSSFWorkbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet(); XSSFSheet sheet = wb.createSheet();
Drawing<?> drawing = sheet.createDrawingPatriarch(); XSSFDrawing drawing = sheet.createDrawingPatriarch();
ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30); XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
Chart chart = drawing.createChart(anchor); XSSFChart chart = drawing.createChart(anchor);
ChartLegend legend = chart.getOrCreateLegend(); XDDFChartLegend legend = chart.getOrAddLegend();
legend.setPosition(LegendPosition.TOP_RIGHT); legend.setPosition(LegendPosition.TOP_RIGHT);
assertEquals(LegendPosition.TOP_RIGHT, legend.getPosition()); assertEquals(LegendPosition.TOP_RIGHT, legend.getPosition());
wb.close(); wb.close();
} }
@Test @Test
public void test_setOverlay_defaultChartLegend_expectOverlayInitialValueSetToFalse() throws IOException { public void test_setOverlay_defaultChartLegend_expectOverlayInitialValueSetToFalse() throws IOException {
// Arrange // Arrange
Workbook wb = new XSSFWorkbook(); XSSFWorkbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet(); XSSFSheet sheet = wb.createSheet();
Drawing<?> drawing = sheet.createDrawingPatriarch(); XSSFDrawing drawing = sheet.createDrawingPatriarch();
ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30); XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
Chart chart = drawing.createChart(anchor); XSSFChart chart = drawing.createChart(anchor);
ChartLegend legend = chart.getOrCreateLegend(); XDDFChartLegend legend = chart.getOrAddLegend();
// Act // Act
@ -73,12 +72,12 @@ public final class TestXSSFChartLegend {
@Test @Test
public void test_setOverlay_chartLegendSetToTrue_expectOverlayInitialValueSetToTrue() throws IOException { public void test_setOverlay_chartLegendSetToTrue_expectOverlayInitialValueSetToTrue() throws IOException {
// Arrange // Arrange
Workbook wb = new XSSFWorkbook(); XSSFWorkbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet(); XSSFSheet sheet = wb.createSheet();
Drawing<?> drawing = sheet.createDrawingPatriarch(); XSSFDrawing drawing = sheet.createDrawingPatriarch();
ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30); XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
Chart chart = drawing.createChart(anchor); XSSFChart chart = drawing.createChart(anchor);
ChartLegend legend = chart.getOrCreateLegend(); XDDFChartLegend legend = chart.getOrAddLegend();
// Act // Act
legend.setOverlay(true); legend.setOverlay(true);

View File

@ -26,24 +26,22 @@ import java.io.IOException;
import java.util.List; import java.util.List;
import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Chart;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.charts.AxisCrosses;
import org.apache.poi.ss.usermodel.charts.AxisPosition;
import org.apache.poi.ss.usermodel.charts.ChartAxis;
import org.apache.poi.ss.usermodel.charts.ChartDataSource;
import org.apache.poi.ss.usermodel.charts.ChartLegend;
import org.apache.poi.ss.usermodel.charts.DataSources;
import org.apache.poi.ss.usermodel.charts.LegendPosition;
import org.apache.poi.ss.usermodel.charts.LineChartData;
import org.apache.poi.ss.usermodel.charts.ValueAxis;
import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xddf.usermodel.chart.AxisCrosses;
import org.apache.poi.xddf.usermodel.chart.AxisPosition;
import org.apache.poi.xddf.usermodel.chart.ChartTypes;
import org.apache.poi.xddf.usermodel.chart.LegendPosition;
import org.apache.poi.xddf.usermodel.chart.XDDFChartAxis;
import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend;
import org.apache.poi.xddf.usermodel.chart.XDDFDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory;
import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFValueAxis;
import org.apache.poi.xssf.XSSFTestDataSamples; import org.apache.poi.xssf.XSSFTestDataSamples;
import org.apache.poi.xssf.usermodel.XSSFChart; import org.apache.poi.xssf.usermodel.XSSFChart;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFDrawing; import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFRichTextString; import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFSheet;
@ -54,9 +52,9 @@ import org.junit.Test;
* Test get/set chart title. * Test get/set chart title.
*/ */
public class TestXSSFChartTitle { public class TestXSSFChartTitle {
private Workbook createWorkbookWithChart() { private XSSFWorkbook createWorkbookWithChart() {
Workbook wb = new XSSFWorkbook(); XSSFWorkbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet("linechart"); XSSFSheet sheet = wb.createSheet("linechart");
final int NUM_OF_ROWS = 3; final int NUM_OF_ROWS = 3;
final int NUM_OF_COLUMNS = 10; final int NUM_OF_COLUMNS = 10;
@ -71,28 +69,26 @@ public class TestXSSFChartTitle {
} }
} }
Drawing<?> drawing = sheet.createDrawingPatriarch(); XSSFDrawing drawing = sheet.createDrawingPatriarch();
ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15); XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15);
Chart chart = drawing.createChart(anchor); XSSFChart chart = drawing.createChart(anchor);
ChartLegend legend = chart.getOrCreateLegend(); XDDFChartLegend legend = chart.getOrAddLegend();
legend.setPosition(LegendPosition.TOP_RIGHT); legend.setPosition(LegendPosition.TOP_RIGHT);
LineChartData data = chart.getChartDataFactory().createLineChartData();
// Use a category axis for the bottom axis. // Use a category axis for the bottom axis.
ChartAxis bottomAxis = chart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM); XDDFChartAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
ValueAxis leftAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT); XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
leftAxis.setCrosses(AxisCrosses.AUTO_ZERO); leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
ChartDataSource<Number> xs = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(0, 0, 0, NUM_OF_COLUMNS - 1)); XDDFDataSource<Double> xs = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(0, 0, 0, NUM_OF_COLUMNS - 1));
ChartDataSource<Number> ys1 = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, NUM_OF_COLUMNS - 1)); XDDFNumericalDataSource<Double> ys1 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, NUM_OF_COLUMNS - 1));
ChartDataSource<Number> ys2 = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, NUM_OF_COLUMNS - 1)); XDDFNumericalDataSource<Double> ys2 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, NUM_OF_COLUMNS - 1));
XDDFChartData data = chart.createData(ChartTypes.LINE, bottomAxis, leftAxis);
data.addSeries(xs, ys1); data.addSeries(xs, ys1);
data.addSeries(xs, ys2); data.addSeries(xs, ys2);
chart.plot(data);
chart.plot(data, bottomAxis, leftAxis);
return wb; return wb;
} }
@ -100,16 +96,14 @@ public class TestXSSFChartTitle {
/** /**
* Gets the first chart from the named sheet in the workbook. * Gets the first chart from the named sheet in the workbook.
*/ */
private XSSFChart getChartFromWorkbook(Workbook wb, String sheetName) { private XSSFChart getChartFromWorkbook(XSSFWorkbook wb, String sheetName) {
Sheet sheet = wb.getSheet(sheetName); XSSFSheet sheet = wb.getSheet(sheetName);
if (sheet instanceof XSSFSheet) { XSSFSheet xsheet = sheet;
XSSFSheet xsheet = (XSSFSheet) sheet; XSSFDrawing drawing = xsheet.getDrawingPatriarch();
XSSFDrawing drawing = xsheet.getDrawingPatriarch(); if (drawing != null) {
if (drawing != null) { List<XSSFChart> charts = drawing.getCharts();
List<XSSFChart> charts = drawing.getCharts(); if (charts != null && charts.size() > 0) {
if (charts != null && charts.size() > 0) { return charts.get(0);
return charts.get(0);
}
} }
} }
return null; return null;
@ -117,7 +111,7 @@ public class TestXSSFChartTitle {
@Test @Test
public void testNewChart() throws IOException { public void testNewChart() throws IOException {
Workbook wb = createWorkbookWithChart(); XSSFWorkbook wb = createWorkbookWithChart();
XSSFChart chart = getChartFromWorkbook(wb, "linechart"); XSSFChart chart = getChartFromWorkbook(wb, "linechart");
assertNotNull(chart); assertNotNull(chart);
assertNull(chart.getTitleText()); assertNull(chart.getTitleText());
@ -126,7 +120,7 @@ public class TestXSSFChartTitle {
XSSFRichTextString queryTitle = chart.getTitleText(); XSSFRichTextString queryTitle = chart.getTitleText();
assertNotNull(queryTitle); assertNotNull(queryTitle);
assertEquals(myTitle, queryTitle.toString()); assertEquals(myTitle, queryTitle.toString());
final String myTitleFormula = "1 & \" and \" & 2"; final String myTitleFormula = "1 & \" and \" & 2";
chart.setTitleFormula(myTitleFormula); chart.setTitleFormula(myTitleFormula);
// setting formula should unset text, but since there is a formula, returns an empty string // setting formula should unset text, but since there is a formula, returns an empty string
@ -139,7 +133,7 @@ public class TestXSSFChartTitle {
@Test @Test
public void testExistingChartWithTitle() throws IOException { public void testExistingChartWithTitle() throws IOException {
Workbook wb = XSSFTestDataSamples.openSampleWorkbook("chartTitle_withTitle.xlsx"); XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("chartTitle_withTitle.xlsx");
XSSFChart chart = getChartFromWorkbook(wb, "Sheet1"); XSSFChart chart = getChartFromWorkbook(wb, "Sheet1");
assertNotNull(chart); assertNotNull(chart);
XSSFRichTextString originalTitle = chart.getTitleText(); XSSFRichTextString originalTitle = chart.getTitleText();
@ -155,7 +149,7 @@ public class TestXSSFChartTitle {
@Test @Test
public void testExistingChartNoTitle() throws IOException { public void testExistingChartNoTitle() throws IOException {
Workbook wb = XSSFTestDataSamples.openSampleWorkbook("chartTitle_noTitle.xlsx"); XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("chartTitle_noTitle.xlsx");
XSSFChart chart = getChartFromWorkbook(wb, "Sheet1"); XSSFChart chart = getChartFromWorkbook(wb, "Sheet1");
assertNotNull(chart); assertNotNull(chart);
assertNull(chart.getTitleText()); assertNull(chart.getTitleText());
@ -169,7 +163,7 @@ public class TestXSSFChartTitle {
@Test @Test
public void testExistingChartWithFormulaTitle() throws IOException { public void testExistingChartWithFormulaTitle() throws IOException {
Workbook wb = XSSFTestDataSamples.openSampleWorkbook("chartTitle_withTitleFormula.xlsx"); XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("chartTitle_withTitleFormula.xlsx");
XSSFChart chart = getChartFromWorkbook(wb, "Sheet1"); XSSFChart chart = getChartFromWorkbook(wb, "Sheet1");
assertNotNull(chart); assertNotNull(chart);
XSSFRichTextString originalTitle = chart.getTitleText(); XSSFRichTextString originalTitle = chart.getTitleText();

Some files were not shown because too many files have changed in this diff Show More