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,69 +67,41 @@ 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");
// embedded Excel workbook that holds the chart data }
POIXMLDocumentPart xlsPart = chart.getRelations().get(0);
try (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 // Series Text
CTSerTx tx = ser.getTx(); List<XDDFChartData> series = chart.getChartSeries();
tx.getStrRef().getStrCache().getPtArray(0).setV(chartTitle); XDDFPieChartData pie = (XDDFPieChartData) series.get(0);
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 // Category Axis Data
CTAxDataSource cat = ser.getCat(); List<String> listCategories = new ArrayList<String>(3);
CTStrData strData = cat.getStrRef().getStrCache();
// Values // Values
CTNumDataSource val = ser.getVal(); List<Double> listValues = new ArrayList<Double>(3);
CTNumData numData = val.getNumRef().getNumCache();
strData.setPtArray(null); // unset old axis text
numData.setPtArray(null); // unset old values
// set model // set model
int idx = 0;
int rownum = 1;
String ln; String ln;
while ((ln = modelReader.readLine()) != null) { while((ln = modelReader.readLine()) != null){
String[] vals = ln.split("\\s+"); String[] vals = ln.split("\\s+");
CTNumVal numVal = numData.addNewPt(); listCategories.add(vals[0]);
numVal.setIdx(idx); listValues.add(Double.valueOf(vals[1]));
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); String[] categories = listCategories.toArray(new String[listCategories.size()]);
strData.getPtCount().setVal(idx); Double[] values = listValues.toArray(new Double[listValues.size()]);
String numDataRange = new CellRangeAddress(1, rownum - 1, 1, 1).formatAsString(sheet.getSheetName(), true); final int numOfPoints = categories.length;
val.getNumRef().setF(numDataRange); final String categoryDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 0, 0));
String axisDataRange = new CellRangeAddress(1, rownum - 1, 0, 0).formatAsString(sheet.getSheetName(), true); final String valuesDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 1, 1));
cat.getStrRef().setF(axisDataRange); final XDDFDataSource<?> categoriesData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange);
final XDDFNumericalDataSource<? extends Number> valuesData = XDDFDataSourcesFactory.fromArray(values, valuesDataRange);
// updated the embedded workbook with the data XDDFPieChartData.Series firstSeries = (XDDFPieChartData.Series) pie.getSeries().get(0);
try (OutputStream xlsOut = xlsPart.getPackagePart().getOutputStream()) { firstSeries.replaceData(categoriesData, valuesData);
wb.write(xlsOut); firstSeries.setTitle(chartTitle, chart.setSheetTitle(chartTitle));
} firstSeries.setExplosion(25);
chart.plot(pie);
// save the result // save the result
try (OutputStream out = new FileOutputStream("pie-chart-demo-output.pptx")) { try (OutputStream out = new FileOutputStream("pie-chart-demo-output.pptx")) {
@ -148,5 +110,4 @@ public class PieChartDemo {
} }
} }
} }
}
} }

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;
@ -62,28 +63,27 @@ public class ScatterChart {
} }
} }
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);
chart.plot(data, bottomAxis, leftAxis); data.addSeries(xs, ys1);
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,18 +19,21 @@ 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 {
/** /**

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.

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 {
/** /**

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;
/** /**
* 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 {
/** /**

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 {
/** /**

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;
@ -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 && RelationPart rp = createRelationship
getPackage().getPartsByName(Pattern.compile(Pattern.quote(slideName))).size() > 0) { (relationType, XSLFFactory.getInstance(), cnt, false);
// name is taken => try next one
found = true;
}
if (!found) {
break;
}
cnt++;
}
}
RelationPart rp = createRelationship(
XSLFRelation.SLIDE, 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.
*/ */
@ -279,6 +298,23 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
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.
@ -445,6 +465,16 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
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,20 +55,30 @@ 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 * Underlying workbook
*/ */
private CTChartSpace chartSpace; private XSSFWorkbook workbook;
/** /**
* The Chart within that * Construct a PresentationML chart.
*/ */
private CTChart chart; protected XSLFChart() {
super();
}
/** /**
* Construct a chart from a package part. * 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>
@ -64,29 +87,123 @@ public final class XSLFChart extends POIXMLDocumentPart {
*/ */
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(){ public String formatRange(CellRangeAddress range) {
return chart; return range.formatAsString(getSheet().getSheetName(), true);
}
private XSSFSheet getSheet() {
XSSFSheet sheet = null;
try {
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 @Override
@ -94,11 +211,17 @@ public final class XSLFChart extends POIXMLDocumentPart {
XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS); XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
xmlOptions.setSaveSyntheticDocumentElement(new QName(CTChartSpace.type.getName().getNamespaceURI(), "chartSpace", "c")); xmlOptions.setSaveSyntheticDocumentElement(new QName(CTChartSpace.type.getName().getNamespaceURI(), "chartSpace", "c"));
PackagePart part = getPackagePart(); if (workbook != null) {
OutputStream out = part.getOutputStream(); try {
chartSpace.save(out, xmlOptions); saveWorkbook(workbook);
out.close(); } 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,14 +117,17 @@ public class XSLFGraphicFrame extends XSLFShape implements GraphicalFrame<XSLFSh
* *
* @return rotation angle in degrees * @return rotation angle in degrees
*/ */
@Override
public double getRotation(){ public double getRotation(){
return 0; return 0;
} }
@Override
public void setFlipHorizontal(boolean flip){ public void setFlipHorizontal(boolean flip){
throw new IllegalArgumentException("Operation not supported"); throw new IllegalArgumentException("Operation not supported");
} }
@Override
public void setFlipVertical(boolean flip){ public void setFlipVertical(boolean flip){
throw new IllegalArgumentException("Operation not supported"); throw new IllegalArgumentException("Operation not supported");
} }
@ -132,10 +137,12 @@ public class XSLFGraphicFrame extends XSLFShape implements GraphicalFrame<XSLFSh
* *
* @return whether the shape is horizontally flipped * @return whether the shape is horizontally flipped
*/ */
@Override
public boolean getFlipHorizontal(){ public boolean getFlipHorizontal(){
return false; return false;
} }
@Override
public boolean getFlipVertical(){ 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";

View File

@ -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){
_shapes = null;
_spTree = null; _spTree = null;
_drawing = null;
_spTree = null;
_placeholders = null;
// fix-me: wth would this ever happen to work ...
// first copy the source xml // first copy the source xml
getSpTree().set(src.getSpTree()); getSpTree().set(src.getSpTree().copy());
// recursively update each shape wipeAndReinitialize(src, 0);
return this;
}
private void wipeAndReinitialize(XSLFSheet src, int offset) {
// explicitly initialize drawing and shapes from _spTree
_shapes = null;
_drawing = null;
initDrawingAndShapes();
// placeholders will be implicitly initialized when requested
_placeholders = null;
// update each shape according to its own additional copy rules
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;
} }

View File

@ -124,6 +124,14 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
return "sld"; return "sld";
} }
protected void removeChartRelation(XSLFChart chart) {
removeRelation(chart);
}
protected void removeLayoutRelation(XSLFSlideLayout layout) {
removeRelation(layout, false);
}
@Override @Override
public XSLFSlideLayout getMasterSheet(){ public XSLFSlideLayout getMasterSheet(){
return getSlideLayout(); return getSlideLayout();

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,22 +64,15 @@ 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")
*/
private CTChartSpace chartSpace;
/**
* The Chart within that
*/
private CTChart chart;
List<XSSFChartAxis> axis = new ArrayList<>(); List<XSSFChartAxis> axis = new ArrayList<>();
/** /**
@ -97,26 +86,21 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
/** /**
* Construct a SpreadsheetML chart from a package part. * Construct a SpreadsheetML chart from a package part.
* *
* @param part the package part holding the chart data, * @param part
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code> * 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 * @since POI 3.14-Beta1
*/ */
protected XSSFChart(PackagePart part) throws IOException, XmlException { protected XSSFChart(PackagePart part) throws IOException, XmlException {
super(part); super(part);
chartSpace = ChartSpaceDocument.Factory.parse(part.getInputStream(), DEFAULT_XML_OPTIONS).getChartSpace();
chart = chartSpace.getChart();
} }
/** /**
* Construct a new CTChartSpace bean. * Construct a new CTChartSpace bean. By default, it's just an empty placeholder for chart objects.
* By default, it's just an empty placeholder for chart objects.
*/ */
private void createChart() { private void createChart() {
chartSpace = CTChartSpace.Factory.newInstance(); CTPlotArea plotArea = getCTPlotArea();
chart = chartSpace.addNewChart();
CTPlotArea plotArea = chart.addNewPlotArea();
plotArea.addNewLayout(); plotArea.addNewLayout();
chart.addNewPlotVisOnly().setVal(true); chart.addNewPlotVisOnly().setVal(true);
@ -134,47 +118,27 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
printSettings.addNewPageSetup(); printSettings.addNewPageSetup();
} }
/**
* Return the underlying CTChartSpace bean, the root element of the SpreadsheetML 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
protected void commit() throws IOException { protected void commit() throws IOException {
XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS); XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
/* /*
Saved chart space must have the following namespaces set: * Saved chart space must have the following namespaces set: <c:chartSpace
<c:chartSpace * xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart"
xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart" * xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r=
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" * "http://schemas.openxmlformats.org/officeDocument/2006/relationships">
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
*/ */
xmlOptions.setSaveSyntheticDocumentElement(new QName(CTChartSpace.type.getName().getNamespaceURI(), "chartSpace", "c")); xmlOptions.setSaveSyntheticDocumentElement(new QName(CTChartSpace.type.getName().getNamespaceURI(), "chartSpace", "c"));
PackagePart part = getPackagePart(); PackagePart part = getPackagePart();
OutputStream out = part.getOutputStream(); try (OutputStream out = part.getOutputStream()) {
chartSpace.save(out, xmlOptions); chartSpace.save(out, xmlOptions);
out.close(); }
} }
/** /**
* Returns the parent graphic frame. * Returns the parent graphic frame.
*
* @return the graphic frame this chart belongs to * @return the graphic frame this chart belongs to
*/ */
public XSSFGraphicFrame getGraphicFrame() { public XSSFGraphicFrame getGraphicFrame() {
@ -188,19 +152,31 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
this.frame = 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,7 +203,10 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
return categoryAxis; return categoryAxis;
} }
public XSSFDateAxis createDateAxis(AxisPosition pos) { @Override
@Deprecated
@Removal(version="4.2")
public XSSFDateAxis createDateAxis(org.apache.poi.ss.usermodel.charts.AxisPosition pos) {
long id = axis.size() + 1; long id = axis.size() + 1;
XSSFDateAxis dateAxis = new XSSFDateAxis(this, id, pos); XSSFDateAxis dateAxis = new XSSFDateAxis(this, id, pos);
if (axis.size() == 1) { if (axis.size() == 1) {
@ -236,6 +218,12 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
return 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();
@ -243,26 +231,13 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
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.
@ -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,14 +290,16 @@ 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;
@ -348,7 +325,8 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
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;
@ -372,22 +350,23 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
/** /**
* Get the chart title formula expression if there is one * Get the chart title formula expression if there is one
*
* @return formula expression or null * @return formula expression or null
*/ */
public String getTitleFormula() { public String getTitleFormula() {
if(! chart.isSetTitle()) { if (!chart.isSetTitle()) {
return null; return null;
} }
CTTitle title = chart.getTitle(); CTTitle title = chart.getTitle();
if (! title.isSetTx()) { if (!title.isSetTx()) {
return null; return null;
} }
CTTx tx = title.getTx(); CTTx tx = title.getTx();
if (! tx.isSetStrRef()) { if (!tx.isSetStrRef()) {
return null; return null;
} }
@ -396,6 +375,7 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
/** /**
* Set the formula expression to use for the chart title * Set the formula expression to use for the chart title
*
* @param formula * @param formula
*/ */
public void setTitleFormula(String formula) { public void setTitleFormula(String formula) {
@ -427,26 +407,23 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
strRef.setF(formula); 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() +
ctPlotArea.sizeOfCatAxArray() +
ctPlotArea.sizeOfDateAxArray() +
ctPlotArea.sizeOfSerAxArray();
return totalAxisCount > 0; return totalAxisCount > 0;
} }
@Deprecated
@Removal(version="4.2")
private void parseAxis() { private void parseAxis() {
// TODO: add other axis types // TODO: add other axis types
parseCategoryAxis(); parseCategoryAxis();
@ -454,18 +431,24 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
parseValueAxis(); parseValueAxis();
} }
@Deprecated
@Removal(version="4.2")
private void parseCategoryAxis() { private void parseCategoryAxis() {
for (CTCatAx catAx : chart.getPlotArea().getCatAxArray()) { for (CTCatAx catAx : chart.getPlotArea().getCatAxArray()) {
axis.add(new XSSFCategoryAxis(this, catAx)); axis.add(new XSSFCategoryAxis(this, catAx));
} }
} }
@Deprecated
@Removal(version="4.2")
private void parseDateAxis() { private void parseDateAxis() {
for (CTDateAx dateAx : chart.getPlotArea().getDateAxArray()) { for (CTDateAx dateAx : chart.getPlotArea().getDateAxArray()) {
axis.add(new XSSFDateAxis(this, dateAx)); axis.add(new XSSFDateAxis(this, dateAx));
} }
} }
@Deprecated
@Removal(version="4.2")
private void parseValueAxis() { private void parseValueAxis() {
for (CTValAx valAx : chart.getPlotArea().getValAxArray()) { for (CTValAx valAx : chart.getPlotArea().getValAxArray()) {
axis.add(new XSSFValueAxis(this, valAx)); 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);
} }

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;

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;

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,6 +36,7 @@ public class XSSFChartDataFactory implements ChartDataFactory {
/** /**
* @return new scatter charts data instance * @return new scatter charts data instance
*/ */
@Override
public XSSFScatterChartData createScatterChartData() { public XSSFScatterChartData createScatterChartData() {
return new XSSFScatterChartData(); return new XSSFScatterChartData();
} }
@ -42,6 +44,7 @@ public class XSSFChartDataFactory implements ChartDataFactory {
/** /**
* @return new line charts data instance * @return new line charts data instance
*/ */
@Override
public XSSFLineChartData createLineChartData() { 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,6 +73,7 @@ public final class XSSFChartLegend implements ChartLegend {
return legend; return legend;
} }
@Override
public void setPosition(LegendPosition position) { public void setPosition(LegendPosition position) {
if (!legend.isSetLegendPos()) { if (!legend.isSetLegendPos()) {
legend.addNewLegendPos(); legend.addNewLegendPos();
@ -82,6 +84,7 @@ public final class XSSFChartLegend implements ChartLegend {
/* /*
* According to ECMA-376 default position is RIGHT. * According to ECMA-376 default position is RIGHT.
*/ */
@Override
public LegendPosition getPosition() { public LegendPosition getPosition() {
if (legend.isSetLegendPos()) { if (legend.isSetLegendPos()) {
return toLegendPosition(legend.getLegendPos()); return toLegendPosition(legend.getLegendPos());
@ -90,6 +93,7 @@ public final class XSSFChartLegend implements ChartLegend {
} }
} }
@Override
public XSSFManualLayout getManualLayout() { public XSSFManualLayout getManualLayout() {
if (!legend.isSetLayout()) { if (!legend.isSetLayout()) {
legend.addNewLayout(); legend.addNewLayout();
@ -97,10 +101,12 @@ public final class XSSFChartLegend implements ChartLegend {
return new XSSFManualLayout(legend.getLayout()); return new XSSFManualLayout(legend.getLayout());
} }
@Override
public boolean isOverlay() { public boolean isOverlay() {
return legend.getOverlay().getVal(); return legend.getOverlay().getVal();
} }
@Override
public void setOverlay(boolean value) { 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;

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,6 +77,7 @@ public final class XSSFManualLayout implements ManualLayout {
return layout; return layout;
} }
@Override
public void setWidthRatio(double ratio) { public void setWidthRatio(double ratio) {
if (!layout.isSetW()) { if (!layout.isSetW()) {
layout.addNewW(); layout.addNewW();
@ -82,6 +85,7 @@ public final class XSSFManualLayout implements ManualLayout {
layout.getW().setVal(ratio); layout.getW().setVal(ratio);
} }
@Override
public double getWidthRatio() { public double getWidthRatio() {
if (!layout.isSetW()) { if (!layout.isSetW()) {
return 0.0; return 0.0;
@ -89,6 +93,7 @@ public final class XSSFManualLayout implements ManualLayout {
return layout.getW().getVal(); return layout.getW().getVal();
} }
@Override
public void setHeightRatio(double ratio) { public void setHeightRatio(double ratio) {
if (!layout.isSetH()) { if (!layout.isSetH()) {
layout.addNewH(); layout.addNewH();
@ -96,6 +101,7 @@ public final class XSSFManualLayout implements ManualLayout {
layout.getH().setVal(ratio); layout.getH().setVal(ratio);
} }
@Override
public double getHeightRatio() { public double getHeightRatio() {
if (!layout.isSetH()) { if (!layout.isSetH()) {
return 0.0; return 0.0;
@ -103,6 +109,7 @@ public final class XSSFManualLayout implements ManualLayout {
return layout.getH().getVal(); return layout.getH().getVal();
} }
@Override
public LayoutTarget getTarget() { public LayoutTarget getTarget() {
if (!layout.isSetLayoutTarget()) { if (!layout.isSetLayoutTarget()) {
return defaultLayoutTarget; return defaultLayoutTarget;
@ -110,6 +117,7 @@ public final class XSSFManualLayout implements ManualLayout {
return toLayoutTarget(layout.getLayoutTarget()); return toLayoutTarget(layout.getLayoutTarget());
} }
@Override
public void setTarget(LayoutTarget target) { public void setTarget(LayoutTarget target) {
if (!layout.isSetLayoutTarget()) { if (!layout.isSetLayoutTarget()) {
layout.addNewLayoutTarget(); layout.addNewLayoutTarget();
@ -117,6 +125,7 @@ public final class XSSFManualLayout implements ManualLayout {
layout.getLayoutTarget().setVal(fromLayoutTarget(target)); layout.getLayoutTarget().setVal(fromLayoutTarget(target));
} }
@Override
public LayoutMode getXMode() { public LayoutMode getXMode() {
if (!layout.isSetXMode()) { if (!layout.isSetXMode()) {
return defaultLayoutMode; return defaultLayoutMode;
@ -124,6 +133,7 @@ public final class XSSFManualLayout implements ManualLayout {
return toLayoutMode(layout.getXMode()); return toLayoutMode(layout.getXMode());
} }
@Override
public void setXMode(LayoutMode mode) { public void setXMode(LayoutMode mode) {
if (!layout.isSetXMode()) { if (!layout.isSetXMode()) {
layout.addNewXMode(); layout.addNewXMode();
@ -131,6 +141,7 @@ public final class XSSFManualLayout implements ManualLayout {
layout.getXMode().setVal(fromLayoutMode(mode)); layout.getXMode().setVal(fromLayoutMode(mode));
} }
@Override
public LayoutMode getYMode() { public LayoutMode getYMode() {
if (!layout.isSetYMode()) { if (!layout.isSetYMode()) {
return defaultLayoutMode; return defaultLayoutMode;
@ -138,6 +149,7 @@ public final class XSSFManualLayout implements ManualLayout {
return toLayoutMode(layout.getYMode()); return toLayoutMode(layout.getYMode());
} }
@Override
public void setYMode(LayoutMode mode) { public void setYMode(LayoutMode mode) {
if (!layout.isSetYMode()) { if (!layout.isSetYMode()) {
layout.addNewYMode(); layout.addNewYMode();
@ -145,6 +157,7 @@ public final class XSSFManualLayout implements ManualLayout {
layout.getYMode().setVal(fromLayoutMode(mode)); layout.getYMode().setVal(fromLayoutMode(mode));
} }
@Override
public double getX() { public double getX() {
if (!layout.isSetX()) { if (!layout.isSetX()) {
return 0.0; return 0.0;
@ -152,6 +165,7 @@ public final class XSSFManualLayout implements ManualLayout {
return layout.getX().getVal(); return layout.getX().getVal();
} }
@Override
public void setX(double x) { public void setX(double x) {
if (!layout.isSetX()) { if (!layout.isSetX()) {
layout.addNewX(); layout.addNewX();
@ -159,6 +173,7 @@ public final class XSSFManualLayout implements ManualLayout {
layout.getX().setVal(x); layout.getX().setVal(x);
} }
@Override
public double getY() { public double getY() {
if (!layout.isSetY()) { if (!layout.isSetY()) {
return 0.0; return 0.0;
@ -166,6 +181,7 @@ public final class XSSFManualLayout implements ManualLayout {
return layout.getY().getVal(); return layout.getY().getVal();
} }
@Override
public void setY(double y) { public void setY(double y) {
if (!layout.isSetY()) { if (!layout.isSetY()) {
layout.addNewY(); layout.addNewY();
@ -173,6 +189,7 @@ public final class XSSFManualLayout implements ManualLayout {
layout.getY().setVal(y); layout.getY().setVal(y);
} }
@Override
public LayoutMode getWidthMode() { public LayoutMode getWidthMode() {
if (!layout.isSetWMode()) { if (!layout.isSetWMode()) {
return defaultLayoutMode; return defaultLayoutMode;
@ -180,6 +197,7 @@ public final class XSSFManualLayout implements ManualLayout {
return toLayoutMode(layout.getWMode()); return toLayoutMode(layout.getWMode());
} }
@Override
public void setWidthMode(LayoutMode mode) { public void setWidthMode(LayoutMode mode) {
if (!layout.isSetWMode()) { if (!layout.isSetWMode()) {
layout.addNewWMode(); layout.addNewWMode();
@ -187,6 +205,7 @@ public final class XSSFManualLayout implements ManualLayout {
layout.getWMode().setVal(fromLayoutMode(mode)); layout.getWMode().setVal(fromLayoutMode(mode));
} }
@Override
public LayoutMode getHeightMode() { public LayoutMode getHeightMode() {
if (!layout.isSetHMode()) { if (!layout.isSetHMode()) {
return defaultLayoutMode; return defaultLayoutMode;
@ -194,6 +213,7 @@ public final class XSSFManualLayout implements ManualLayout {
return toLayoutMode(layout.getHMode()); return toLayoutMode(layout.getHMode());
} }
@Override
public void setHeightMode(LayoutMode mode) { 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;
@ -69,34 +53,6 @@ public class XWPFChart extends POIXMLDocumentPart {
*/ */
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
@ -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);
} }

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>
@ -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,9 +436,10 @@ 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;
} }
@ -667,9 +694,10 @@ 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);
cursor.toEndToken(); cursor.toEndToken();
@ -706,9 +734,10 @@ 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);
cursor.toEndToken(); cursor.toEndToken();
@ -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;
public class TestXSLFChart { /**
/**
* a modified version from POI-examples * a modified version from POI-examples
*/ */
public class TestXSLFChart {
@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);
valSrc.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
OutputStream xlsOut = xlsPart.getPackagePart().getOutputStream();
wb.write(xlsOut);
xlsOut.close();
wb.close();
} }
checkLegendOperations(chart);
return chart;
}
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,10 +17,10 @@
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() {
@ -68,8 +68,9 @@ 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);

View File

@ -17,10 +17,16 @@
package org.apache.poi.xssf.usermodel.charts; package org.apache.poi.xssf.usermodel.charts;
import junit.framework.TestCase; 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 org.apache.poi.ss.usermodel.charts.*; import junit.framework.TestCase;
import org.apache.poi.xssf.usermodel.*;
public final class TestXSSFCategoryAxis extends TestCase { public final class TestXSSFCategoryAxis extends TestCase {
@ -30,11 +36,13 @@ public final class TestXSSFCategoryAxis 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);
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,7 +43,7 @@ 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 {
@ -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,12 +38,12 @@ 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());
@ -55,12 +54,12 @@ public final class TestXSSFChartLegend {
@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,10 +96,9 @@ 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();
@ -111,13 +106,12 @@ public class TestXSSFChartTitle {
return charts.get(0); return charts.get(0);
} }
} }
}
return null; return null;
} }
@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());
@ -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