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:
parent
2cda98a4aa
commit
c795f2e793
@ -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"/>
|
||||||
|
145
src/examples/src/org/apache/poi/xslf/usermodel/BarChartDemo.java
Normal file
145
src/examples/src/org/apache/poi/xslf/usermodel/BarChartDemo.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
@ -19,34 +19,24 @@
|
|||||||
|
|
||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
import org.apache.poi.POIXMLDocumentPart;
|
|
||||||
import org.apache.poi.ss.util.CellRangeAddress;
|
|
||||||
import org.apache.poi.ss.util.CellReference;
|
|
||||||
import org.apache.poi.xssf.usermodel.XSSFRow;
|
|
||||||
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
|
||||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumData;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumVal;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieChart;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieSer;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrData;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrVal;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.FileReader;
|
import java.io.FileReader;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.apache.poi.POIXMLDocumentPart;
|
||||||
|
import org.apache.poi.ss.util.CellRangeAddress;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFDataSource;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFPieChartData;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build a pie chart from a template pptx
|
* Build a pie chart from a template pptx
|
||||||
*
|
|
||||||
* @author Yegor Kozlov
|
|
||||||
*/
|
*/
|
||||||
public class PieChartDemo {
|
public class PieChartDemo {
|
||||||
private static void usage(){
|
private static void usage(){
|
||||||
@ -77,74 +67,45 @@ public class PieChartDemo {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (chart == null) throw new IllegalStateException("chart not found in the template");
|
if(chart == null) {
|
||||||
|
throw new IllegalStateException("chart not found in the template");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Series Text
|
||||||
|
List<XDDFChartData> series = chart.getChartSeries();
|
||||||
|
XDDFPieChartData pie = (XDDFPieChartData) series.get(0);
|
||||||
|
|
||||||
|
// Category Axis Data
|
||||||
|
List<String> listCategories = new ArrayList<String>(3);
|
||||||
|
|
||||||
|
// Values
|
||||||
|
List<Double> listValues = new ArrayList<Double>(3);
|
||||||
|
|
||||||
|
// set model
|
||||||
|
String ln;
|
||||||
|
while((ln = modelReader.readLine()) != null){
|
||||||
|
String[] vals = ln.split("\\s+");
|
||||||
|
listCategories.add(vals[0]);
|
||||||
|
listValues.add(Double.valueOf(vals[1]));
|
||||||
|
}
|
||||||
|
String[] categories = listCategories.toArray(new String[listCategories.size()]);
|
||||||
|
Double[] values = listValues.toArray(new Double[listValues.size()]);
|
||||||
|
|
||||||
// embedded Excel workbook that holds the chart data
|
final int numOfPoints = categories.length;
|
||||||
POIXMLDocumentPart xlsPart = chart.getRelations().get(0);
|
final String categoryDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 0, 0));
|
||||||
try (XSSFWorkbook wb = new XSSFWorkbook()) {
|
final String valuesDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 1, 1));
|
||||||
XSSFSheet sheet = wb.createSheet();
|
final XDDFDataSource<?> categoriesData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange);
|
||||||
|
final XDDFNumericalDataSource<? extends Number> valuesData = XDDFDataSourcesFactory.fromArray(values, valuesDataRange);
|
||||||
|
|
||||||
CTChart ctChart = chart.getCTChart();
|
XDDFPieChartData.Series firstSeries = (XDDFPieChartData.Series) pie.getSeries().get(0);
|
||||||
CTPlotArea plotArea = ctChart.getPlotArea();
|
firstSeries.replaceData(categoriesData, valuesData);
|
||||||
|
firstSeries.setTitle(chartTitle, chart.setSheetTitle(chartTitle));
|
||||||
|
firstSeries.setExplosion(25);
|
||||||
|
chart.plot(pie);
|
||||||
|
|
||||||
CTPieChart pieChart = plotArea.getPieChartArray(0);
|
// save the result
|
||||||
//Pie Chart Series
|
try (OutputStream out = new FileOutputStream("pie-chart-demo-output.pptx")) {
|
||||||
CTPieSer ser = pieChart.getSerArray(0);
|
pptx.write(out);
|
||||||
|
|
||||||
// Series Text
|
|
||||||
CTSerTx tx = ser.getTx();
|
|
||||||
tx.getStrRef().getStrCache().getPtArray(0).setV(chartTitle);
|
|
||||||
sheet.createRow(0).createCell(1).setCellValue(chartTitle);
|
|
||||||
String titleRef = new CellReference(sheet.getSheetName(), 0, 1, true, true).formatAsString();
|
|
||||||
tx.getStrRef().setF(titleRef);
|
|
||||||
|
|
||||||
// Category Axis Data
|
|
||||||
CTAxDataSource cat = ser.getCat();
|
|
||||||
CTStrData strData = cat.getStrRef().getStrCache();
|
|
||||||
|
|
||||||
// Values
|
|
||||||
CTNumDataSource val = ser.getVal();
|
|
||||||
CTNumData numData = val.getNumRef().getNumCache();
|
|
||||||
|
|
||||||
strData.setPtArray(null); // unset old axis text
|
|
||||||
numData.setPtArray(null); // unset old values
|
|
||||||
|
|
||||||
// set model
|
|
||||||
int idx = 0;
|
|
||||||
int rownum = 1;
|
|
||||||
String ln;
|
|
||||||
while ((ln = modelReader.readLine()) != null) {
|
|
||||||
String[] vals = ln.split("\\s+");
|
|
||||||
CTNumVal numVal = numData.addNewPt();
|
|
||||||
numVal.setIdx(idx);
|
|
||||||
numVal.setV(vals[1]);
|
|
||||||
|
|
||||||
CTStrVal sVal = strData.addNewPt();
|
|
||||||
sVal.setIdx(idx);
|
|
||||||
sVal.setV(vals[0]);
|
|
||||||
|
|
||||||
idx++;
|
|
||||||
XSSFRow row = sheet.createRow(rownum++);
|
|
||||||
row.createCell(0).setCellValue(vals[0]);
|
|
||||||
row.createCell(1).setCellValue(Double.valueOf(vals[1]));
|
|
||||||
}
|
|
||||||
numData.getPtCount().setVal(idx);
|
|
||||||
strData.getPtCount().setVal(idx);
|
|
||||||
|
|
||||||
String numDataRange = new CellRangeAddress(1, rownum - 1, 1, 1).formatAsString(sheet.getSheetName(), true);
|
|
||||||
val.getNumRef().setF(numDataRange);
|
|
||||||
String axisDataRange = new CellRangeAddress(1, rownum - 1, 0, 0).formatAsString(sheet.getSheetName(), true);
|
|
||||||
cat.getStrRef().setF(axisDataRange);
|
|
||||||
|
|
||||||
// updated the embedded workbook with the data
|
|
||||||
try (OutputStream xlsOut = xlsPart.getPackagePart().getOutputStream()) {
|
|
||||||
wb.write(xlsOut);
|
|
||||||
}
|
|
||||||
|
|
||||||
// save the result
|
|
||||||
try (OutputStream out = new FileOutputStream("pie-chart-demo-output.pptx")) {
|
|
||||||
pptx.write(out);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,4 @@
|
|||||||
|
My Bar or Column Chart
|
||||||
|
First 1.0
|
||||||
|
Second 3.0
|
||||||
|
Third 4.0
|
Binary file not shown.
@ -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")) {
|
||||||
|
@ -23,21 +23,22 @@ import java.io.FileOutputStream;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import org.apache.poi.ss.usermodel.Cell;
|
import org.apache.poi.ss.usermodel.Cell;
|
||||||
import org.apache.poi.ss.usermodel.Chart;
|
|
||||||
import org.apache.poi.ss.usermodel.ClientAnchor;
|
|
||||||
import org.apache.poi.ss.usermodel.Drawing;
|
|
||||||
import org.apache.poi.ss.usermodel.Row;
|
import org.apache.poi.ss.usermodel.Row;
|
||||||
import org.apache.poi.ss.usermodel.Sheet;
|
|
||||||
import org.apache.poi.ss.usermodel.Workbook;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.AxisCrosses;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.AxisPosition;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartDataSource;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartLegend;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.DataSources;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.LegendPosition;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.ScatterChartData;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.ValueAxis;
|
|
||||||
import org.apache.poi.ss.util.CellRangeAddress;
|
import org.apache.poi.ss.util.CellRangeAddress;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.AxisCrosses;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.AxisPosition;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.ChartTypes;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.LegendPosition;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFDataSource;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFValueAxis;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFChart;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFDrawing;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -46,8 +47,8 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
|||||||
public class ScatterChart {
|
public class ScatterChart {
|
||||||
|
|
||||||
public static void main(String[] args) throws IOException {
|
public static void main(String[] args) throws IOException {
|
||||||
try (Workbook wb = new XSSFWorkbook()) {
|
try (XSSFWorkbook wb = new XSSFWorkbook()) {
|
||||||
Sheet sheet = wb.createSheet("Sheet 1");
|
XSSFSheet sheet = wb.createSheet("Sheet 1");
|
||||||
final int NUM_OF_ROWS = 3;
|
final int NUM_OF_ROWS = 3;
|
||||||
final int NUM_OF_COLUMNS = 10;
|
final int NUM_OF_COLUMNS = 10;
|
||||||
|
|
||||||
@ -61,29 +62,28 @@ public class ScatterChart {
|
|||||||
cell.setCellValue(colIndex * (rowIndex + 1));
|
cell.setCellValue(colIndex * (rowIndex + 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Drawing<?> drawing = sheet.createDrawingPatriarch();
|
XSSFDrawing drawing = sheet.createDrawingPatriarch();
|
||||||
ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15);
|
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15);
|
||||||
|
|
||||||
Chart chart = drawing.createChart(anchor);
|
XSSFChart chart = drawing.createChart(anchor);
|
||||||
ChartLegend legend = chart.getOrCreateLegend();
|
XDDFChartLegend legend = chart.getOrAddLegend();
|
||||||
legend.setPosition(LegendPosition.TOP_RIGHT);
|
legend.setPosition(LegendPosition.TOP_RIGHT);
|
||||||
|
|
||||||
ScatterChartData data = chart.getChartDataFactory().createScatterChartData();
|
XDDFValueAxis bottomAxis = chart.createValueAxis(AxisPosition.BOTTOM);
|
||||||
|
XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
|
||||||
ValueAxis bottomAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.BOTTOM);
|
|
||||||
ValueAxis leftAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT);
|
|
||||||
leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
|
leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
|
||||||
|
|
||||||
ChartDataSource<Number> xs = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(0, 0, 0, NUM_OF_COLUMNS - 1));
|
XDDFDataSource<Double> xs = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(0, 0, 0, NUM_OF_COLUMNS - 1));
|
||||||
ChartDataSource<Number> ys1 = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, NUM_OF_COLUMNS - 1));
|
XDDFNumericalDataSource<Double> ys1 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, NUM_OF_COLUMNS - 1));
|
||||||
ChartDataSource<Number> ys2 = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, NUM_OF_COLUMNS - 1));
|
XDDFNumericalDataSource<Double> ys2 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, NUM_OF_COLUMNS - 1));
|
||||||
|
|
||||||
|
|
||||||
data.addSerie(xs, ys1);
|
XDDFChartData data = chart.createData(ChartTypes.SCATTER, bottomAxis, leftAxis);
|
||||||
data.addSerie(xs, ys2);
|
|
||||||
|
data.addSeries(xs, ys1);
|
||||||
chart.plot(data, bottomAxis, leftAxis);
|
data.addSeries(xs, ys2);
|
||||||
|
chart.plot(data);
|
||||||
|
|
||||||
// Write the output to a file
|
// Write the output to a file
|
||||||
try (FileOutputStream fileOut = new FileOutputStream("ooxml-scatter-chart.xlsx")) {
|
try (FileOutputStream fileOut = new FileOutputStream("ooxml-scatter-chart.xlsx")) {
|
||||||
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
@ -19,20 +19,23 @@ package org.apache.poi.ss.usermodel;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartData;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartAxis;
|
import org.apache.poi.ss.usermodel.charts.ChartAxis;
|
||||||
|
import org.apache.poi.ss.usermodel.charts.ChartAxisFactory;
|
||||||
|
import org.apache.poi.ss.usermodel.charts.ChartData;
|
||||||
|
import org.apache.poi.ss.usermodel.charts.ChartDataFactory;
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartLegend;
|
import org.apache.poi.ss.usermodel.charts.ChartLegend;
|
||||||
import org.apache.poi.ss.usermodel.charts.ManuallyPositionable;
|
import org.apache.poi.ss.usermodel.charts.ManuallyPositionable;
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartDataFactory;
|
import org.apache.poi.util.Removal;
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartAxisFactory;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* High level representation of a chart.
|
* High level representation of a chart.
|
||||||
*
|
*
|
||||||
* @author Roman Kashitsyn
|
* @deprecated
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public interface Chart extends ManuallyPositionable {
|
public interface Chart extends ManuallyPositionable {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return an appropriate ChartDataFactory implementation
|
* @return an appropriate ChartDataFactory implementation
|
||||||
*/
|
*/
|
||||||
|
@ -39,14 +39,6 @@ public interface Drawing<T extends Shape> extends ShapeContainer<T> {
|
|||||||
*/
|
*/
|
||||||
Comment createCellComment(ClientAnchor anchor);
|
Comment createCellComment(ClientAnchor anchor);
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a chart.
|
|
||||||
* @param anchor the client anchor describes how this chart is attached to
|
|
||||||
* the sheet.
|
|
||||||
* @return the newly created chart
|
|
||||||
*/
|
|
||||||
Chart createChart(ClientAnchor anchor);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new client anchor and sets the top-left and bottom-right
|
* Creates a new client anchor and sets the top-left and bottom-right
|
||||||
* coordinates of the anchor.
|
* coordinates of the anchor.
|
||||||
@ -62,10 +54,10 @@ public interface Drawing<T extends Shape> extends ShapeContainer<T> {
|
|||||||
* @return the newly created client anchor
|
* @return the newly created client anchor
|
||||||
*/
|
*/
|
||||||
ClientAnchor createAnchor(int dx1, int dy1, int dx2, int dy2, int col1, int row1, int col2, int row2);
|
ClientAnchor createAnchor(int dx1, int dy1, int dx2, int dy2, int col1, int row1, int col2, int row2);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a new OLE Package Shape
|
* Adds a new OLE Package Shape
|
||||||
*
|
*
|
||||||
* @param anchor the client anchor describes how this picture is
|
* @param anchor the client anchor describes how this picture is
|
||||||
* attached to the sheet.
|
* attached to the sheet.
|
||||||
* @param storageId the storageId returned by {@link Workbook#addOlePackage(byte[], String, String, String)}
|
* @param storageId the storageId returned by {@link Workbook#addOlePackage(byte[], String, String, String)}
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
|
@ -17,14 +17,15 @@
|
|||||||
|
|
||||||
package org.apache.poi.ss.usermodel.charts;
|
package org.apache.poi.ss.usermodel.charts;
|
||||||
|
|
||||||
import org.apache.poi.util.Beta;
|
import org.apache.poi.util.Removal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* High level representation of chart axis.
|
* High level representation of chart axis.
|
||||||
*
|
*
|
||||||
* @author Roman Kashitsyn
|
* @deprecated use XDDFChartAxis instead
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public interface ChartAxis {
|
public interface ChartAxis {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -153,7 +154,7 @@ public interface ChartAxis {
|
|||||||
* @param tickMark minor tick mark type.
|
* @param tickMark minor tick mark type.
|
||||||
*/
|
*/
|
||||||
void setMinorTickMark(AxisTickMark tickMark);
|
void setMinorTickMark(AxisTickMark tickMark);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Use this to check before retrieving a number format, as calling {@link #getNumberFormat()} may create a default one if none exists.
|
* Use this to check before retrieving a number format, as calling {@link #getNumberFormat()} may create a default one if none exists.
|
||||||
* @return true if a number format element is defined, false if not
|
* @return true if a number format element is defined, false if not
|
||||||
|
@ -17,31 +17,31 @@
|
|||||||
|
|
||||||
package org.apache.poi.ss.usermodel.charts;
|
package org.apache.poi.ss.usermodel.charts;
|
||||||
|
|
||||||
import org.apache.poi.util.Beta;
|
import org.apache.poi.util.Removal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A factory for different chart axis.
|
* A factory for different chart axis.
|
||||||
*
|
*
|
||||||
* @author Roman Kashitsyn
|
* @deprecated
|
||||||
* @author Martin Andersson
|
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public interface ChartAxisFactory {
|
public interface ChartAxisFactory {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param pos
|
* @param pos
|
||||||
* @return new value axis at the end of the list at the specified chart position
|
* @return new value axis at the end of the list at the specified chart position
|
||||||
*/
|
*/
|
||||||
ValueAxis createValueAxis(AxisPosition pos);
|
ValueAxis createValueAxis(AxisPosition pos);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param pos
|
* @param pos
|
||||||
* @return new category axis at the end of the list at the specified chart position
|
* @return new category axis at the end of the list at the specified chart position
|
||||||
*/
|
*/
|
||||||
ChartAxis createCategoryAxis(AxisPosition pos);
|
ChartAxis createCategoryAxis(AxisPosition pos);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param pos
|
* @param pos
|
||||||
* @return new date category axis at the end of the list at the specified chart position
|
* @return new date category axis at the end of the list at the specified chart position
|
||||||
*/
|
*/
|
||||||
ChartAxis createDateAxis(AxisPosition pos);
|
ChartAxis createDateAxis(AxisPosition pos);
|
||||||
|
@ -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 {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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 {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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 {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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 {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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() {
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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 {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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 {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -17,14 +17,15 @@
|
|||||||
|
|
||||||
package org.apache.poi.ss.usermodel.charts;
|
package org.apache.poi.ss.usermodel.charts;
|
||||||
|
|
||||||
import org.apache.poi.util.Beta;
|
import org.apache.poi.util.Removal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* High level representation of chart element manual layout.
|
* High level representation of chart element manual layout.
|
||||||
*
|
*
|
||||||
* @author Roman Kashitsyn
|
* @deprecated use XDDFManualLayout instead
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public interface ManualLayout {
|
public interface ManualLayout {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -117,7 +118,7 @@ public interface ManualLayout {
|
|||||||
public void setHeightMode(LayoutMode mode);
|
public void setHeightMode(LayoutMode mode);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns current height mode of this
|
* Returns current height mode of this
|
||||||
* @return height mode of this manual layout.
|
* @return height mode of this manual layout.
|
||||||
*/
|
*/
|
||||||
public LayoutMode getHeightMode();
|
public LayoutMode getHeightMode();
|
||||||
|
@ -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 {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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
|
||||||
|
@ -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 {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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
|
||||||
|
@ -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 {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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> {
|
||||||
|
}
|
@ -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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -38,6 +38,7 @@ import org.apache.poi.POIXMLException;
|
|||||||
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
|
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
|
||||||
import org.apache.poi.openxml4j.opc.OPCPackage;
|
import org.apache.poi.openxml4j.opc.OPCPackage;
|
||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||||
|
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
||||||
import org.apache.poi.sl.usermodel.MasterSheet;
|
import org.apache.poi.sl.usermodel.MasterSheet;
|
||||||
import org.apache.poi.sl.usermodel.PictureData.PictureType;
|
import org.apache.poi.sl.usermodel.PictureData.PictureType;
|
||||||
import org.apache.poi.sl.usermodel.Resources;
|
import org.apache.poi.sl.usermodel.Resources;
|
||||||
@ -80,6 +81,7 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
private List<XSLFSlide> _slides;
|
private List<XSLFSlide> _slides;
|
||||||
private List<XSLFSlideMaster> _masters;
|
private List<XSLFSlideMaster> _masters;
|
||||||
private List<XSLFPictureData> _pictures;
|
private List<XSLFPictureData> _pictures;
|
||||||
|
private List<XSLFChart> _charts;
|
||||||
private XSLFTableStyles _tableStyles;
|
private XSLFTableStyles _tableStyles;
|
||||||
private XSLFNotesMaster _notesMaster;
|
private XSLFNotesMaster _notesMaster;
|
||||||
private XSLFCommentAuthors _commentAuthors;
|
private XSLFCommentAuthors _commentAuthors;
|
||||||
@ -93,7 +95,7 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
if(getCorePart().getContentType().equals(XSLFRelation.THEME_MANAGER.getContentType())) {
|
if(getCorePart().getContentType().equals(XSLFRelation.THEME_MANAGER.getContentType())) {
|
||||||
rebase(getPackage());
|
rebase(getPackage());
|
||||||
}
|
}
|
||||||
|
|
||||||
//build a tree of POIXMLDocumentParts, this presentation being the root
|
//build a tree of POIXMLDocumentParts, this presentation being the root
|
||||||
@ -130,10 +132,16 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
|
|
||||||
Map<String, XSLFSlideMaster> masterMap = new HashMap<>();
|
Map<String, XSLFSlideMaster> masterMap = new HashMap<>();
|
||||||
Map<String, XSLFSlide> shIdMap = new HashMap<>();
|
Map<String, XSLFSlide> shIdMap = new HashMap<>();
|
||||||
|
Map<String, XSLFChart> chartMap = new HashMap<>();
|
||||||
for (RelationPart rp : getRelationParts()) {
|
for (RelationPart rp : getRelationParts()) {
|
||||||
POIXMLDocumentPart p = rp.getDocumentPart();
|
POIXMLDocumentPart p = rp.getDocumentPart();
|
||||||
if (p instanceof XSLFSlide) {
|
if (p instanceof XSLFSlide) {
|
||||||
shIdMap.put(rp.getRelationship().getId(), (XSLFSlide) p);
|
shIdMap.put(rp.getRelationship().getId(), (XSLFSlide) p);
|
||||||
|
for (POIXMLDocumentPart c : p.getRelations()) {
|
||||||
|
if (c instanceof XSLFChart) {
|
||||||
|
chartMap.put(c.getPackagePart().getPartName().getName(), (XSLFChart) c);
|
||||||
|
}
|
||||||
|
}
|
||||||
} else if (p instanceof XSLFSlideMaster) {
|
} else if (p instanceof XSLFSlideMaster) {
|
||||||
masterMap.put(getRelationId(p), (XSLFSlideMaster) p);
|
masterMap.put(getRelationId(p), (XSLFSlideMaster) p);
|
||||||
} else if (p instanceof XSLFTableStyles){
|
} else if (p instanceof XSLFTableStyles){
|
||||||
@ -145,6 +153,11 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_charts = new ArrayList<>(chartMap.size());
|
||||||
|
for(XSLFChart chart : chartMap.values()) {
|
||||||
|
_charts.add(chart);
|
||||||
|
}
|
||||||
|
|
||||||
_masters = new ArrayList<>(masterMap.size());
|
_masters = new ArrayList<>(masterMap.size());
|
||||||
for (CTSlideMasterIdListEntry masterId : _presentation.getSldMasterIdLst().getSldMasterIdList()) {
|
for (CTSlideMasterIdListEntry masterId : _presentation.getSldMasterIdLst().getSldMasterIdList()) {
|
||||||
XSLFSlideMaster master = masterMap.get(masterId.getId2());
|
XSLFSlideMaster master = masterMap.get(masterId.getId2());
|
||||||
@ -208,6 +221,7 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
public XSLFSlide createSlide(XSLFSlideLayout layout) {
|
public XSLFSlide createSlide(XSLFSlideLayout layout) {
|
||||||
int slideNumber = 256, cnt = 1;
|
int slideNumber = 256, cnt = 1;
|
||||||
CTSlideIdList slideList;
|
CTSlideIdList slideList;
|
||||||
|
XSLFRelation relationType = XSLFRelation.SLIDE;
|
||||||
if (!_presentation.isSetSldIdLst()) {
|
if (!_presentation.isSetSldIdLst()) {
|
||||||
slideList = _presentation.addNewSldIdLst();
|
slideList = _presentation.addNewSldIdLst();
|
||||||
} else {
|
} else {
|
||||||
@ -217,35 +231,11 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
cnt++;
|
cnt++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bug 55791: We also need to check that the resulting file name is not already taken
|
cnt = findNextAvailableFileNameIndex(relationType, cnt);
|
||||||
// this can happen when removing/adding slides
|
|
||||||
while(true) {
|
|
||||||
String slideName = XSLFRelation.SLIDE.getFileName(cnt);
|
|
||||||
boolean found = false;
|
|
||||||
for (POIXMLDocumentPart relation : getRelations()) {
|
|
||||||
if (relation.getPackagePart() != null &&
|
|
||||||
slideName.equals(relation.getPackagePart().getPartName().getName())) {
|
|
||||||
// name is taken => try next one
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!found &&
|
|
||||||
getPackage().getPartsByName(Pattern.compile(Pattern.quote(slideName))).size() > 0) {
|
|
||||||
// name is taken => try next one
|
|
||||||
found = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!found) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
cnt++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RelationPart rp = createRelationship(
|
RelationPart rp = createRelationship
|
||||||
XSLFRelation.SLIDE, XSLFFactory.getInstance(), cnt, false);
|
(relationType, XSLFFactory.getInstance(), cnt, false);
|
||||||
XSLFSlide slide = rp.getDocumentPart();
|
XSLFSlide slide = rp.getDocumentPart();
|
||||||
|
|
||||||
CTSlideIdListEntry slideId = slideList.addNewSldId();
|
CTSlideIdListEntry slideId = slideList.addNewSldId();
|
||||||
@ -260,6 +250,35 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
return slide;
|
return slide;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int findNextAvailableFileNameIndex(XSLFRelation relationType, int idx) {
|
||||||
|
// Bug 55791: We also need to check that the resulting file name is not already taken
|
||||||
|
// this can happen when removing/adding slides, notes or charts
|
||||||
|
while(true) {
|
||||||
|
String fileName = relationType.getFileName(idx);
|
||||||
|
boolean found = false;
|
||||||
|
for (POIXMLDocumentPart relation : getRelations()) {
|
||||||
|
if (relation.getPackagePart() != null &&
|
||||||
|
fileName.equals(relation.getPackagePart().getPartName().getName())) {
|
||||||
|
// name is taken => try next one
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!found &&
|
||||||
|
getPackage().getPartsByName(Pattern.compile(Pattern.quote(fileName))).size() > 0) {
|
||||||
|
// name is taken => try next one
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
return idx;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a blank slide using the default (first) master.
|
* Create a blank slide using the default (first) master.
|
||||||
*/
|
*/
|
||||||
@ -275,10 +294,27 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
}
|
}
|
||||||
layout = sl[0];
|
layout = sl[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
return createSlide(layout);
|
return createSlide(layout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a blank chart on the given slide.
|
||||||
|
*/
|
||||||
|
public XSLFChart createChart(XSLFSlide slide) {
|
||||||
|
int chartIdx = findNextAvailableFileNameIndex(XSLFRelation.CHART, _charts.size() + 1);
|
||||||
|
XSLFChart chart = (XSLFChart) createRelationship(XSLFRelation.CHART, XSLFFactory.getInstance(), chartIdx, true).getDocumentPart();
|
||||||
|
slide.addRelation(null, XSLFRelation.CHART, chart);
|
||||||
|
createWorkbookRelationship(chart, chartIdx);
|
||||||
|
_charts.add(chart);
|
||||||
|
return chart;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected PackageRelationship createWorkbookRelationship(XSLFChart chart, int chartIdx) {
|
||||||
|
POIXMLDocumentPart worksheet = createRelationship(XSLFChart.WORKBOOK_RELATIONSHIP, XSLFFactory.getInstance(), chartIdx, true).getDocumentPart();
|
||||||
|
return chart.addRelation(null, XSLFChart.WORKBOOK_RELATIONSHIP, worksheet).getRelationship();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return notes slide for the specified slide or create new if it does not exist yet.
|
* Return notes slide for the specified slide or create new if it does not exist yet.
|
||||||
*/
|
*/
|
||||||
@ -301,39 +337,16 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
createNotesMaster();
|
createNotesMaster();
|
||||||
}
|
}
|
||||||
|
|
||||||
Integer slideIndex = XSLFRelation.SLIDE.getFileNameIndex(slide);
|
int slideIndex = XSLFRelation.SLIDE.getFileNameIndex(slide);
|
||||||
|
|
||||||
// Bug 55791: We also need to check that the resulting file name is not already taken
|
XSLFRelation relationType = XSLFRelation.NOTES;
|
||||||
// this can happen when removing/adding slides
|
slideIndex = findNextAvailableFileNameIndex(relationType, slideIndex);
|
||||||
while(true) {
|
|
||||||
String slideName = XSLFRelation.NOTES.getFileName(slideIndex);
|
|
||||||
boolean found = false;
|
|
||||||
for (POIXMLDocumentPart relation : getRelations()) {
|
|
||||||
if (relation.getPackagePart() != null &&
|
|
||||||
slideName.equals(relation.getPackagePart().getPartName().getName())) {
|
|
||||||
// name is taken => try next one
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!found &&
|
|
||||||
getPackage().getPartsByName(Pattern.compile(Pattern.quote(slideName))).size() > 0) {
|
|
||||||
// name is taken => try next one
|
|
||||||
found = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!found) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
slideIndex++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// add notes slide to presentation
|
// add notes slide to presentation
|
||||||
XSLFNotes notesSlide = (XSLFNotes) createRelationship
|
XSLFNotes notesSlide = (XSLFNotes) createRelationship
|
||||||
(XSLFRelation.NOTES, XSLFFactory.getInstance(), slideIndex);
|
(relationType, XSLFFactory.getInstance(), slideIndex);
|
||||||
// link slide and notes slide with each other
|
// link slide and notes slide with each other
|
||||||
slide.addRelation(null, XSLFRelation.NOTES, notesSlide);
|
slide.addRelation(null, relationType, notesSlide);
|
||||||
notesSlide.addRelation(null, XSLFRelation.NOTES_MASTER, _notesMaster);
|
notesSlide.addRelation(null, XSLFRelation.NOTES_MASTER, _notesMaster);
|
||||||
notesSlide.addRelation(null, XSLFRelation.SLIDE, slide);
|
notesSlide.addRelation(null, XSLFRelation.SLIDE, slide);
|
||||||
|
|
||||||
@ -404,6 +417,13 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
return _slides;
|
return _slides;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return all the charts in the slideshow
|
||||||
|
*/
|
||||||
|
public List<XSLFChart> getCharts() {
|
||||||
|
return _charts;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the list of comment authors, if there is one.
|
* Returns the list of comment authors, if there is one.
|
||||||
* Will only be present if at least one slide has comments on it.
|
* Will only be present if at least one slide has comments on it.
|
||||||
@ -444,7 +464,17 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
public XSLFSlide removeSlide(int index){
|
public XSLFSlide removeSlide(int index){
|
||||||
XSLFSlide slide = _slides.remove(index);
|
XSLFSlide slide = _slides.remove(index);
|
||||||
removeRelation(slide);
|
removeRelation(slide);
|
||||||
_presentation.getSldIdLst().removeSldId(index);
|
_presentation.getSldIdLst().removeSldId(index);
|
||||||
|
for (POIXMLDocumentPart p : slide.getRelations()) {
|
||||||
|
if (p instanceof XSLFChart) {
|
||||||
|
XSLFChart chart = (XSLFChart) p;
|
||||||
|
slide.removeChartRelation(chart);
|
||||||
|
_charts.remove(chart);
|
||||||
|
} else if (p instanceof XSLFSlideLayout) {
|
||||||
|
XSLFSlideLayout layout = (XSLFSlideLayout) p;
|
||||||
|
slide.removeLayoutRelation(layout);
|
||||||
|
}
|
||||||
|
}
|
||||||
return slide;
|
return slide;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,15 +26,28 @@ import java.io.OutputStream;
|
|||||||
|
|
||||||
import javax.xml.namespace.QName;
|
import javax.xml.namespace.QName;
|
||||||
|
|
||||||
|
import org.apache.poi.POIXMLDocument;
|
||||||
import org.apache.poi.POIXMLDocumentPart;
|
import org.apache.poi.POIXMLDocumentPart;
|
||||||
|
import org.apache.poi.POIXMLException;
|
||||||
|
import org.apache.poi.POIXMLRelation;
|
||||||
|
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
||||||
|
import org.apache.poi.openxml4j.exceptions.NotOfficeXmlFileException;
|
||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||||
|
import org.apache.poi.ss.util.CellRangeAddress;
|
||||||
|
import org.apache.poi.ss.util.CellReference;
|
||||||
import org.apache.poi.util.Beta;
|
import org.apache.poi.util.Beta;
|
||||||
import org.apache.poi.util.Internal;
|
import org.apache.poi.xddf.usermodel.chart.XDDFChart;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFDataSource;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFRow;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
import org.apache.xmlbeans.XmlException;
|
import org.apache.xmlbeans.XmlException;
|
||||||
import org.apache.xmlbeans.XmlOptions;
|
import org.apache.xmlbeans.XmlOptions;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.ChartSpaceDocument;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTTitle;
|
||||||
|
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a Chart in a .pptx presentation
|
* Represents a Chart in a .pptx presentation
|
||||||
@ -42,63 +55,173 @@ import org.openxmlformats.schemas.drawingml.x2006.chart.ChartSpaceDocument;
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Beta
|
||||||
public final class XSLFChart extends POIXMLDocumentPart {
|
public final class XSLFChart extends XDDFChart {
|
||||||
|
protected static final POIXMLRelation WORKBOOK_RELATIONSHIP = new POIXMLRelation(
|
||||||
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||||||
|
POIXMLDocument.PACK_OBJECT_REL_TYPE,
|
||||||
|
"/ppt/embeddings/Microsoft_Excel_Worksheet#.xlsx",
|
||||||
|
XSSFWorkbook.class
|
||||||
|
){};
|
||||||
|
|
||||||
/**
|
|
||||||
* Root element of the Chart part
|
|
||||||
*/
|
|
||||||
private CTChartSpace chartSpace;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Chart within that
|
* Underlying workbook
|
||||||
*/
|
*/
|
||||||
private CTChart chart;
|
private XSSFWorkbook workbook;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a chart from a package part.
|
* Construct a PresentationML chart.
|
||||||
|
*/
|
||||||
|
protected XSLFChart() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a PresentationML chart from a package part.
|
||||||
*
|
*
|
||||||
* @param part the package part holding the chart data,
|
* @param part the package part holding the chart data,
|
||||||
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code>
|
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code>
|
||||||
*
|
*
|
||||||
* @since POI 3.14-Beta1
|
* @since POI 3.14-Beta1
|
||||||
*/
|
*/
|
||||||
protected XSLFChart(PackagePart part) throws IOException, XmlException {
|
protected XSLFChart(PackagePart part) throws IOException, XmlException {
|
||||||
super(part);
|
super(part);
|
||||||
|
|
||||||
chartSpace = ChartSpaceDocument.Factory.parse(part.getInputStream(), DEFAULT_XML_OPTIONS).getChartSpace();
|
|
||||||
chart = chartSpace.getChart();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public XSLFTextShape getTitle() {
|
||||||
* Return the underlying CTChartSpace bean, the root element of the Chart part.
|
if (!chart.isSetTitle()) {
|
||||||
*
|
chart.addNewTitle();
|
||||||
* @return the underlying CTChartSpace bean
|
}
|
||||||
*/
|
final CTTitle title = chart.getTitle();
|
||||||
@Internal
|
if (title.getTx() != null && title.getTx().isSetRich()) {
|
||||||
public CTChartSpace getCTChartSpace(){
|
return new XSLFTextShape(title, null) {
|
||||||
return chartSpace;
|
@Override
|
||||||
}
|
protected CTTextBody getTextBody(boolean create) {
|
||||||
|
return title.getTx().getRich();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return new XSLFTextShape(title, null) {
|
||||||
|
@Override
|
||||||
|
protected CTTextBody getTextBody(boolean create) {
|
||||||
|
return title.getTxPr();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
public CellReference setSheetTitle(String title) {
|
||||||
* Return the underlying CTChart bean, within the Chart Space
|
XSSFSheet sheet = getSheet();
|
||||||
*
|
sheet.createRow(0).createCell(1).setCellValue(title);
|
||||||
* @return the underlying CTChart bean
|
return new CellReference(sheet.getSheetName(), 0, 1, true, true);
|
||||||
*/
|
}
|
||||||
@Internal
|
|
||||||
public CTChart getCTChart(){
|
|
||||||
return chart;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
public String formatRange(CellRangeAddress range) {
|
||||||
protected void commit() throws IOException {
|
return range.formatAsString(getSheet().getSheetName(), true);
|
||||||
XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
|
}
|
||||||
xmlOptions.setSaveSyntheticDocumentElement(new QName(CTChartSpace.type.getName().getNamespaceURI(), "chartSpace", "c"));
|
|
||||||
|
|
||||||
PackagePart part = getPackagePart();
|
private XSSFSheet getSheet() {
|
||||||
OutputStream out = part.getOutputStream();
|
XSSFSheet sheet = null;
|
||||||
chartSpace.save(out, xmlOptions);
|
try {
|
||||||
out.close();
|
sheet = getWorkbook().getSheetAt(0);
|
||||||
}
|
} catch (InvalidFormatException ife) {
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
}
|
||||||
|
return sheet;
|
||||||
|
}
|
||||||
|
|
||||||
|
private PackagePart getWorksheetPart() throws InvalidFormatException {
|
||||||
|
for (RelationPart part : getRelationParts()) {
|
||||||
|
if (WORKBOOK_RELATIONSHIP.getRelation().equals(part.getRelationship().getRelationshipType())) {
|
||||||
|
return getTargetPart(part.getRelationship());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected XSSFWorkbook getWorkbook() throws IOException, InvalidFormatException {
|
||||||
|
if (workbook == null) {
|
||||||
|
try {
|
||||||
|
PackagePart worksheetPart = getWorksheetPart();
|
||||||
|
if (worksheetPart == null) {
|
||||||
|
workbook = new XSSFWorkbook();
|
||||||
|
workbook.createSheet();
|
||||||
|
} else {
|
||||||
|
workbook = new XSSFWorkbook(worksheetPart.getInputStream());
|
||||||
|
}
|
||||||
|
} catch (NotOfficeXmlFileException e) {
|
||||||
|
workbook = new XSSFWorkbook();
|
||||||
|
workbook.createSheet();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return workbook;
|
||||||
|
}
|
||||||
|
|
||||||
|
private XMLSlideShow getSlideShow() {
|
||||||
|
POIXMLDocumentPart p = getParent();
|
||||||
|
while(p != null) {
|
||||||
|
if(p instanceof XMLSlideShow){
|
||||||
|
return (XMLSlideShow)p;
|
||||||
|
}
|
||||||
|
p = p.getParent();
|
||||||
|
}
|
||||||
|
throw new IllegalStateException("SlideShow was not found");
|
||||||
|
}
|
||||||
|
|
||||||
|
private PackagePart createWorksheetPart() throws InvalidFormatException {
|
||||||
|
Integer chartIdx = XSLFRelation.CHART.getFileNameIndex(this);
|
||||||
|
return getTargetPart(getSlideShow().createWorkbookRelationship(this, chartIdx));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void saveWorkbook(XSSFWorkbook workbook) throws IOException, InvalidFormatException {
|
||||||
|
PackagePart worksheetPart = getWorksheetPart();
|
||||||
|
if (worksheetPart == null) {
|
||||||
|
worksheetPart = createWorksheetPart();
|
||||||
|
}
|
||||||
|
try (OutputStream xlsOut = worksheetPart.getOutputStream()) {
|
||||||
|
workbook.write(xlsOut);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fillSheet(XSSFSheet sheet, XDDFDataSource<?> categoryData, XDDFNumericalDataSource<?> valuesData) {
|
||||||
|
int numOfPoints = categoryData.getPointCount();
|
||||||
|
for (int i = 0; i < numOfPoints; i++) {
|
||||||
|
XSSFRow row = sheet.createRow(i + 1); // first row is for title
|
||||||
|
row.createCell(0).setCellValue(categoryData.getPointAt(i).toString());
|
||||||
|
row.createCell(1).setCellValue(valuesData.getPointAt(i).doubleValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void plot(XDDFChartData data) {
|
||||||
|
super.plot(data);
|
||||||
|
XSSFSheet sheet = getSheet();
|
||||||
|
for(XDDFChartData.Series series : data.getSeries()) {
|
||||||
|
fillSheet(sheet, series.getCategoryData(), series.getValuesData());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void importContent(XSLFChart other) {
|
||||||
|
this.chart.set(other.chart);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void commit() throws IOException {
|
||||||
|
XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
|
||||||
|
xmlOptions.setSaveSyntheticDocumentElement(new QName(CTChartSpace.type.getName().getNamespaceURI(), "chartSpace", "c"));
|
||||||
|
|
||||||
|
if (workbook != null) {
|
||||||
|
try {
|
||||||
|
saveWorkbook(workbook);
|
||||||
|
} catch (InvalidFormatException e) {
|
||||||
|
throw new POIXMLException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PackagePart part = getPackagePart();
|
||||||
|
try (OutputStream out = part.getOutputStream()) {
|
||||||
|
chartSpace.save(out, xmlOptions);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
import java.awt.geom.Rectangle2D;
|
import java.awt.geom.Rectangle2D;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
import javax.xml.namespace.QName;
|
import javax.xml.namespace.QName;
|
||||||
|
|
||||||
@ -102,6 +103,7 @@ public class XSLFGraphicFrame extends XSLFShape implements GraphicalFrame<XSLFSh
|
|||||||
*
|
*
|
||||||
* @param theta the rotation angle in degrees.
|
* @param theta the rotation angle in degrees.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void setRotation(double theta){
|
public void setRotation(double theta){
|
||||||
throw new IllegalArgumentException("Operation not supported");
|
throw new IllegalArgumentException("Operation not supported");
|
||||||
}
|
}
|
||||||
@ -115,15 +117,18 @@ public class XSLFGraphicFrame extends XSLFShape implements GraphicalFrame<XSLFSh
|
|||||||
*
|
*
|
||||||
* @return rotation angle in degrees
|
* @return rotation angle in degrees
|
||||||
*/
|
*/
|
||||||
public double getRotation(){
|
@Override
|
||||||
|
public double getRotation(){
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setFlipHorizontal(boolean flip){
|
@Override
|
||||||
|
public void setFlipHorizontal(boolean flip){
|
||||||
throw new IllegalArgumentException("Operation not supported");
|
throw new IllegalArgumentException("Operation not supported");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setFlipVertical(boolean flip){
|
@Override
|
||||||
|
public void setFlipVertical(boolean flip){
|
||||||
throw new IllegalArgumentException("Operation not supported");
|
throw new IllegalArgumentException("Operation not supported");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,11 +137,13 @@ public class XSLFGraphicFrame extends XSLFShape implements GraphicalFrame<XSLFSh
|
|||||||
*
|
*
|
||||||
* @return whether the shape is horizontally flipped
|
* @return whether the shape is horizontally flipped
|
||||||
*/
|
*/
|
||||||
public boolean getFlipHorizontal(){
|
@Override
|
||||||
|
public boolean getFlipHorizontal(){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean getFlipVertical(){
|
@Override
|
||||||
|
public boolean getFlipVertical(){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -148,12 +155,39 @@ public class XSLFGraphicFrame extends XSLFShape implements GraphicalFrame<XSLFSh
|
|||||||
String uri = data.getUri();
|
String uri = data.getUri();
|
||||||
if(uri.equals("http://schemas.openxmlformats.org/drawingml/2006/diagram")){
|
if(uri.equals("http://schemas.openxmlformats.org/drawingml/2006/diagram")){
|
||||||
copyDiagram(data, (XSLFGraphicFrame)sh);
|
copyDiagram(data, (XSLFGraphicFrame)sh);
|
||||||
|
} if(uri.equals("http://schemas.openxmlformats.org/drawingml/2006/chart")){
|
||||||
|
copyChart(data, (XSLFGraphicFrame)sh);
|
||||||
} else {
|
} else {
|
||||||
// TODO support other types of objects
|
// TODO support other types of objects
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void copyChart(CTGraphicalObjectData objData, XSLFGraphicFrame srcShape) {
|
||||||
|
XSLFSlide slide = (XSLFSlide) getSheet();
|
||||||
|
XSLFSheet src = srcShape.getSheet();
|
||||||
|
String xpath = "declare namespace c='http://schemas.openxmlformats.org/drawingml/2006/chart' c:chart";
|
||||||
|
XmlObject[] obj = objData.selectPath(xpath);
|
||||||
|
if (obj != null && obj.length == 1) {
|
||||||
|
XmlCursor c = obj[0].newCursor();
|
||||||
|
try {
|
||||||
|
// duplicate chart with embedded workbook
|
||||||
|
QName idQualifiedName = new QName("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "id");
|
||||||
|
String id = c.getAttributeText(idQualifiedName);
|
||||||
|
XSLFChart srcChart = (XSLFChart) src.getRelationById(id);
|
||||||
|
XSLFChart chartCopy = slide.getSlideShow().createChart(slide);
|
||||||
|
chartCopy.importContent(srcChart);
|
||||||
|
chartCopy.saveWorkbook(srcChart.getWorkbook());
|
||||||
|
c.setAttributeText(idQualifiedName, slide.getRelationId(chartCopy));
|
||||||
|
} catch (InvalidFormatException e) {
|
||||||
|
throw new POIXMLException(e);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new POIXMLException(e);
|
||||||
|
}
|
||||||
|
c.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TODO should be moved to a sub-class
|
// TODO should be moved to a sub-class
|
||||||
private void copyDiagram(CTGraphicalObjectData objData, XSLFGraphicFrame srcShape){
|
private void copyDiagram(CTGraphicalObjectData objData, XSLFGraphicFrame srcShape){
|
||||||
String xpath = "declare namespace dgm='http://schemas.openxmlformats.org/drawingml/2006/diagram' $this//dgm:relIds";
|
String xpath = "declare namespace dgm='http://schemas.openxmlformats.org/drawingml/2006/diagram' $this//dgm:relIds";
|
||||||
@ -216,4 +250,4 @@ public class XSLFGraphicFrame extends XSLFShape implements GraphicalFrame<XSLFSh
|
|||||||
|
|
||||||
return new XSLFPictureShape(gs.getPicArray(0), getSheet());
|
return new XSLFPictureShape(gs.getPicArray(0), getSheet());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -57,7 +57,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.*;
|
|||||||
public abstract class XSLFSheet extends POIXMLDocumentPart
|
public abstract class XSLFSheet extends POIXMLDocumentPart
|
||||||
implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
|
implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
|
||||||
private static POILogger LOG = POILogFactory.getLogger(XSLFSheet.class);
|
private static POILogger LOG = POILogFactory.getLogger(XSLFSheet.class);
|
||||||
|
|
||||||
private XSLFDrawing _drawing;
|
private XSLFDrawing _drawing;
|
||||||
private List<XSLFShape> _shapes;
|
private List<XSLFShape> _shapes;
|
||||||
private CTGroupShape _spTree;
|
private CTGroupShape _spTree;
|
||||||
@ -69,13 +69,13 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
|
|||||||
public XSLFSheet() {
|
public XSLFSheet() {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @since POI 3.14-Beta1
|
* @since POI 3.14-Beta1
|
||||||
*/
|
*/
|
||||||
public XSLFSheet(PackagePart part) {
|
public XSLFSheet(PackagePart part) {
|
||||||
super(part);
|
super(part);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the XMLSlideShow this sheet belongs to
|
* @return the XMLSlideShow this sheet belongs to
|
||||||
@ -155,7 +155,7 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
|
|||||||
initDrawingAndShapes();
|
initDrawingAndShapes();
|
||||||
return _shapes;
|
return _shapes;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper method for initializing drawing and shapes in one go.
|
* Helper method for initializing drawing and shapes in one go.
|
||||||
* If they are initialized separately, there's a risk that shapes
|
* If they are initialized separately, there's a risk that shapes
|
||||||
@ -255,7 +255,7 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
|
|||||||
return sh;
|
return sh;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns an iterator over the shapes in this sheet
|
* Returns an iterator over the shapes in this sheet
|
||||||
*
|
*
|
||||||
@ -272,7 +272,7 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
|
|||||||
"Adding a shape from a different container is not supported -"
|
"Adding a shape from a different container is not supported -"
|
||||||
+ " create it from scratch witht XSLFSheet.create* methods");
|
+ " create it from scratch witht XSLFSheet.create* methods");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes the specified shape from this sheet, if it is present
|
* Removes the specified shape from this sheet, if it is present
|
||||||
* (optional operation). If this sheet does not contain the element,
|
* (optional operation). If this sheet does not contain the element,
|
||||||
@ -356,28 +356,35 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
|
|||||||
* @return modified 'this'
|
* @return modified 'this'
|
||||||
*/
|
*/
|
||||||
public XSLFSheet importContent(XSLFSheet src){
|
public XSLFSheet importContent(XSLFSheet src){
|
||||||
|
_spTree = null;
|
||||||
|
|
||||||
|
// first copy the source xml
|
||||||
|
getSpTree().set(src.getSpTree().copy());
|
||||||
|
|
||||||
|
wipeAndReinitialize(src, 0);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void wipeAndReinitialize(XSLFSheet src, int offset) {
|
||||||
|
// explicitly initialize drawing and shapes from _spTree
|
||||||
_shapes = null;
|
_shapes = null;
|
||||||
_spTree = null;
|
|
||||||
_drawing = null;
|
_drawing = null;
|
||||||
_spTree = null;
|
initDrawingAndShapes();
|
||||||
|
|
||||||
|
// placeholders will be implicitly initialized when requested
|
||||||
_placeholders = null;
|
_placeholders = null;
|
||||||
|
|
||||||
// fix-me: wth would this ever happen to work ...
|
// update each shape according to its own additional copy rules
|
||||||
|
|
||||||
|
|
||||||
// first copy the source xml
|
|
||||||
getSpTree().set(src.getSpTree());
|
|
||||||
|
|
||||||
// recursively update each shape
|
|
||||||
List<XSLFShape> tgtShapes = getShapes();
|
List<XSLFShape> tgtShapes = getShapes();
|
||||||
List<XSLFShape> srcShapes = src.getShapes();
|
List<XSLFShape> srcShapes = src.getShapes();
|
||||||
for(int i = 0; i < tgtShapes.size(); i++){
|
for(int i = 0; i < srcShapes.size(); i++){
|
||||||
XSLFShape s1 = srcShapes.get(i);
|
XSLFShape s1 = srcShapes.get(i);
|
||||||
XSLFShape s2 = tgtShapes.get(i);
|
XSLFShape s2 = tgtShapes.get(offset + i);
|
||||||
|
|
||||||
s2.copy(s1);
|
s2.copy(s1);
|
||||||
}
|
}
|
||||||
return this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -387,39 +394,26 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
|
|||||||
* @return modified <code>this</code>.
|
* @return modified <code>this</code>.
|
||||||
*/
|
*/
|
||||||
public XSLFSheet appendContent(XSLFSheet src){
|
public XSLFSheet appendContent(XSLFSheet src){
|
||||||
CTGroupShape spTree = getSpTree();
|
|
||||||
int numShapes = getShapes().size();
|
int numShapes = getShapes().size();
|
||||||
|
CTGroupShape spTree = getSpTree();
|
||||||
CTGroupShape srcTree = src.getSpTree();
|
CTGroupShape srcTree = src.getSpTree();
|
||||||
|
|
||||||
for(XmlObject ch : srcTree.selectPath("*")){
|
for(XmlObject ch : srcTree.selectPath("*")){
|
||||||
if(ch instanceof CTShape){ // simple shape
|
if(ch instanceof CTShape){ // simple shape
|
||||||
spTree.addNewSp().set(ch);
|
spTree.addNewSp().set(ch.copy());
|
||||||
} else if (ch instanceof CTGroupShape){
|
} else if (ch instanceof CTGroupShape){
|
||||||
spTree.addNewGrpSp().set(ch);
|
spTree.addNewGrpSp().set(ch.copy());
|
||||||
} else if (ch instanceof CTConnector){
|
} else if (ch instanceof CTConnector){
|
||||||
spTree.addNewCxnSp().set(ch);
|
spTree.addNewCxnSp().set(ch.copy());
|
||||||
} else if (ch instanceof CTPicture){
|
} else if (ch instanceof CTPicture){
|
||||||
spTree.addNewPic().set(ch);
|
spTree.addNewPic().set(ch.copy());
|
||||||
} else if (ch instanceof CTGraphicalObjectFrame){
|
} else if (ch instanceof CTGraphicalObjectFrame){
|
||||||
spTree.addNewGraphicFrame().set(ch);
|
spTree.addNewGraphicFrame().set(ch.copy());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_shapes = null;
|
wipeAndReinitialize(src, numShapes);
|
||||||
_spTree = null;
|
|
||||||
_drawing = null;
|
|
||||||
_spTree = null;
|
|
||||||
_placeholders = null;
|
|
||||||
|
|
||||||
// recursively update each shape
|
|
||||||
List<XSLFShape> tgtShapes = getShapes();
|
|
||||||
List<XSLFShape> srcShapes = src.getShapes();
|
|
||||||
for(int i = 0; i < srcShapes.size(); i++){
|
|
||||||
XSLFShape s1 = srcShapes.get(i);
|
|
||||||
XSLFShape s2 = tgtShapes.get(numShapes + i);
|
|
||||||
|
|
||||||
s2.copy(s1);
|
|
||||||
}
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -430,7 +424,7 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
|
|||||||
* method and return the corresponding package part.
|
* method and return the corresponding package part.
|
||||||
*/
|
*/
|
||||||
XSLFTheme getTheme(){
|
XSLFTheme getTheme(){
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected XSLFTextShape getTextShapeByType(Placeholder type){
|
protected XSLFTextShape getTextShapeByType(Placeholder type){
|
||||||
@ -574,7 +568,7 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
|
|||||||
PackagePart pic = pictureData.getPackagePart();
|
PackagePart pic = pictureData.getPackagePart();
|
||||||
|
|
||||||
RelationPart rp = addRelation(blipId, XSLFRelation.IMAGES, new XSLFPictureData(pic));
|
RelationPart rp = addRelation(blipId, XSLFRelation.IMAGES, new XSLFPictureData(pic));
|
||||||
|
|
||||||
return rp.getRelationship().getId();
|
return rp.getRelationship().getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -584,13 +578,13 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
|
|||||||
PackagePart importPart(PackageRelationship srcRel, PackagePart srcPafrt) {
|
PackagePart importPart(PackageRelationship srcRel, PackagePart srcPafrt) {
|
||||||
PackagePart destPP = getPackagePart();
|
PackagePart destPP = getPackagePart();
|
||||||
PackagePartName srcPPName = srcPafrt.getPartName();
|
PackagePartName srcPPName = srcPafrt.getPartName();
|
||||||
|
|
||||||
OPCPackage pkg = destPP.getPackage();
|
OPCPackage pkg = destPP.getPackage();
|
||||||
if(pkg.containPart(srcPPName)){
|
if(pkg.containPart(srcPPName)){
|
||||||
// already exists
|
// already exists
|
||||||
return pkg.getPart(srcPPName);
|
return pkg.getPart(srcPPName);
|
||||||
}
|
}
|
||||||
|
|
||||||
destPP.addRelationship(srcPPName, TargetMode.INTERNAL, srcRel.getRelationshipType());
|
destPP.addRelationship(srcPPName, TargetMode.INTERNAL, srcRel.getRelationshipType());
|
||||||
|
|
||||||
PackagePart part = pkg.createPart(srcPPName, srcPafrt.getContentType());
|
PackagePart part = pkg.createPart(srcPPName, srcPafrt.getContentType());
|
||||||
@ -605,7 +599,7 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
|
|||||||
}
|
}
|
||||||
return part;
|
return part;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper method for sheet and group shapes
|
* Helper method for sheet and group shapes
|
||||||
*
|
*
|
||||||
@ -614,4 +608,4 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
|
|||||||
void removePictureRelation(XSLFPictureShape pictureShape) {
|
void removePictureRelation(XSLFPictureShape pictureShape) {
|
||||||
removeRelation(pictureShape.getBlipId());
|
removeRelation(pictureShape.getBlipId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -49,10 +49,10 @@ import org.xml.sax.SAXException;
|
|||||||
@Beta
|
@Beta
|
||||||
public final class XSLFSlide extends XSLFSheet
|
public final class XSLFSlide extends XSLFSheet
|
||||||
implements Slide<XSLFShape,XSLFTextParagraph> {
|
implements Slide<XSLFShape,XSLFTextParagraph> {
|
||||||
private final CTSlide _slide;
|
private final CTSlide _slide;
|
||||||
private XSLFSlideLayout _layout;
|
private XSLFSlideLayout _layout;
|
||||||
private XSLFComments _comments;
|
private XSLFComments _comments;
|
||||||
private XSLFNotes _notes;
|
private XSLFNotes _notes;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new slide
|
* Create a new slide
|
||||||
@ -67,7 +67,7 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
|
|||||||
*
|
*
|
||||||
* @param part the package part holding the slide data,
|
* @param part the package part holding the slide data,
|
||||||
* the content type must be <code>application/vnd.openxmlformats-officedocument.slide+xml</code>
|
* the content type must be <code>application/vnd.openxmlformats-officedocument.slide+xml</code>
|
||||||
*
|
*
|
||||||
* @since POI 3.14-Beta1
|
* @since POI 3.14-Beta1
|
||||||
*/
|
*/
|
||||||
XSLFSlide(PackagePart part) throws IOException, XmlException {
|
XSLFSlide(PackagePart part) throws IOException, XmlException {
|
||||||
@ -79,11 +79,11 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
|
|||||||
} catch (SAXException e) {
|
} catch (SAXException e) {
|
||||||
throw new IOException(e);
|
throw new IOException(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
SldDocument doc = SldDocument.Factory.parse(_doc, DEFAULT_XML_OPTIONS);
|
SldDocument doc = SldDocument.Factory.parse(_doc, DEFAULT_XML_OPTIONS);
|
||||||
_slide = doc.getSld();
|
_slide = doc.getSld();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static CTSlide prototype(){
|
private static CTSlide prototype(){
|
||||||
CTSlide ctSlide = CTSlide.Factory.newInstance();
|
CTSlide ctSlide = CTSlide.Factory.newInstance();
|
||||||
CTCommonSlideData cSld = ctSlide.addNewCSld();
|
CTCommonSlideData cSld = ctSlide.addNewCSld();
|
||||||
@ -115,13 +115,21 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CTSlide getXmlObject() {
|
public CTSlide getXmlObject() {
|
||||||
return _slide;
|
return _slide;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String getRootElementName(){
|
protected String getRootElementName(){
|
||||||
return "sld";
|
return "sld";
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void removeChartRelation(XSLFChart chart) {
|
||||||
|
removeRelation(chart);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void removeLayoutRelation(XSLFSlideLayout layout) {
|
||||||
|
removeRelation(layout, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -131,9 +139,9 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
|
|||||||
|
|
||||||
public XSLFSlideLayout getSlideLayout(){
|
public XSLFSlideLayout getSlideLayout(){
|
||||||
if(_layout == null){
|
if(_layout == null){
|
||||||
for (POIXMLDocumentPart p : getRelations()) {
|
for (POIXMLDocumentPart p : getRelations()) {
|
||||||
if (p instanceof XSLFSlideLayout){
|
if (p instanceof XSLFSlideLayout){
|
||||||
_layout = (XSLFSlideLayout)p;
|
_layout = (XSLFSlideLayout)p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -148,36 +156,36 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public XSLFComments getComments() {
|
public XSLFComments getComments() {
|
||||||
if(_comments == null) {
|
if(_comments == null) {
|
||||||
for (POIXMLDocumentPart p : getRelations()) {
|
for (POIXMLDocumentPart p : getRelations()) {
|
||||||
if (p instanceof XSLFComments) {
|
if (p instanceof XSLFComments) {
|
||||||
_comments = (XSLFComments)p;
|
_comments = (XSLFComments)p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(_comments == null) {
|
if(_comments == null) {
|
||||||
// This slide lacks comments
|
// This slide lacks comments
|
||||||
// Not all have them, sorry...
|
// Not all have them, sorry...
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return _comments;
|
return _comments;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public XSLFNotes getNotes() {
|
public XSLFNotes getNotes() {
|
||||||
if(_notes == null) {
|
if(_notes == null) {
|
||||||
for (POIXMLDocumentPart p : getRelations()) {
|
for (POIXMLDocumentPart p : getRelations()) {
|
||||||
if (p instanceof XSLFNotes){
|
if (p instanceof XSLFNotes){
|
||||||
_notes = (XSLFNotes)p;
|
_notes = (XSLFNotes)p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(_notes == null) {
|
if(_notes == null) {
|
||||||
// This slide lacks notes
|
// This slide lacks notes
|
||||||
// Not all have them, sorry...
|
// Not all have them, sorry...
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return _notes;
|
return _notes;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -185,10 +193,10 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
|
|||||||
XSLFTextShape txt = getTextShapeByType(Placeholder.TITLE);
|
XSLFTextShape txt = getTextShapeByType(Placeholder.TITLE);
|
||||||
return txt == null ? null : txt.getText();
|
return txt == null ? null : txt.getText();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public XSLFTheme getTheme(){
|
public XSLFTheme getTheme(){
|
||||||
return getSlideLayout().getSlideMaster().getTheme();
|
return getSlideLayout().getSlideMaster().getTheme();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -241,7 +249,7 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
|
|||||||
if (bgOther == null) {
|
if (bgOther == null) {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
CTBackground bgThis = _slide.getCSld().getBg();
|
CTBackground bgThis = _slide.getCSld().getBg();
|
||||||
// remove existing background
|
// remove existing background
|
||||||
if (bgThis != null) {
|
if (bgThis != null) {
|
||||||
@ -251,14 +259,14 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
|
|||||||
}
|
}
|
||||||
_slide.getCSld().unsetBg();
|
_slide.getCSld().unsetBg();
|
||||||
}
|
}
|
||||||
|
|
||||||
bgThis = (CTBackground)_slide.getCSld().addNewBg().set(bgOther);
|
bgThis = (CTBackground)_slide.getCSld().addNewBg().set(bgOther);
|
||||||
|
|
||||||
if(bgOther.isSetBgPr() && bgOther.getBgPr().isSetBlipFill()){
|
if(bgOther.isSetBgPr() && bgOther.getBgPr().isSetBlipFill()){
|
||||||
String idOther = bgOther.getBgPr().getBlipFill().getBlip().getEmbed();
|
String idOther = bgOther.getBgPr().getBlipFill().getBlip().getEmbed();
|
||||||
String idThis = importBlip(idOther, src.getPackagePart());
|
String idThis = importBlip(idOther, src.getPackagePart());
|
||||||
bgThis.getBgPr().getBlipFill().getBlip().setEmbed(idThis);
|
bgThis.getBgPr().getBlipFill().getBlip().setEmbed(idThis);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
@ -294,7 +302,7 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
|
|||||||
assert(notes instanceof XSLFNotes);
|
assert(notes instanceof XSLFNotes);
|
||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getSlideNumber() {
|
public int getSlideNumber() {
|
||||||
int idx = getSlideShow().getSlides().indexOf(this);
|
int idx = getSlideShow().getSlides().indexOf(this);
|
||||||
|
@ -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);
|
||||||
|
@ -26,15 +26,13 @@ import java.util.List;
|
|||||||
|
|
||||||
import javax.xml.namespace.QName;
|
import javax.xml.namespace.QName;
|
||||||
|
|
||||||
import org.apache.poi.POIXMLDocumentPart;
|
|
||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||||
import org.apache.poi.ss.usermodel.Chart;
|
import org.apache.poi.ss.usermodel.Chart;
|
||||||
import org.apache.poi.ss.usermodel.charts.AxisPosition;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartAxis;
|
import org.apache.poi.ss.usermodel.charts.ChartAxis;
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartAxisFactory;
|
import org.apache.poi.ss.usermodel.charts.ChartAxisFactory;
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartData;
|
import org.apache.poi.ss.usermodel.charts.ChartData;
|
||||||
import org.apache.poi.util.Internal;
|
|
||||||
import org.apache.poi.util.Removal;
|
import org.apache.poi.util.Removal;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFChart;
|
||||||
import org.apache.poi.xssf.usermodel.charts.XSSFCategoryAxis;
|
import org.apache.poi.xssf.usermodel.charts.XSSFCategoryAxis;
|
||||||
import org.apache.poi.xssf.usermodel.charts.XSSFChartAxis;
|
import org.apache.poi.xssf.usermodel.charts.XSSFChartAxis;
|
||||||
import org.apache.poi.xssf.usermodel.charts.XSSFChartDataFactory;
|
import org.apache.poi.xssf.usermodel.charts.XSSFChartDataFactory;
|
||||||
@ -46,7 +44,6 @@ import org.apache.xmlbeans.XmlException;
|
|||||||
import org.apache.xmlbeans.XmlObject;
|
import org.apache.xmlbeans.XmlObject;
|
||||||
import org.apache.xmlbeans.XmlOptions;
|
import org.apache.xmlbeans.XmlOptions;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTCatAx;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTCatAx;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTDateAx;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTDateAx;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPageMargins;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPageMargins;
|
||||||
@ -56,7 +53,6 @@ import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrRef;
|
|||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTTitle;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTTitle;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTTx;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTTx;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTValAx;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTValAx;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.ChartSpaceDocument;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun;
|
import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
|
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextField;
|
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextField;
|
||||||
@ -68,139 +64,119 @@ import org.w3c.dom.Text;
|
|||||||
/**
|
/**
|
||||||
* Represents a SpreadsheetML Chart
|
* Represents a SpreadsheetML Chart
|
||||||
*/
|
*/
|
||||||
public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartAxisFactory {
|
public final class XSSFChart extends XDDFChart implements Chart, ChartAxisFactory {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parent graphic frame.
|
* Parent graphic frame.
|
||||||
*/
|
*/
|
||||||
private XSSFGraphicFrame frame;
|
private XSSFGraphicFrame frame;
|
||||||
|
|
||||||
/**
|
@Deprecated
|
||||||
* Root element of the SpreadsheetML Chart part
|
@Removal(version="4.2")
|
||||||
*/
|
List<XSSFChartAxis> axis = new ArrayList<>();
|
||||||
private CTChartSpace chartSpace;
|
|
||||||
/**
|
|
||||||
* The Chart within that
|
|
||||||
*/
|
|
||||||
private CTChart chart;
|
|
||||||
|
|
||||||
List<XSSFChartAxis> axis = new ArrayList<>();
|
/**
|
||||||
|
* Create a new SpreadsheetML chart
|
||||||
|
*/
|
||||||
|
protected XSSFChart() {
|
||||||
|
super();
|
||||||
|
createChart();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new SpreadsheetML chart
|
* Construct a SpreadsheetML chart from a package part.
|
||||||
*/
|
*
|
||||||
protected XSSFChart() {
|
* @param part
|
||||||
super();
|
* the package part holding the chart data, the content type must be
|
||||||
createChart();
|
* <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code>
|
||||||
}
|
*
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
protected XSSFChart(PackagePart part) throws IOException, XmlException {
|
||||||
|
super(part);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a SpreadsheetML chart from a package part.
|
* Construct a new CTChartSpace bean. By default, it's just an empty placeholder for chart objects.
|
||||||
*
|
*/
|
||||||
* @param part the package part holding the chart data,
|
private void createChart() {
|
||||||
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code>
|
CTPlotArea plotArea = getCTPlotArea();
|
||||||
*
|
|
||||||
* @since POI 3.14-Beta1
|
|
||||||
*/
|
|
||||||
protected XSSFChart(PackagePart part) throws IOException, XmlException {
|
|
||||||
super(part);
|
|
||||||
|
|
||||||
chartSpace = ChartSpaceDocument.Factory.parse(part.getInputStream(), DEFAULT_XML_OPTIONS).getChartSpace();
|
plotArea.addNewLayout();
|
||||||
chart = chartSpace.getChart();
|
chart.addNewPlotVisOnly().setVal(true);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Construct a new CTChartSpace bean.
|
|
||||||
* By default, it's just an empty placeholder for chart objects.
|
|
||||||
*/
|
|
||||||
private void createChart() {
|
|
||||||
chartSpace = CTChartSpace.Factory.newInstance();
|
|
||||||
chart = chartSpace.addNewChart();
|
|
||||||
CTPlotArea plotArea = chart.addNewPlotArea();
|
|
||||||
|
|
||||||
plotArea.addNewLayout();
|
CTPrintSettings printSettings = chartSpace.addNewPrintSettings();
|
||||||
chart.addNewPlotVisOnly().setVal(true);
|
printSettings.addNewHeaderFooter();
|
||||||
|
|
||||||
CTPrintSettings printSettings = chartSpace.addNewPrintSettings();
|
CTPageMargins pageMargins = printSettings.addNewPageMargins();
|
||||||
printSettings.addNewHeaderFooter();
|
pageMargins.setB(0.75);
|
||||||
|
pageMargins.setL(0.70);
|
||||||
|
pageMargins.setR(0.70);
|
||||||
|
pageMargins.setT(0.75);
|
||||||
|
pageMargins.setHeader(0.30);
|
||||||
|
pageMargins.setFooter(0.30);
|
||||||
|
printSettings.addNewPageSetup();
|
||||||
|
}
|
||||||
|
|
||||||
CTPageMargins pageMargins = printSettings.addNewPageMargins();
|
@Override
|
||||||
pageMargins.setB(0.75);
|
protected void commit() throws IOException {
|
||||||
pageMargins.setL(0.70);
|
XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
|
||||||
pageMargins.setR(0.70);
|
|
||||||
pageMargins.setT(0.75);
|
|
||||||
pageMargins.setHeader(0.30);
|
|
||||||
pageMargins.setFooter(0.30);
|
|
||||||
printSettings.addNewPageSetup();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* Return the underlying CTChartSpace bean, the root element of the SpreadsheetML Chart part.
|
* Saved chart space must have the following namespaces set: <c:chartSpace
|
||||||
*
|
* xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart"
|
||||||
* @return the underlying CTChartSpace bean
|
* xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r=
|
||||||
*/
|
* "http://schemas.openxmlformats.org/officeDocument/2006/relationships">
|
||||||
@Internal
|
*/
|
||||||
public CTChartSpace getCTChartSpace(){
|
xmlOptions.setSaveSyntheticDocumentElement(new QName(CTChartSpace.type.getName().getNamespaceURI(), "chartSpace", "c"));
|
||||||
return chartSpace;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
PackagePart part = getPackagePart();
|
||||||
* Return the underlying CTChart bean, within the Chart Space
|
try (OutputStream out = part.getOutputStream()) {
|
||||||
*
|
chartSpace.save(out, xmlOptions);
|
||||||
* @return the underlying CTChart bean
|
}
|
||||||
*/
|
}
|
||||||
@Internal
|
|
||||||
public CTChart getCTChart(){
|
|
||||||
return chart;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
protected void commit() throws IOException {
|
* Returns the parent graphic frame.
|
||||||
XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
|
*
|
||||||
|
* @return the graphic frame this chart belongs to
|
||||||
|
*/
|
||||||
|
public XSSFGraphicFrame getGraphicFrame() {
|
||||||
|
return frame;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
Saved chart space must have the following namespaces set:
|
* Sets the parent graphic frame.
|
||||||
<c:chartSpace
|
*/
|
||||||
xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart"
|
protected void setGraphicFrame(XSSFGraphicFrame frame) {
|
||||||
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
|
this.frame = frame;
|
||||||
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
|
}
|
||||||
*/
|
|
||||||
xmlOptions.setSaveSyntheticDocumentElement(new QName(CTChartSpace.type.getName().getNamespaceURI(), "chartSpace", "c"));
|
|
||||||
|
|
||||||
PackagePart part = getPackagePart();
|
|
||||||
OutputStream out = part.getOutputStream();
|
|
||||||
chartSpace.save(out, xmlOptions);
|
|
||||||
out.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the parent graphic frame.
|
|
||||||
* @return the graphic frame this chart belongs to
|
|
||||||
*/
|
|
||||||
public XSSFGraphicFrame getGraphicFrame() {
|
|
||||||
return frame;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the parent graphic frame.
|
|
||||||
*/
|
|
||||||
protected void setGraphicFrame(XSSFGraphicFrame frame) {
|
|
||||||
this.frame = frame;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public XSSFChartDataFactory getChartDataFactory() {
|
public XSSFChartDataFactory getChartDataFactory() {
|
||||||
return XSSFChartDataFactory.getInstance();
|
return XSSFChartDataFactory.getInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public XSSFChart getChartAxisFactory() {
|
public XSSFChart getChartAxisFactory() {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public void plot(ChartData data, ChartAxis... chartAxis) {
|
public void plot(ChartData data, ChartAxis... chartAxis) {
|
||||||
data.fillChart(this, chartAxis);
|
data.fillChart(this, chartAxis);
|
||||||
}
|
}
|
||||||
|
|
||||||
public XSSFValueAxis createValueAxis(AxisPosition pos) {
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
|
public XSSFValueAxis createValueAxis(org.apache.poi.ss.usermodel.charts.AxisPosition pos) {
|
||||||
long id = axis.size() + 1;
|
long id = axis.size() + 1;
|
||||||
XSSFValueAxis valueAxis = new XSSFValueAxis(this, id, pos);
|
XSSFValueAxis valueAxis = new XSSFValueAxis(this, id, pos);
|
||||||
if (axis.size() == 1) {
|
if (axis.size() == 1) {
|
||||||
@ -212,7 +188,10 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
|
|||||||
return valueAxis;
|
return valueAxis;
|
||||||
}
|
}
|
||||||
|
|
||||||
public XSSFCategoryAxis createCategoryAxis(AxisPosition pos) {
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
|
public XSSFCategoryAxis createCategoryAxis(org.apache.poi.ss.usermodel.charts.AxisPosition pos) {
|
||||||
long id = axis.size() + 1;
|
long id = axis.size() + 1;
|
||||||
XSSFCategoryAxis categoryAxis = new XSSFCategoryAxis(this, id, pos);
|
XSSFCategoryAxis categoryAxis = new XSSFCategoryAxis(this, id, pos);
|
||||||
if (axis.size() == 1) {
|
if (axis.size() == 1) {
|
||||||
@ -224,45 +203,41 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
|
|||||||
return categoryAxis;
|
return categoryAxis;
|
||||||
}
|
}
|
||||||
|
|
||||||
public XSSFDateAxis createDateAxis(AxisPosition pos) {
|
@Override
|
||||||
long id = axis.size() + 1;
|
@Deprecated
|
||||||
XSSFDateAxis dateAxis = new XSSFDateAxis(this, id, pos);
|
@Removal(version="4.2")
|
||||||
if (axis.size() == 1) {
|
public XSSFDateAxis createDateAxis(org.apache.poi.ss.usermodel.charts.AxisPosition pos) {
|
||||||
ChartAxis ax = axis.get(0);
|
long id = axis.size() + 1;
|
||||||
ax.crossAxis(dateAxis);
|
XSSFDateAxis dateAxis = new XSSFDateAxis(this, id, pos);
|
||||||
dateAxis.crossAxis(ax);
|
if (axis.size() == 1) {
|
||||||
}
|
ChartAxis ax = axis.get(0);
|
||||||
axis.add(dateAxis);
|
ax.crossAxis(dateAxis);
|
||||||
return dateAxis;
|
dateAxis.crossAxis(ax);
|
||||||
|
}
|
||||||
|
axis.add(dateAxis);
|
||||||
|
return dateAxis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated use {@link getAxes} instead
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public List<? extends XSSFChartAxis> getAxis() {
|
public List<? extends XSSFChartAxis> getAxis() {
|
||||||
if (axis.isEmpty() && hasAxis()) {
|
if (axis.isEmpty() && hasAxis()) {
|
||||||
parseAxis();
|
parseAxis();
|
||||||
}
|
}
|
||||||
return axis;
|
return axis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public XSSFManualLayout getManualLayout() {
|
public XSSFManualLayout getManualLayout() {
|
||||||
return new XSSFManualLayout(this);
|
return new XSSFManualLayout(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if only visible cells will be present on the chart,
|
|
||||||
* false otherwise
|
|
||||||
*/
|
|
||||||
public boolean isPlotOnlyVisibleCells() {
|
|
||||||
return chart.getPlotVisOnly().getVal();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param plotVisOnly a flag specifying if only visible cells should be
|
|
||||||
* present on the chart
|
|
||||||
*/
|
|
||||||
public void setPlotOnlyVisibleCells(boolean plotVisOnly) {
|
|
||||||
chart.getPlotVisOnly().setVal(plotVisOnly);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the title static text, or null if none is set.
|
* Returns the title static text, or null if none is set.
|
||||||
* Note that a title formula may be set instead.
|
* Note that a title formula may be set instead.
|
||||||
@ -274,14 +249,14 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
|
|||||||
public XSSFRichTextString getTitle() {
|
public XSSFRichTextString getTitle() {
|
||||||
return getTitleText();
|
return getTitleText();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the title static text, or null if none is set.
|
* Returns the title static text, or null if none is set.
|
||||||
* Note that a title formula may be set instead.
|
* Note that a title formula may be set instead.
|
||||||
* Empty text result is for backward compatibility, and could mean the title text is empty or there is a formula instead.
|
* Empty text result is for backward compatibility, and could mean the title text is empty or there is a formula instead.
|
||||||
* Check for a formula first, falling back on text for cleaner logic.
|
* Check for a formula first, falling back on text for cleaner logic.
|
||||||
* @return static title text if set,
|
* @return static title text if set,
|
||||||
* null if there is no title,
|
* null if there is no title,
|
||||||
* empty string if the title text is empty or the title uses a formula instead
|
* empty string if the title text is empty or the title uses a formula instead
|
||||||
*/
|
*/
|
||||||
public XSSFRichTextString getTitleText() {
|
public XSSFRichTextString getTitleText() {
|
||||||
@ -295,8 +270,8 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
|
|||||||
StringBuilder text = new StringBuilder(64);
|
StringBuilder text = new StringBuilder(64);
|
||||||
XmlObject[] t = title
|
XmlObject[] t = title
|
||||||
.selectPath("declare namespace a='"+XSSFDrawing.NAMESPACE_A+"' .//a:t");
|
.selectPath("declare namespace a='"+XSSFDrawing.NAMESPACE_A+"' .//a:t");
|
||||||
for (int m = 0; m < t.length; m++) {
|
for (XmlObject element : t) {
|
||||||
NodeList kids = t[m].getDomNode().getChildNodes();
|
NodeList kids = element.getDomNode().getChildNodes();
|
||||||
final int count = kids.getLength();
|
final int count = kids.getLength();
|
||||||
for (int n = 0; n < count; n++) {
|
for (int n = 0; n < count; n++) {
|
||||||
Node kid = kids.item(n);
|
Node kid = kids.item(n);
|
||||||
@ -315,161 +290,169 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
|
|||||||
* @deprecated POI 3.16, use {@link #setTitleText(String)} instead.
|
* @deprecated POI 3.16, use {@link #setTitleText(String)} instead.
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
@Removal(version="4.0")
|
@Removal(version = "4.0")
|
||||||
public void setTitle(String newTitle) {
|
public void setTitle(String newTitle) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the title text as a static string.
|
* Sets the title text as a static string.
|
||||||
* @param newTitle to use
|
*
|
||||||
|
* @param newTitle
|
||||||
|
* to use
|
||||||
*/
|
*/
|
||||||
public void setTitleText(String newTitle) {
|
public void setTitleText(String newTitle) {
|
||||||
CTTitle ctTitle;
|
CTTitle ctTitle;
|
||||||
if (chart.isSetTitle()) {
|
if (chart.isSetTitle()) {
|
||||||
ctTitle = chart.getTitle();
|
ctTitle = chart.getTitle();
|
||||||
} else {
|
} else {
|
||||||
ctTitle = chart.addNewTitle();
|
ctTitle = chart.addNewTitle();
|
||||||
}
|
}
|
||||||
|
|
||||||
CTTx tx;
|
CTTx tx;
|
||||||
if (ctTitle.isSetTx()) {
|
if (ctTitle.isSetTx()) {
|
||||||
tx = ctTitle.getTx();
|
tx = ctTitle.getTx();
|
||||||
} else {
|
} else {
|
||||||
tx = ctTitle.addNewTx();
|
tx = ctTitle.addNewTx();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tx.isSetStrRef()) {
|
if (tx.isSetStrRef()) {
|
||||||
tx.unsetStrRef();
|
tx.unsetStrRef();
|
||||||
}
|
}
|
||||||
|
|
||||||
CTTextBody rich;
|
CTTextBody rich;
|
||||||
if (tx.isSetRich()) {
|
if (tx.isSetRich()) {
|
||||||
rich = tx.getRich();
|
rich = tx.getRich();
|
||||||
} else {
|
} else {
|
||||||
rich = tx.addNewRich();
|
rich = tx.addNewRich();
|
||||||
rich.addNewBodyPr(); // body properties must exist (but can be empty)
|
rich.addNewBodyPr(); // body properties must exist (but can be
|
||||||
}
|
// empty)
|
||||||
|
}
|
||||||
|
|
||||||
CTTextParagraph para;
|
CTTextParagraph para;
|
||||||
if (rich.sizeOfPArray() > 0) {
|
if (rich.sizeOfPArray() > 0) {
|
||||||
para = rich.getPArray(0);
|
para = rich.getPArray(0);
|
||||||
} else {
|
} else {
|
||||||
para = rich.addNewP();
|
para = rich.addNewP();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (para.sizeOfRArray() > 0) {
|
if (para.sizeOfRArray() > 0) {
|
||||||
CTRegularTextRun run = para.getRArray(0);
|
CTRegularTextRun run = para.getRArray(0);
|
||||||
run.setT(newTitle);
|
run.setT(newTitle);
|
||||||
} else if (para.sizeOfFldArray() > 0) {
|
} else if (para.sizeOfFldArray() > 0) {
|
||||||
CTTextField fld = para.getFldArray(0);
|
CTTextField fld = para.getFldArray(0);
|
||||||
fld.setT(newTitle);
|
fld.setT(newTitle);
|
||||||
} else {
|
} else {
|
||||||
CTRegularTextRun run = para.addNewR();
|
CTRegularTextRun run = para.addNewR();
|
||||||
run.setT(newTitle);
|
run.setT(newTitle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the chart title formula expression if there is one
|
|
||||||
* @return formula expression or null
|
|
||||||
*/
|
|
||||||
public String getTitleFormula() {
|
|
||||||
if(! chart.isSetTitle()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
CTTitle title = chart.getTitle();
|
/**
|
||||||
|
* Get the chart title formula expression if there is one
|
||||||
if (! title.isSetTx()) {
|
*
|
||||||
return null;
|
* @return formula expression or null
|
||||||
}
|
*/
|
||||||
|
public String getTitleFormula() {
|
||||||
CTTx tx = title.getTx();
|
if (!chart.isSetTitle()) {
|
||||||
|
return null;
|
||||||
if (! tx.isSetStrRef()) {
|
}
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return tx.getStrRef().getF();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the formula expression to use for the chart title
|
|
||||||
* @param formula
|
|
||||||
*/
|
|
||||||
public void setTitleFormula(String formula) {
|
|
||||||
CTTitle ctTitle;
|
|
||||||
if (chart.isSetTitle()) {
|
|
||||||
ctTitle = chart.getTitle();
|
|
||||||
} else {
|
|
||||||
ctTitle = chart.addNewTitle();
|
|
||||||
}
|
|
||||||
|
|
||||||
CTTx tx;
|
CTTitle title = chart.getTitle();
|
||||||
if (ctTitle.isSetTx()) {
|
|
||||||
tx = ctTitle.getTx();
|
|
||||||
} else {
|
|
||||||
tx = ctTitle.addNewTx();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tx.isSetRich()) {
|
if (!title.isSetTx()) {
|
||||||
tx.unsetRich();
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
CTStrRef strRef;
|
|
||||||
if (tx.isSetStrRef()) {
|
|
||||||
strRef = tx.getStrRef();
|
|
||||||
} else {
|
|
||||||
strRef = tx.addNewStrRef();
|
|
||||||
}
|
|
||||||
|
|
||||||
strRef.setF(formula);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
CTTx tx = title.getTx();
|
||||||
|
|
||||||
|
if (!tx.isSetStrRef()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return tx.getStrRef().getF();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the formula expression to use for the chart title
|
||||||
|
*
|
||||||
|
* @param formula
|
||||||
|
*/
|
||||||
|
public void setTitleFormula(String formula) {
|
||||||
|
CTTitle ctTitle;
|
||||||
|
if (chart.isSetTitle()) {
|
||||||
|
ctTitle = chart.getTitle();
|
||||||
|
} else {
|
||||||
|
ctTitle = chart.addNewTitle();
|
||||||
|
}
|
||||||
|
|
||||||
|
CTTx tx;
|
||||||
|
if (ctTitle.isSetTx()) {
|
||||||
|
tx = ctTitle.getTx();
|
||||||
|
} else {
|
||||||
|
tx = ctTitle.addNewTx();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tx.isSetRich()) {
|
||||||
|
tx.unsetRich();
|
||||||
|
}
|
||||||
|
|
||||||
|
CTStrRef strRef;
|
||||||
|
if (tx.isSetStrRef()) {
|
||||||
|
strRef = tx.getStrRef();
|
||||||
|
} else {
|
||||||
|
strRef = tx.addNewStrRef();
|
||||||
|
}
|
||||||
|
|
||||||
|
strRef.setF(formula);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public XSSFChartLegend getOrCreateLegend() {
|
public XSSFChartLegend getOrCreateLegend() {
|
||||||
return new XSSFChartLegend(this);
|
return new XSSFChartLegend(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void deleteLegend() {
|
@Deprecated
|
||||||
if (chart.isSetLegend()) {
|
@Removal(version="4.2")
|
||||||
chart.unsetLegend();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean hasAxis() {
|
private boolean hasAxis() {
|
||||||
CTPlotArea ctPlotArea = chart.getPlotArea();
|
CTPlotArea ctPlotArea = chart.getPlotArea();
|
||||||
int totalAxisCount =
|
int totalAxisCount = ctPlotArea.sizeOfValAxArray() + ctPlotArea.sizeOfCatAxArray() + ctPlotArea.sizeOfDateAxArray() + ctPlotArea.sizeOfSerAxArray();
|
||||||
ctPlotArea.sizeOfValAxArray() +
|
return totalAxisCount > 0;
|
||||||
ctPlotArea.sizeOfCatAxArray() +
|
|
||||||
ctPlotArea.sizeOfDateAxArray() +
|
|
||||||
ctPlotArea.sizeOfSerAxArray();
|
|
||||||
return totalAxisCount > 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void parseAxis() {
|
@Deprecated
|
||||||
// TODO: add other axis types
|
@Removal(version="4.2")
|
||||||
parseCategoryAxis();
|
private void parseAxis() {
|
||||||
parseDateAxis();
|
// TODO: add other axis types
|
||||||
parseValueAxis();
|
parseCategoryAxis();
|
||||||
}
|
parseDateAxis();
|
||||||
|
parseValueAxis();
|
||||||
|
}
|
||||||
|
|
||||||
private void parseCategoryAxis() {
|
@Deprecated
|
||||||
for (CTCatAx catAx : chart.getPlotArea().getCatAxArray()) {
|
@Removal(version="4.2")
|
||||||
axis.add(new XSSFCategoryAxis(this, catAx));
|
private void parseCategoryAxis() {
|
||||||
}
|
for (CTCatAx catAx : chart.getPlotArea().getCatAxArray()) {
|
||||||
}
|
axis.add(new XSSFCategoryAxis(this, catAx));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void parseDateAxis() {
|
@Deprecated
|
||||||
for (CTDateAx dateAx : chart.getPlotArea().getDateAxArray()) {
|
@Removal(version="4.2")
|
||||||
axis.add(new XSSFDateAxis(this, dateAx));
|
private void parseDateAxis() {
|
||||||
}
|
for (CTDateAx dateAx : chart.getPlotArea().getDateAxArray()) {
|
||||||
}
|
axis.add(new XSSFDateAxis(this, dateAx));
|
||||||
|
}
|
||||||
private void parseValueAxis() {
|
}
|
||||||
for (CTValAx valAx : chart.getPlotArea().getValAxArray()) {
|
|
||||||
axis.add(new XSSFValueAxis(this, valAx));
|
@Deprecated
|
||||||
}
|
@Removal(version="4.2")
|
||||||
}
|
private void parseValueAxis() {
|
||||||
|
for (CTValAx valAx : chart.getPlotArea().getValAxArray()) {
|
||||||
|
axis.add(new XSSFValueAxis(this, valAx));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -239,7 +239,12 @@ public final class XSSFDrawing extends POIXMLDocumentPart implements Drawing<XSS
|
|||||||
return chart;
|
return chart;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
|
* Creates a chart.
|
||||||
|
* @param anchor the client anchor describes how this chart is attached to
|
||||||
|
* the sheet.
|
||||||
|
* @return the newly created chart
|
||||||
|
*/
|
||||||
public XSSFChart createChart(ClientAnchor anchor) {
|
public XSSFChart createChart(ClientAnchor anchor) {
|
||||||
return createChart((XSSFClientAnchor)anchor);
|
return createChart((XSSFClientAnchor)anchor);
|
||||||
}
|
}
|
||||||
@ -389,7 +394,7 @@ public final class XSSFDrawing extends POIXMLDocumentPart implements Drawing<XSS
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* The shape id of the ole object seems to be a legacy shape id.
|
* The shape id of the ole object seems to be a legacy shape id.
|
||||||
*
|
*
|
||||||
* see 5.3.2.1 legacyDrawing (Legacy Drawing Object):
|
* see 5.3.2.1 legacyDrawing (Legacy Drawing Object):
|
||||||
* Legacy Shape ID that is unique throughout the entire document.
|
* Legacy Shape ID that is unique throughout the entire document.
|
||||||
* Legacy shape IDs should be assigned based on which portion of the document the
|
* Legacy shape IDs should be assigned based on which portion of the document the
|
||||||
@ -439,7 +444,7 @@ public final class XSSFDrawing extends POIXMLDocumentPart implements Drawing<XSS
|
|||||||
cur1.insertAttributeWithValue("moveWithCells", "1");
|
cur1.insertAttributeWithValue("moveWithCells", "1");
|
||||||
|
|
||||||
CTTwoCellAnchor ctAnchor = createTwoCellAnchor((XSSFClientAnchor)anchor);
|
CTTwoCellAnchor ctAnchor = createTwoCellAnchor((XSSFClientAnchor)anchor);
|
||||||
|
|
||||||
XmlCursor cur2 = ctAnchor.newCursor();
|
XmlCursor cur2 = ctAnchor.newCursor();
|
||||||
cur2.copyXmlContents(cur1);
|
cur2.copyXmlContents(cur1);
|
||||||
cur2.dispose();
|
cur2.dispose();
|
||||||
@ -456,12 +461,12 @@ public final class XSSFDrawing extends POIXMLDocumentPart implements Drawing<XSS
|
|||||||
CTShape ctShape = ctAnchor.addNewSp();
|
CTShape ctShape = ctAnchor.addNewSp();
|
||||||
ctShape.set(XSSFObjectData.prototype());
|
ctShape.set(XSSFObjectData.prototype());
|
||||||
ctShape.getSpPr().setXfrm(createXfrm((XSSFClientAnchor)anchor));
|
ctShape.getSpPr().setXfrm(createXfrm((XSSFClientAnchor)anchor));
|
||||||
|
|
||||||
// workaround for not having the vmlDrawing filled
|
// workaround for not having the vmlDrawing filled
|
||||||
CTBlipFillProperties blipFill = ctShape.getSpPr().addNewBlipFill();
|
CTBlipFillProperties blipFill = ctShape.getSpPr().addNewBlipFill();
|
||||||
blipFill.addNewBlip().setEmbed(imgDrawPR.getId());
|
blipFill.addNewBlip().setEmbed(imgDrawPR.getId());
|
||||||
blipFill.addNewStretch().addNewFillRect();
|
blipFill.addNewStretch().addNewFillRect();
|
||||||
|
|
||||||
CTNonVisualDrawingProps cNvPr = ctShape.getNvSpPr().getCNvPr();
|
CTNonVisualDrawingProps cNvPr = ctShape.getNvSpPr().getCNvPr();
|
||||||
cNvPr.setId(shapeId);
|
cNvPr.setId(shapeId);
|
||||||
cNvPr.setName("Object "+shapeId);
|
cNvPr.setName("Object "+shapeId);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -22,8 +22,9 @@ import org.apache.poi.ss.usermodel.charts.AxisOrientation;
|
|||||||
import org.apache.poi.ss.usermodel.charts.AxisPosition;
|
import org.apache.poi.ss.usermodel.charts.AxisPosition;
|
||||||
import org.apache.poi.ss.usermodel.charts.AxisTickMark;
|
import org.apache.poi.ss.usermodel.charts.AxisTickMark;
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartAxis;
|
import org.apache.poi.ss.usermodel.charts.ChartAxis;
|
||||||
import org.apache.poi.util.Beta;
|
|
||||||
import org.apache.poi.util.Internal;
|
import org.apache.poi.util.Internal;
|
||||||
|
import org.apache.poi.util.Removal;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFCategoryAxis;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFChart;
|
import org.apache.poi.xssf.usermodel.XSSFChart;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
|
||||||
@ -39,9 +40,10 @@ import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
|
|||||||
/**
|
/**
|
||||||
* Category axis type.
|
* Category axis type.
|
||||||
*
|
*
|
||||||
* @author Martin Andersson
|
* @deprecated use {@link XDDFCategoryAxis} instead
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public class XSSFCategoryAxis extends XSSFChartAxis {
|
public class XSSFCategoryAxis extends XSSFChartAxis {
|
||||||
|
|
||||||
private CTCatAx ctCatAx;
|
private CTCatAx ctCatAx;
|
||||||
@ -66,7 +68,7 @@ public class XSSFCategoryAxis extends XSSFChartAxis {
|
|||||||
public CTShapeProperties getLine() {
|
public CTShapeProperties getLine() {
|
||||||
return ctCatAx.getSpPr();
|
return ctCatAx.getSpPr();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected CTAxPos getCTAxPos() {
|
protected CTAxPos getCTAxPos() {
|
||||||
return ctCatAx.getAxPos();
|
return ctCatAx.getAxPos();
|
||||||
@ -110,7 +112,7 @@ public class XSSFCategoryAxis extends XSSFChartAxis {
|
|||||||
public CTChartLines getMajorGridLines() {
|
public CTChartLines getMajorGridLines() {
|
||||||
return ctCatAx.getMajorGridlines();
|
return ctCatAx.getMajorGridlines();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void crossAxis(ChartAxis axis) {
|
public void crossAxis(ChartAxis axis) {
|
||||||
ctCatAx.getCrossAx().setVal(axis.getId());
|
ctCatAx.getCrossAx().setVal(axis.getId());
|
||||||
|
@ -22,8 +22,9 @@ import org.apache.poi.ss.usermodel.charts.AxisOrientation;
|
|||||||
import org.apache.poi.ss.usermodel.charts.AxisPosition;
|
import org.apache.poi.ss.usermodel.charts.AxisPosition;
|
||||||
import org.apache.poi.ss.usermodel.charts.AxisTickMark;
|
import org.apache.poi.ss.usermodel.charts.AxisTickMark;
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartAxis;
|
import org.apache.poi.ss.usermodel.charts.ChartAxis;
|
||||||
import org.apache.poi.util.Beta;
|
|
||||||
import org.apache.poi.util.Internal;
|
import org.apache.poi.util.Internal;
|
||||||
|
import org.apache.poi.util.Removal;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFChartAxis;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFChart;
|
import org.apache.poi.xssf.usermodel.XSSFChart;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
|
||||||
@ -43,9 +44,10 @@ import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
|
|||||||
/**
|
/**
|
||||||
* Base class for all axis types.
|
* Base class for all axis types.
|
||||||
*
|
*
|
||||||
* @author Roman Kashitsyn
|
* @deprecated use {@link XDDFChartAxis} instead
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public abstract class XSSFChartAxis implements ChartAxis {
|
public abstract class XSSFChartAxis implements ChartAxis {
|
||||||
|
|
||||||
protected XSSFChart chart;
|
protected XSSFChart chart;
|
||||||
@ -221,7 +223,7 @@ public abstract class XSSFChartAxis implements ChartAxis {
|
|||||||
protected abstract CTTickMark getMinorCTTickMark();
|
protected abstract CTTickMark getMinorCTTickMark();
|
||||||
@Internal public abstract CTChartLines getMajorGridLines();
|
@Internal public abstract CTChartLines getMajorGridLines();
|
||||||
@Internal public abstract CTShapeProperties getLine();
|
@Internal public abstract CTShapeProperties getLine();
|
||||||
|
|
||||||
private static STOrientation.Enum fromAxisOrientation(AxisOrientation orientation) {
|
private static STOrientation.Enum fromAxisOrientation(AxisOrientation orientation) {
|
||||||
switch (orientation) {
|
switch (orientation) {
|
||||||
case MIN_MAX: return STOrientation.MIN_MAX;
|
case MIN_MAX: return STOrientation.MIN_MAX;
|
||||||
|
@ -17,13 +17,14 @@
|
|||||||
|
|
||||||
package org.apache.poi.xssf.usermodel.charts;
|
package org.apache.poi.xssf.usermodel.charts;
|
||||||
|
|
||||||
import org.apache.poi.ss.usermodel.charts.*;
|
import org.apache.poi.ss.usermodel.charts.ChartDataFactory;
|
||||||
import org.apache.poi.util.Beta;
|
import org.apache.poi.util.Removal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Roman Kashitsyn
|
* @deprecated
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public class XSSFChartDataFactory implements ChartDataFactory {
|
public class XSSFChartDataFactory implements ChartDataFactory {
|
||||||
|
|
||||||
private static XSSFChartDataFactory instance;
|
private static XSSFChartDataFactory instance;
|
||||||
@ -35,14 +36,16 @@ public class XSSFChartDataFactory implements ChartDataFactory {
|
|||||||
/**
|
/**
|
||||||
* @return new scatter charts data instance
|
* @return new scatter charts data instance
|
||||||
*/
|
*/
|
||||||
public XSSFScatterChartData createScatterChartData() {
|
@Override
|
||||||
|
public XSSFScatterChartData createScatterChartData() {
|
||||||
return new XSSFScatterChartData();
|
return new XSSFScatterChartData();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return new line charts data instance
|
* @return new line charts data instance
|
||||||
*/
|
*/
|
||||||
public XSSFLineChartData createLineChartData() {
|
@Override
|
||||||
|
public XSSFLineChartData createLineChartData() {
|
||||||
return new XSSFLineChartData();
|
return new XSSFLineChartData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,10 +17,11 @@
|
|||||||
|
|
||||||
package org.apache.poi.xssf.usermodel.charts;
|
package org.apache.poi.xssf.usermodel.charts;
|
||||||
|
|
||||||
import org.apache.poi.util.Beta;
|
|
||||||
import org.apache.poi.util.Internal;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartLegend;
|
import org.apache.poi.ss.usermodel.charts.ChartLegend;
|
||||||
import org.apache.poi.ss.usermodel.charts.LegendPosition;
|
import org.apache.poi.ss.usermodel.charts.LegendPosition;
|
||||||
|
import org.apache.poi.util.Internal;
|
||||||
|
import org.apache.poi.util.Removal;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFChart;
|
import org.apache.poi.xssf.usermodel.XSSFChart;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLegend;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLegend;
|
||||||
@ -29,10 +30,10 @@ import org.openxmlformats.schemas.drawingml.x2006.chart.STLegendPos;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a SpreadsheetML chart legend
|
* Represents a SpreadsheetML chart legend
|
||||||
* @author Roman Kashitsyn
|
* @deprecated use {@link XDDFChartLegend} instead
|
||||||
* @author Martin Andersson
|
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public final class XSSFChartLegend implements ChartLegend {
|
public final class XSSFChartLegend implements ChartLegend {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -72,7 +73,8 @@ public final class XSSFChartLegend implements ChartLegend {
|
|||||||
return legend;
|
return legend;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPosition(LegendPosition position) {
|
@Override
|
||||||
|
public void setPosition(LegendPosition position) {
|
||||||
if (!legend.isSetLegendPos()) {
|
if (!legend.isSetLegendPos()) {
|
||||||
legend.addNewLegendPos();
|
legend.addNewLegendPos();
|
||||||
}
|
}
|
||||||
@ -82,7 +84,8 @@ public final class XSSFChartLegend implements ChartLegend {
|
|||||||
/*
|
/*
|
||||||
* According to ECMA-376 default position is RIGHT.
|
* According to ECMA-376 default position is RIGHT.
|
||||||
*/
|
*/
|
||||||
public LegendPosition getPosition() {
|
@Override
|
||||||
|
public LegendPosition getPosition() {
|
||||||
if (legend.isSetLegendPos()) {
|
if (legend.isSetLegendPos()) {
|
||||||
return toLegendPosition(legend.getLegendPos());
|
return toLegendPosition(legend.getLegendPos());
|
||||||
} else {
|
} else {
|
||||||
@ -90,18 +93,21 @@ public final class XSSFChartLegend implements ChartLegend {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public XSSFManualLayout getManualLayout() {
|
@Override
|
||||||
|
public XSSFManualLayout getManualLayout() {
|
||||||
if (!legend.isSetLayout()) {
|
if (!legend.isSetLayout()) {
|
||||||
legend.addNewLayout();
|
legend.addNewLayout();
|
||||||
}
|
}
|
||||||
return new XSSFManualLayout(legend.getLayout());
|
return new XSSFManualLayout(legend.getLayout());
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isOverlay() {
|
@Override
|
||||||
|
public boolean isOverlay() {
|
||||||
return legend.getOverlay().getVal();
|
return legend.getOverlay().getVal();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setOverlay(boolean value) {
|
@Override
|
||||||
|
public void setOverlay(boolean value) {
|
||||||
legend.getOverlay().setVal(value);
|
legend.getOverlay().setVal(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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() {}
|
||||||
|
@ -22,8 +22,9 @@ import org.apache.poi.ss.usermodel.charts.AxisOrientation;
|
|||||||
import org.apache.poi.ss.usermodel.charts.AxisPosition;
|
import org.apache.poi.ss.usermodel.charts.AxisPosition;
|
||||||
import org.apache.poi.ss.usermodel.charts.AxisTickMark;
|
import org.apache.poi.ss.usermodel.charts.AxisTickMark;
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartAxis;
|
import org.apache.poi.ss.usermodel.charts.ChartAxis;
|
||||||
import org.apache.poi.util.Beta;
|
|
||||||
import org.apache.poi.util.Internal;
|
import org.apache.poi.util.Internal;
|
||||||
|
import org.apache.poi.util.Removal;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFDateAxis;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFChart;
|
import org.apache.poi.xssf.usermodel.XSSFChart;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
|
||||||
@ -38,8 +39,11 @@ import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Date axis type. Currently only implements the same values as {@link XSSFCategoryAxis}, since the two are nearly identical.
|
* Date axis type. Currently only implements the same values as {@link XSSFCategoryAxis}, since the two are nearly identical.
|
||||||
|
*
|
||||||
|
* @deprecated use {@link XDDFDateAxis} instead
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public class XSSFDateAxis extends XSSFChartAxis {
|
public class XSSFDateAxis extends XSSFChartAxis {
|
||||||
|
|
||||||
private CTDateAx ctDateAx;
|
private CTDateAx ctDateAx;
|
||||||
@ -108,7 +112,7 @@ public class XSSFDateAxis extends XSSFChartAxis {
|
|||||||
public CTChartLines getMajorGridLines() {
|
public CTChartLines getMajorGridLines() {
|
||||||
return ctDateAx.getMajorGridlines();
|
return ctDateAx.getMajorGridlines();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void crossAxis(ChartAxis axis) {
|
public void crossAxis(ChartAxis axis) {
|
||||||
ctDateAx.getCrossAx().setVal(axis.getId());
|
ctDateAx.getCrossAx().setVal(axis.getId());
|
||||||
|
@ -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");
|
||||||
|
@ -17,25 +17,27 @@
|
|||||||
|
|
||||||
package org.apache.poi.xssf.usermodel.charts;
|
package org.apache.poi.xssf.usermodel.charts;
|
||||||
|
|
||||||
import org.apache.poi.util.Beta;
|
|
||||||
import org.apache.poi.util.Internal;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.ManualLayout;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.LayoutMode;
|
import org.apache.poi.ss.usermodel.charts.LayoutMode;
|
||||||
import org.apache.poi.ss.usermodel.charts.LayoutTarget;
|
import org.apache.poi.ss.usermodel.charts.LayoutTarget;
|
||||||
|
import org.apache.poi.ss.usermodel.charts.ManualLayout;
|
||||||
|
import org.apache.poi.util.Internal;
|
||||||
|
import org.apache.poi.util.Removal;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFManualLayout;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFChart;
|
import org.apache.poi.xssf.usermodel.XSSFChart;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.STLayoutTarget;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLayout;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLayout;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTManualLayout;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLayoutMode;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLayoutMode;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLayoutTarget;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLayoutTarget;
|
||||||
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTManualLayout;
|
||||||
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.STLayoutMode;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.STLayoutMode;
|
||||||
|
import org.openxmlformats.schemas.drawingml.x2006.chart.STLayoutTarget;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a SpreadsheetML manual layout.
|
* Represents a SpreadsheetML manual layout.
|
||||||
* @author Roman Kashitsyn
|
* @deprecated use {@link XDDFManualLayout instead}
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public final class XSSFManualLayout implements ManualLayout {
|
public final class XSSFManualLayout implements ManualLayout {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -75,126 +77,144 @@ public final class XSSFManualLayout implements ManualLayout {
|
|||||||
return layout;
|
return layout;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setWidthRatio(double ratio) {
|
@Override
|
||||||
|
public void setWidthRatio(double ratio) {
|
||||||
if (!layout.isSetW()) {
|
if (!layout.isSetW()) {
|
||||||
layout.addNewW();
|
layout.addNewW();
|
||||||
}
|
}
|
||||||
layout.getW().setVal(ratio);
|
layout.getW().setVal(ratio);
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getWidthRatio() {
|
@Override
|
||||||
|
public double getWidthRatio() {
|
||||||
if (!layout.isSetW()) {
|
if (!layout.isSetW()) {
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
return layout.getW().getVal();
|
return layout.getW().getVal();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setHeightRatio(double ratio) {
|
@Override
|
||||||
|
public void setHeightRatio(double ratio) {
|
||||||
if (!layout.isSetH()) {
|
if (!layout.isSetH()) {
|
||||||
layout.addNewH();
|
layout.addNewH();
|
||||||
}
|
}
|
||||||
layout.getH().setVal(ratio);
|
layout.getH().setVal(ratio);
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getHeightRatio() {
|
@Override
|
||||||
|
public double getHeightRatio() {
|
||||||
if (!layout.isSetH()) {
|
if (!layout.isSetH()) {
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
return layout.getH().getVal();
|
return layout.getH().getVal();
|
||||||
}
|
}
|
||||||
|
|
||||||
public LayoutTarget getTarget() {
|
@Override
|
||||||
|
public LayoutTarget getTarget() {
|
||||||
if (!layout.isSetLayoutTarget()) {
|
if (!layout.isSetLayoutTarget()) {
|
||||||
return defaultLayoutTarget;
|
return defaultLayoutTarget;
|
||||||
}
|
}
|
||||||
return toLayoutTarget(layout.getLayoutTarget());
|
return toLayoutTarget(layout.getLayoutTarget());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTarget(LayoutTarget target) {
|
@Override
|
||||||
|
public void setTarget(LayoutTarget target) {
|
||||||
if (!layout.isSetLayoutTarget()) {
|
if (!layout.isSetLayoutTarget()) {
|
||||||
layout.addNewLayoutTarget();
|
layout.addNewLayoutTarget();
|
||||||
}
|
}
|
||||||
layout.getLayoutTarget().setVal(fromLayoutTarget(target));
|
layout.getLayoutTarget().setVal(fromLayoutTarget(target));
|
||||||
}
|
}
|
||||||
|
|
||||||
public LayoutMode getXMode() {
|
@Override
|
||||||
|
public LayoutMode getXMode() {
|
||||||
if (!layout.isSetXMode()) {
|
if (!layout.isSetXMode()) {
|
||||||
return defaultLayoutMode;
|
return defaultLayoutMode;
|
||||||
}
|
}
|
||||||
return toLayoutMode(layout.getXMode());
|
return toLayoutMode(layout.getXMode());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setXMode(LayoutMode mode) {
|
@Override
|
||||||
|
public void setXMode(LayoutMode mode) {
|
||||||
if (!layout.isSetXMode()) {
|
if (!layout.isSetXMode()) {
|
||||||
layout.addNewXMode();
|
layout.addNewXMode();
|
||||||
}
|
}
|
||||||
layout.getXMode().setVal(fromLayoutMode(mode));
|
layout.getXMode().setVal(fromLayoutMode(mode));
|
||||||
}
|
}
|
||||||
|
|
||||||
public LayoutMode getYMode() {
|
@Override
|
||||||
|
public LayoutMode getYMode() {
|
||||||
if (!layout.isSetYMode()) {
|
if (!layout.isSetYMode()) {
|
||||||
return defaultLayoutMode;
|
return defaultLayoutMode;
|
||||||
}
|
}
|
||||||
return toLayoutMode(layout.getYMode());
|
return toLayoutMode(layout.getYMode());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setYMode(LayoutMode mode) {
|
@Override
|
||||||
|
public void setYMode(LayoutMode mode) {
|
||||||
if (!layout.isSetYMode()) {
|
if (!layout.isSetYMode()) {
|
||||||
layout.addNewYMode();
|
layout.addNewYMode();
|
||||||
}
|
}
|
||||||
layout.getYMode().setVal(fromLayoutMode(mode));
|
layout.getYMode().setVal(fromLayoutMode(mode));
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getX() {
|
@Override
|
||||||
|
public double getX() {
|
||||||
if (!layout.isSetX()) {
|
if (!layout.isSetX()) {
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
return layout.getX().getVal();
|
return layout.getX().getVal();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setX(double x) {
|
@Override
|
||||||
|
public void setX(double x) {
|
||||||
if (!layout.isSetX()) {
|
if (!layout.isSetX()) {
|
||||||
layout.addNewX();
|
layout.addNewX();
|
||||||
}
|
}
|
||||||
layout.getX().setVal(x);
|
layout.getX().setVal(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getY() {
|
@Override
|
||||||
|
public double getY() {
|
||||||
if (!layout.isSetY()) {
|
if (!layout.isSetY()) {
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
return layout.getY().getVal();
|
return layout.getY().getVal();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setY(double y) {
|
@Override
|
||||||
|
public void setY(double y) {
|
||||||
if (!layout.isSetY()) {
|
if (!layout.isSetY()) {
|
||||||
layout.addNewY();
|
layout.addNewY();
|
||||||
}
|
}
|
||||||
layout.getY().setVal(y);
|
layout.getY().setVal(y);
|
||||||
}
|
}
|
||||||
|
|
||||||
public LayoutMode getWidthMode() {
|
@Override
|
||||||
|
public LayoutMode getWidthMode() {
|
||||||
if (!layout.isSetWMode()) {
|
if (!layout.isSetWMode()) {
|
||||||
return defaultLayoutMode;
|
return defaultLayoutMode;
|
||||||
}
|
}
|
||||||
return toLayoutMode(layout.getWMode());
|
return toLayoutMode(layout.getWMode());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setWidthMode(LayoutMode mode) {
|
@Override
|
||||||
|
public void setWidthMode(LayoutMode mode) {
|
||||||
if (!layout.isSetWMode()) {
|
if (!layout.isSetWMode()) {
|
||||||
layout.addNewWMode();
|
layout.addNewWMode();
|
||||||
}
|
}
|
||||||
layout.getWMode().setVal(fromLayoutMode(mode));
|
layout.getWMode().setVal(fromLayoutMode(mode));
|
||||||
}
|
}
|
||||||
|
|
||||||
public LayoutMode getHeightMode() {
|
@Override
|
||||||
|
public LayoutMode getHeightMode() {
|
||||||
if (!layout.isSetHMode()) {
|
if (!layout.isSetHMode()) {
|
||||||
return defaultLayoutMode;
|
return defaultLayoutMode;
|
||||||
}
|
}
|
||||||
return toLayoutMode(layout.getHMode());
|
return toLayoutMode(layout.getHMode());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setHeightMode(LayoutMode mode) {
|
@Override
|
||||||
|
public void setHeightMode(LayoutMode mode) {
|
||||||
if (!layout.isSetHMode()) {
|
if (!layout.isSetHMode()) {
|
||||||
layout.addNewHMode();
|
layout.addNewHMode();
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -22,39 +22,23 @@ import static org.apache.poi.POIXMLTypeLoader.DEFAULT_XML_OPTIONS;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
import javax.xml.namespace.QName;
|
import javax.xml.namespace.QName;
|
||||||
|
|
||||||
import org.apache.poi.POIXMLDocumentPart;
|
|
||||||
import org.apache.poi.POIXMLException;
|
import org.apache.poi.POIXMLException;
|
||||||
import org.apache.poi.openxml4j.opc.OPCPackage;
|
|
||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
|
||||||
import org.apache.poi.util.Beta;
|
import org.apache.poi.util.Beta;
|
||||||
import org.apache.poi.util.IOUtils;
|
import org.apache.poi.util.IOUtils;
|
||||||
import org.apache.poi.util.Internal;
|
import org.apache.poi.xddf.usermodel.chart.XDDFChart;
|
||||||
import org.apache.xmlbeans.XmlException;
|
import org.apache.xmlbeans.XmlException;
|
||||||
import org.apache.xmlbeans.XmlOptions;
|
import org.apache.xmlbeans.XmlOptions;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.ChartSpaceDocument;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a Chart in a .docx file
|
* Represents a Chart in a .docx file
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Beta
|
||||||
public class XWPFChart extends POIXMLDocumentPart {
|
public class XWPFChart extends XDDFChart {
|
||||||
|
|
||||||
/**
|
|
||||||
* Root element of the Chart part
|
|
||||||
*/
|
|
||||||
private final CTChartSpace chartSpace;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Chart within that
|
|
||||||
*/
|
|
||||||
private final CTChart chart;
|
|
||||||
|
|
||||||
// lazy initialization
|
// lazy initialization
|
||||||
private Long checksum;
|
private Long checksum;
|
||||||
@ -64,39 +48,11 @@ public class XWPFChart extends POIXMLDocumentPart {
|
|||||||
*
|
*
|
||||||
* @param part the package part holding the chart data,
|
* @param part the package part holding the chart data,
|
||||||
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code>
|
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code>
|
||||||
*
|
*
|
||||||
* @since POI 4.0.0
|
* @since POI 4.0.0
|
||||||
*/
|
*/
|
||||||
protected XWPFChart(PackagePart part) throws IOException, XmlException {
|
protected XWPFChart(PackagePart part) throws IOException, XmlException {
|
||||||
super(part);
|
super(part);
|
||||||
|
|
||||||
chartSpace = ChartSpaceDocument.Factory.parse(part.getInputStream(), DEFAULT_XML_OPTIONS).getChartSpace();
|
|
||||||
chart = chartSpace.getChart();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDocumentRead() throws IOException {
|
|
||||||
super.onDocumentRead();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the underlying CTChartSpace bean, the root element of the Chart part.
|
|
||||||
*
|
|
||||||
* @return the underlying CTChartSpace bean
|
|
||||||
*/
|
|
||||||
@Internal
|
|
||||||
public CTChartSpace getCTChartSpace() {
|
|
||||||
return chartSpace;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the underlying CTChart bean, within the Chart Space
|
|
||||||
*
|
|
||||||
* @return the underlying CTChart bean
|
|
||||||
*/
|
|
||||||
@Internal
|
|
||||||
public CTChart getCTChart() {
|
|
||||||
return chart;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -108,7 +64,7 @@ public class XWPFChart extends POIXMLDocumentPart {
|
|||||||
chartSpace.save(out, xmlOptions);
|
chartSpace.save(out, xmlOptions);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Long getChecksum() {
|
public Long getChecksum() {
|
||||||
if (this.checksum == null) {
|
if (this.checksum == null) {
|
||||||
InputStream is = null;
|
InputStream is = null;
|
||||||
@ -120,7 +76,9 @@ public class XWPFChart extends POIXMLDocumentPart {
|
|||||||
throw new POIXMLException(e);
|
throw new POIXMLException(e);
|
||||||
} finally {
|
} finally {
|
||||||
try {
|
try {
|
||||||
if (is != null) is.close();
|
if (is != null) {
|
||||||
|
is.close();
|
||||||
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new POIXMLException(e);
|
throw new POIXMLException(e);
|
||||||
}
|
}
|
||||||
@ -157,7 +115,7 @@ public class XWPFChart extends POIXMLDocumentPart {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return getChecksum().hashCode();
|
return getChecksum().hashCode();
|
||||||
|
@ -63,7 +63,27 @@ import org.apache.xmlbeans.XmlCursor;
|
|||||||
import org.apache.xmlbeans.XmlException;
|
import org.apache.xmlbeans.XmlException;
|
||||||
import org.apache.xmlbeans.XmlObject;
|
import org.apache.xmlbeans.XmlObject;
|
||||||
import org.apache.xmlbeans.XmlOptions;
|
import org.apache.xmlbeans.XmlOptions;
|
||||||
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTComment;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDocument1;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFtnEdn;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTOnOff;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRow;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSdtBlock;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTStyles;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CommentsDocument;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.DocumentDocument;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.EndnotesDocument;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.FootnotesDocument;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.NumberingDocument;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STDocProtect;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STHdrFtr;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.StylesDocument;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>High(ish) level class for working with .docx files.</p>
|
* <p>High(ish) level class for working with .docx files.</p>
|
||||||
@ -79,7 +99,7 @@ import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
|
|||||||
*/
|
*/
|
||||||
public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
||||||
private static final POILogger LOG = POILogFactory.getLogger(XWPFDocument.class);
|
private static final POILogger LOG = POILogFactory.getLogger(XWPFDocument.class);
|
||||||
|
|
||||||
protected List<XWPFFooter> footers = new ArrayList<>();
|
protected List<XWPFFooter> footers = new ArrayList<>();
|
||||||
protected List<XWPFHeader> headers = new ArrayList<>();
|
protected List<XWPFHeader> headers = new ArrayList<>();
|
||||||
protected List<XWPFComment> comments = new ArrayList<>();
|
protected List<XWPFComment> comments = new ArrayList<>();
|
||||||
@ -186,8 +206,9 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
|||||||
}
|
}
|
||||||
docCursor.dispose();
|
docCursor.dispose();
|
||||||
// Sort out headers and footers
|
// Sort out headers and footers
|
||||||
if (doc.getDocument().getBody().getSectPr() != null)
|
if (doc.getDocument().getBody().getSectPr() != null) {
|
||||||
headerFooterPolicy = new XWPFHeaderFooterPolicy(this);
|
headerFooterPolicy = new XWPFHeaderFooterPolicy(this);
|
||||||
|
}
|
||||||
|
|
||||||
// Create for each XML-part in the Package a PartClass
|
// Create for each XML-part in the Package a PartClass
|
||||||
for (RelationPart rp : getRelationParts()) {
|
for (RelationPart rp : getRelationParts()) {
|
||||||
@ -224,7 +245,7 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
|||||||
} else if (relation.equals(XWPFRelation.CHART.getRelation())) {
|
} else if (relation.equals(XWPFRelation.CHART.getRelation())) {
|
||||||
//now we can use all methods to modify charts in XWPFDocument
|
//now we can use all methods to modify charts in XWPFDocument
|
||||||
XWPFChart chartData = (XWPFChart) p;
|
XWPFChart chartData = (XWPFChart) p;
|
||||||
chartData.onDocumentRead();
|
// chartData.onDocumentRead(); // ??? there is nothing to be done there!!!
|
||||||
charts.add(chartData);
|
charts.add(chartData);
|
||||||
} else if (relation.equals(XWPFRelation.GLOSSARY_DOCUMENT.getRelation())) {
|
} else if (relation.equals(XWPFRelation.GLOSSARY_DOCUMENT.getRelation())) {
|
||||||
// We don't currently process the glossary itself
|
// We don't currently process the glossary itself
|
||||||
@ -380,20 +401,25 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
|||||||
|
|
||||||
public XWPFHyperlink getHyperlinkByID(String id) {
|
public XWPFHyperlink getHyperlinkByID(String id) {
|
||||||
for (XWPFHyperlink link : hyperlinks) {
|
for (XWPFHyperlink link : hyperlinks) {
|
||||||
if (link.getId().equals(id))
|
if (link.getId().equals(id)) {
|
||||||
return link;
|
return link;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public XWPFFootnote getFootnoteByID(int id) {
|
public XWPFFootnote getFootnoteByID(int id) {
|
||||||
if (footnotes == null) return null;
|
if (footnotes == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
return footnotes.getFootnoteById(id);
|
return footnotes.getFootnoteById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public XWPFFootnote getEndnoteByID(int id) {
|
public XWPFFootnote getEndnoteByID(int id) {
|
||||||
if (endnotes == null) return null;
|
if (endnotes == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
return endnotes.get(id);
|
return endnotes.get(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -410,8 +436,9 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
|||||||
|
|
||||||
public XWPFComment getCommentByID(String id) {
|
public XWPFComment getCommentByID(String id) {
|
||||||
for (XWPFComment comment : comments) {
|
for (XWPFComment comment : comments) {
|
||||||
if (comment.getId().equals(id))
|
if (comment.getId().equals(id)) {
|
||||||
return comment;
|
return comment;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
@ -450,7 +477,7 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
|||||||
}
|
}
|
||||||
return headerFooterPolicy;
|
return headerFooterPolicy;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a header of the given type
|
* Create a header of the given type
|
||||||
*
|
*
|
||||||
@ -471,8 +498,8 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
|||||||
}
|
}
|
||||||
return hfPolicy.createHeader(STHdrFtr.Enum.forInt(type.toInt()));
|
return hfPolicy.createHeader(STHdrFtr.Enum.forInt(type.toInt()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a footer of the given type
|
* Create a footer of the given type
|
||||||
*
|
*
|
||||||
@ -619,7 +646,7 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
|||||||
String uri = CTP.type.getName().getNamespaceURI();
|
String uri = CTP.type.getName().getNamespaceURI();
|
||||||
/*
|
/*
|
||||||
* TODO DO not use a coded constant, find the constant in the OOXML
|
* TODO DO not use a coded constant, find the constant in the OOXML
|
||||||
* classes instead, as the child of type CT_Paragraph is defined in the
|
* classes instead, as the child of type CT_Paragraph is defined in the
|
||||||
* OOXML schema as 'p'
|
* OOXML schema as 'p'
|
||||||
*/
|
*/
|
||||||
String localPart = "p";
|
String localPart = "p";
|
||||||
@ -667,8 +694,9 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
|||||||
cursor.toCursor(newParaPos);
|
cursor.toCursor(newParaPos);
|
||||||
while (cursor.toPrevSibling()) {
|
while (cursor.toPrevSibling()) {
|
||||||
o = cursor.getObject();
|
o = cursor.getObject();
|
||||||
if (o instanceof CTP || o instanceof CTTbl)
|
if (o instanceof CTP || o instanceof CTTbl) {
|
||||||
i++;
|
i++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
bodyElements.add(i, newP);
|
bodyElements.add(i, newP);
|
||||||
cursor.toCursor(newParaPos);
|
cursor.toCursor(newParaPos);
|
||||||
@ -706,8 +734,9 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
|||||||
cursor.toCursor(tableCursor);
|
cursor.toCursor(tableCursor);
|
||||||
while (cursor.toPrevSibling()) {
|
while (cursor.toPrevSibling()) {
|
||||||
o = cursor.getObject();
|
o = cursor.getObject();
|
||||||
if (o instanceof CTP || o instanceof CTTbl)
|
if (o instanceof CTP || o instanceof CTTbl) {
|
||||||
i++;
|
i++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
bodyElements.add(i, newT);
|
bodyElements.add(i, newT);
|
||||||
cursor.toCursor(tableCursor);
|
cursor.toCursor(tableCursor);
|
||||||
@ -984,7 +1013,7 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
|||||||
tables.set(pos, table);
|
tables.set(pos, table);
|
||||||
ctDocument.getBody().setTblArray(pos, table.getCTTbl());
|
ctDocument.getBody().setTblArray(pos, table.getCTTbl());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verifies that the documentProtection tag in settings.xml file <br>
|
* Verifies that the documentProtection tag in settings.xml file <br>
|
||||||
* specifies that the protection is enforced (w:enforcement="1") <br>
|
* specifies that the protection is enforced (w:enforcement="1") <br>
|
||||||
@ -1288,7 +1317,7 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
|||||||
public void setZoomPercent(long zoomPercent) {
|
public void setZoomPercent(long zoomPercent) {
|
||||||
settings.setZoomPercent(zoomPercent);
|
settings.setZoomPercent(zoomPercent);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* inserts an existing XWPFTable to the arrays bodyElements and tables
|
* inserts an existing XWPFTable to the arrays bodyElements and tables
|
||||||
*
|
*
|
||||||
@ -1378,7 +1407,9 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
|||||||
throw new POIXMLException(e);
|
throw new POIXMLException(e);
|
||||||
} finally {
|
} finally {
|
||||||
try {
|
try {
|
||||||
if (out != null) out.close();
|
if (out != null) {
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
// ignore
|
// ignore
|
||||||
}
|
}
|
||||||
|
@ -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]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -18,44 +18,151 @@
|
|||||||
*/
|
*/
|
||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.util.List;
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.apache.poi.POIXMLDocumentPart;
|
import org.apache.poi.POIXMLDocumentPart;
|
||||||
import org.apache.poi.ss.util.CellRangeAddress;
|
import org.apache.poi.ss.util.CellRangeAddress;
|
||||||
import org.apache.poi.ss.util.CellReference;
|
import org.apache.poi.xddf.usermodel.chart.AxisCrossBetween;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.AxisCrosses;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.AxisOrientation;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.AxisPosition;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.AxisTickMark;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.BarDirection;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.BarGrouping;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.Grouping;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.LayoutMode;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.LayoutTarget;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.LegendPosition;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.RadarStyle;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.ScatterStyle;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFBarChartData;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFDataSource;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFLineChartData;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFManualLayout;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFPieChartData;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFRadarChartData;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFScatterChartData;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFValueAxis;
|
||||||
import org.apache.poi.xslf.XSLFTestDataSamples;
|
import org.apache.poi.xslf.XSLFTestDataSamples;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFRow;
|
|
||||||
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
|
||||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumData;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumVal;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieChart;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieSer;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrData;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrVal;
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* a modified version from POI-examples
|
||||||
|
*/
|
||||||
public class TestXSLFChart {
|
public class TestXSLFChart {
|
||||||
|
|
||||||
/**
|
|
||||||
* a modified version from POI-examples
|
|
||||||
*/
|
|
||||||
@Test
|
@Test
|
||||||
public void testFillChartTemplate() throws IOException {
|
public void testFillPieChartTemplate() throws IOException {
|
||||||
|
|
||||||
String chartTitle = "Apache POI"; // first line is chart title
|
|
||||||
|
|
||||||
XMLSlideShow pptx = XSLFTestDataSamples.openSampleDocument("pie-chart.pptx");
|
XMLSlideShow pptx = XSLFTestDataSamples.openSampleDocument("pie-chart.pptx");
|
||||||
XSLFSlide slide = pptx.getSlides().get(0);
|
XSLFChart chart = findChart(pptx.getSlides().get(0));
|
||||||
|
List<XDDFChartData> data = findChartData(chart);
|
||||||
|
|
||||||
|
XDDFPieChartData pie = (XDDFPieChartData) data.get(0);
|
||||||
|
XDDFPieChartData.Series firstSeries = (XDDFPieChartData.Series) pie.getSeries().get(0);
|
||||||
|
firstSeries.setExplosion(25);
|
||||||
|
assertEquals(25, firstSeries.getExplosion());
|
||||||
|
|
||||||
|
fillChartData(chart, pie);
|
||||||
|
pptx.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFillBarChartTemplate() throws IOException {
|
||||||
|
XMLSlideShow pptx = XSLFTestDataSamples.openSampleDocument("bar-chart.pptx");
|
||||||
|
XSLFSlide slide = pptx.getSlides().get(0);
|
||||||
|
// duplicate slide and chart before applying "destructive" tests to it
|
||||||
|
XSLFChart chart2 = findChart(pptx.createSlide().importContent(slide));
|
||||||
|
XSLFChart chart = findChart(slide);
|
||||||
|
|
||||||
|
List<XDDFChartData> data = findChartData(chart);
|
||||||
|
XDDFBarChartData bar = (XDDFBarChartData) data.get(0);
|
||||||
|
assertEquals(BarDirection.BAR, bar.getBarDirection());
|
||||||
|
assertEquals(BarGrouping.CLUSTERED, bar.getBarGrouping());
|
||||||
|
assertEquals(100, bar.getGapWidth());
|
||||||
|
fillChartData(chart, bar);
|
||||||
|
|
||||||
|
XDDFBarChartData column = (XDDFBarChartData) findChartData(chart2).get(0);
|
||||||
|
column.setBarDirection(BarDirection.COL);
|
||||||
|
assertEquals(BarDirection.COL, column.getBarDirection());
|
||||||
|
column.getCategoryAxis().setOrientation(AxisOrientation.MIN_MAX);
|
||||||
|
column.getValueAxes().get(0).setPosition(AxisPosition.BOTTOM);
|
||||||
|
fillChartData(chart2, column);
|
||||||
|
|
||||||
|
pptx.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFillLineChartTemplate() throws IOException {
|
||||||
|
XMLSlideShow pptx = XSLFTestDataSamples.openSampleDocument("line-chart.pptx");
|
||||||
|
XSLFChart chart = findChart(pptx.getSlides().get(0));
|
||||||
|
List<XDDFChartData> data = findChartData(chart);
|
||||||
|
|
||||||
|
XDDFLineChartData line = (XDDFLineChartData) data.get(0);
|
||||||
|
assertEquals(Grouping.STANDARD, line.getGrouping());
|
||||||
|
line.setGrouping(Grouping.PERCENT_STACKED);
|
||||||
|
assertEquals(Grouping.PERCENT_STACKED, line.getGrouping());
|
||||||
|
|
||||||
|
fillChartData(chart, line);
|
||||||
|
pptx.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFillRadarChartTemplate() throws IOException {
|
||||||
|
XMLSlideShow pptx = XSLFTestDataSamples.openSampleDocument("radar-chart.pptx");
|
||||||
|
XSLFChart chart = findChart(pptx.getSlides().get(0));
|
||||||
|
List<XDDFChartData> data = findChartData(chart);
|
||||||
|
|
||||||
|
XDDFRadarChartData radar = (XDDFRadarChartData) data.get(0);
|
||||||
|
assertEquals(RadarStyle.MARKER, radar.getStyle());
|
||||||
|
radar.setStyle(RadarStyle.FILLED);
|
||||||
|
assertEquals(RadarStyle.FILLED, radar.getStyle());
|
||||||
|
|
||||||
|
fillChartData(chart, radar);
|
||||||
|
pptx.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFillScatterChartTemplate() throws IOException {
|
||||||
|
XMLSlideShow pptx = XSLFTestDataSamples.openSampleDocument("scatter-chart.pptx");
|
||||||
|
XSLFChart chart = findChart(pptx.getSlides().get(0));
|
||||||
|
List<XDDFChartData> data = findChartData(chart);
|
||||||
|
|
||||||
|
XDDFScatterChartData scatter = (XDDFScatterChartData) data.get(0);
|
||||||
|
assertEquals(ScatterStyle.LINE_MARKER, scatter.getStyle());
|
||||||
|
scatter.setStyle(ScatterStyle.SMOOTH);
|
||||||
|
assertEquals(ScatterStyle.SMOOTH, scatter.getStyle());
|
||||||
|
|
||||||
|
fillChartData(chart, scatter);
|
||||||
|
pptx.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fillChartData(XSLFChart chart, XDDFChartData data) {
|
||||||
|
final int numOfPoints = 3;
|
||||||
|
final String[] categories = {"First", "Second", "Third"};
|
||||||
|
final Integer[] values = {1, 3, 4};
|
||||||
|
|
||||||
|
final String categoryDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 0, 0));
|
||||||
|
final String valuesDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 1, 1));
|
||||||
|
|
||||||
|
final XDDFChartData.Series series = data.getSeries().get(0);
|
||||||
|
final XDDFDataSource<?> categoryData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange);
|
||||||
|
final XDDFNumericalDataSource<Integer> valuesData = XDDFDataSourcesFactory.fromArray(values, valuesDataRange);
|
||||||
|
series.replaceData(categoryData, valuesData);
|
||||||
|
final String title = "Apache POI";
|
||||||
|
series.setTitle(title, chart.setSheetTitle(title));
|
||||||
|
chart.plot(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
private XSLFChart findChart(XSLFSlide slide) {
|
||||||
// find chart in the slide
|
// find chart in the slide
|
||||||
XSLFChart chart = null;
|
XSLFChart chart = null;
|
||||||
for(POIXMLDocumentPart part : slide.getRelations()){
|
for(POIXMLDocumentPart part : slide.getRelations()){
|
||||||
@ -65,76 +172,161 @@ public class TestXSLFChart {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(chart == null) throw new IllegalStateException("chart not found in the template");
|
if(chart == null) {
|
||||||
|
throw new IllegalStateException("chart not found in the template");
|
||||||
// embedded Excel workbook that holds the chart data
|
|
||||||
POIXMLDocumentPart xlsPart = chart.getRelations().get(0);
|
|
||||||
XSSFWorkbook wb = new XSSFWorkbook();
|
|
||||||
XSSFSheet sheet = wb.createSheet();
|
|
||||||
|
|
||||||
CTChart ctChart = chart.getCTChart();
|
|
||||||
CTPlotArea plotArea = ctChart.getPlotArea();
|
|
||||||
|
|
||||||
CTPieChart pieChart = plotArea.getPieChartArray(0);
|
|
||||||
//Pie Chart Series
|
|
||||||
CTPieSer ser = pieChart.getSerArray(0);
|
|
||||||
|
|
||||||
// Series Text
|
|
||||||
CTSerTx tx = ser.getTx();
|
|
||||||
tx.getStrRef().getStrCache().getPtArray(0).setV(chartTitle);
|
|
||||||
sheet.createRow(0).createCell(1).setCellValue(chartTitle);
|
|
||||||
String titleRef = new CellReference(sheet.getSheetName(), 0, 1, true, true).formatAsString();
|
|
||||||
tx.getStrRef().setF(titleRef);
|
|
||||||
|
|
||||||
|
|
||||||
// Category Axis Data
|
|
||||||
CTAxDataSource cat = ser.getCat();
|
|
||||||
CTStrData strData = cat.getStrRef().getStrCache();
|
|
||||||
|
|
||||||
// Values
|
|
||||||
CTNumDataSource valSrc = ser.getVal();
|
|
||||||
CTNumData numData = valSrc.getNumRef().getNumCache();
|
|
||||||
|
|
||||||
strData.setPtArray(null); // unset old axis text
|
|
||||||
numData.setPtArray(null); // unset old values
|
|
||||||
|
|
||||||
Map<String, Double> pieModel = new LinkedHashMap<>();
|
|
||||||
pieModel.put("First", 1.0);
|
|
||||||
pieModel.put("Second", 3.0);
|
|
||||||
pieModel.put("Third", 4.0);
|
|
||||||
|
|
||||||
// set model
|
|
||||||
int idx = 0;
|
|
||||||
int rownum = 1;
|
|
||||||
for(String key : pieModel.keySet()){
|
|
||||||
double val = pieModel.get(key);
|
|
||||||
|
|
||||||
CTNumVal numVal = numData.addNewPt();
|
|
||||||
numVal.setIdx(idx);
|
|
||||||
numVal.setV("" + val);
|
|
||||||
|
|
||||||
CTStrVal sVal = strData.addNewPt();
|
|
||||||
sVal.setIdx(idx);
|
|
||||||
sVal.setV(key);
|
|
||||||
|
|
||||||
idx++;
|
|
||||||
XSSFRow row = sheet.createRow(rownum++);
|
|
||||||
row.createCell(0).setCellValue(key);
|
|
||||||
row.createCell(1).setCellValue(val);
|
|
||||||
}
|
}
|
||||||
numData.getPtCount().setVal(idx);
|
|
||||||
strData.getPtCount().setVal(idx);
|
|
||||||
|
|
||||||
String numDataRange = new CellRangeAddress(1, rownum-1, 1, 1).formatAsString(sheet.getSheetName(), true);
|
checkLegendOperations(chart);
|
||||||
valSrc.getNumRef().setF(numDataRange);
|
return chart;
|
||||||
String axisDataRange = new CellRangeAddress(1, rownum-1, 0, 0).formatAsString(sheet.getSheetName(), true);
|
|
||||||
cat.getStrRef().setF(axisDataRange);
|
|
||||||
|
|
||||||
// updated the embedded workbook with the data
|
|
||||||
OutputStream xlsOut = xlsPart.getPackagePart().getOutputStream();
|
|
||||||
wb.write(xlsOut);
|
|
||||||
xlsOut.close();
|
|
||||||
wb.close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
private List<XDDFChartData> findChartData(XSLFChart chart) {
|
||||||
|
List<XDDFChartData> data = chart.getChartSeries();
|
||||||
|
assertNotNull(data);
|
||||||
|
assertEquals(1, data.size());
|
||||||
|
|
||||||
|
XDDFChartData firstSeries = data.get(0);
|
||||||
|
assertNotNull(firstSeries);
|
||||||
|
if (firstSeries instanceof XDDFScatterChartData) {
|
||||||
|
assertEquals(null, firstSeries.getCategoryAxis());
|
||||||
|
assertEquals(2, firstSeries.getValueAxes().size());
|
||||||
|
checkAxisOperations(firstSeries.getValueAxes().get(0));
|
||||||
|
checkAxisOperations(firstSeries.getValueAxes().get(1));
|
||||||
|
} else if (!(firstSeries instanceof XDDFPieChartData)) {
|
||||||
|
assertNotNull(firstSeries.getCategoryAxis());
|
||||||
|
assertEquals(1, firstSeries.getValueAxes().size());
|
||||||
|
checkAxisOperations(firstSeries.getValueAxes().get(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkLegendOperations(XSLFChart chart) {
|
||||||
|
XDDFChartLegend legend = chart.getOrAddLegend();
|
||||||
|
assertFalse(legend.isOverlay());
|
||||||
|
legend.setOverlay(true);
|
||||||
|
assertTrue(legend.isOverlay());
|
||||||
|
legend.setPosition(LegendPosition.TOP_RIGHT);
|
||||||
|
assertEquals(LegendPosition.TOP_RIGHT, legend.getPosition());
|
||||||
|
|
||||||
|
XDDFManualLayout layout = legend.getOrAddManualLayout();
|
||||||
|
assertNotNull(layout.getTarget());
|
||||||
|
assertNotNull(layout.getXMode());
|
||||||
|
assertNotNull(layout.getYMode());
|
||||||
|
assertNotNull(layout.getHeightMode());
|
||||||
|
assertNotNull(layout.getWidthMode());
|
||||||
|
/*
|
||||||
|
* According to interface, 0.0 should be returned for
|
||||||
|
* uninitialized double properties.
|
||||||
|
*/
|
||||||
|
assertTrue(layout.getX() == 0.0);
|
||||||
|
assertTrue(layout.getY() == 0.0);
|
||||||
|
assertTrue(layout.getWidthRatio() == 0.0);
|
||||||
|
assertTrue(layout.getHeightRatio() == 0.0);
|
||||||
|
|
||||||
|
final double newRatio = 1.1;
|
||||||
|
final double newCoordinate = 0.3;
|
||||||
|
final LayoutMode nonDefaultMode = LayoutMode.FACTOR;
|
||||||
|
final LayoutTarget nonDefaultTarget = LayoutTarget.OUTER;
|
||||||
|
|
||||||
|
layout.setWidthRatio(newRatio);
|
||||||
|
assertTrue(layout.getWidthRatio() == newRatio);
|
||||||
|
|
||||||
|
layout.setHeightRatio(newRatio);
|
||||||
|
assertTrue(layout.getHeightRatio() == newRatio);
|
||||||
|
|
||||||
|
layout.setX(newCoordinate);
|
||||||
|
assertTrue(layout.getX() == newCoordinate);
|
||||||
|
|
||||||
|
layout.setY(newCoordinate);
|
||||||
|
assertTrue(layout.getY() == newCoordinate);
|
||||||
|
|
||||||
|
layout.setXMode(nonDefaultMode);
|
||||||
|
assertTrue(layout.getXMode() == nonDefaultMode);
|
||||||
|
|
||||||
|
layout.setYMode(nonDefaultMode);
|
||||||
|
assertTrue(layout.getYMode() == nonDefaultMode);
|
||||||
|
|
||||||
|
layout.setWidthMode(nonDefaultMode);
|
||||||
|
assertTrue(layout.getWidthMode() == nonDefaultMode);
|
||||||
|
|
||||||
|
layout.setHeightMode(nonDefaultMode);
|
||||||
|
assertTrue(layout.getHeightMode() == nonDefaultMode);
|
||||||
|
|
||||||
|
layout.setTarget(nonDefaultTarget);
|
||||||
|
assertTrue(layout.getTarget() == nonDefaultTarget);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkAxisOperations(XDDFValueAxis axis) {
|
||||||
|
axis.setCrossBetween(AxisCrossBetween.MIDPOINT_CATEGORY);
|
||||||
|
assertEquals(AxisCrossBetween.MIDPOINT_CATEGORY, axis.getCrossBetween());
|
||||||
|
|
||||||
|
axis.setCrosses(AxisCrosses.AUTO_ZERO);
|
||||||
|
assertEquals(AxisCrosses.AUTO_ZERO, axis.getCrosses());
|
||||||
|
|
||||||
|
final String numberFormat = "General";
|
||||||
|
axis.setNumberFormat(numberFormat);
|
||||||
|
assertEquals(numberFormat, axis.getNumberFormat());
|
||||||
|
|
||||||
|
axis.setPosition(AxisPosition.BOTTOM);
|
||||||
|
assertEquals(AxisPosition.BOTTOM, axis.getPosition());
|
||||||
|
|
||||||
|
axis.setMajorTickMark(AxisTickMark.NONE);
|
||||||
|
assertEquals(AxisTickMark.NONE, axis.getMajorTickMark());
|
||||||
|
|
||||||
|
axis.setMajorTickMark(AxisTickMark.IN);
|
||||||
|
assertEquals(AxisTickMark.IN, axis.getMajorTickMark());
|
||||||
|
|
||||||
|
axis.setMajorTickMark(AxisTickMark.OUT);
|
||||||
|
assertEquals(AxisTickMark.OUT, axis.getMajorTickMark());
|
||||||
|
|
||||||
|
axis.setMajorTickMark(AxisTickMark.CROSS);
|
||||||
|
assertEquals(AxisTickMark.CROSS, axis.getMajorTickMark());
|
||||||
|
|
||||||
|
axis.setMinorTickMark(AxisTickMark.NONE);
|
||||||
|
assertEquals(AxisTickMark.NONE, axis.getMinorTickMark());
|
||||||
|
|
||||||
|
axis.setMinorTickMark(AxisTickMark.IN);
|
||||||
|
assertEquals(AxisTickMark.IN, axis.getMinorTickMark());
|
||||||
|
|
||||||
|
axis.setMinorTickMark(AxisTickMark.OUT);
|
||||||
|
assertEquals(AxisTickMark.OUT, axis.getMinorTickMark());
|
||||||
|
|
||||||
|
axis.setMinorTickMark(AxisTickMark.CROSS);
|
||||||
|
assertEquals(AxisTickMark.CROSS, axis.getMinorTickMark());
|
||||||
|
|
||||||
|
axis.setVisible(true);
|
||||||
|
assertTrue(axis.isVisible());
|
||||||
|
|
||||||
|
axis.setVisible(false);
|
||||||
|
assertFalse(axis.isVisible());
|
||||||
|
|
||||||
|
final double EPSILON = 1E-7;
|
||||||
|
axis.setLogBase(Math.E);
|
||||||
|
assertTrue(Math.abs(axis.getLogBase() - Math.E) < EPSILON);
|
||||||
|
|
||||||
|
final double newValue = 10.0;
|
||||||
|
|
||||||
|
axis.setMinimum(newValue);
|
||||||
|
assertTrue(Math.abs(axis.getMinimum() - newValue) < EPSILON);
|
||||||
|
|
||||||
|
axis.setMaximum(newValue);
|
||||||
|
assertTrue(Math.abs(axis.getMaximum() - newValue) < EPSILON);
|
||||||
|
|
||||||
|
IllegalArgumentException iae = null;
|
||||||
|
try {
|
||||||
|
axis.setLogBase(0.0);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
iae = e;
|
||||||
|
}
|
||||||
|
assertNotNull(iae);
|
||||||
|
|
||||||
|
iae = null;
|
||||||
|
try {
|
||||||
|
axis.setLogBase(30000.0);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
iae = e;
|
||||||
|
}
|
||||||
|
assertNotNull(iae);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -17,46 +17,46 @@
|
|||||||
|
|
||||||
package org.apache.poi.xssf.usermodel;
|
package org.apache.poi.xssf.usermodel;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
|
||||||
|
|
||||||
import org.apache.poi.xssf.XSSFTestDataSamples;
|
import org.apache.poi.xssf.XSSFTestDataSamples;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
public final class TestXSSFChart extends TestCase {
|
public final class TestXSSFChart extends TestCase {
|
||||||
|
|
||||||
public void testGetAccessors() {
|
public void testGetAccessors() {
|
||||||
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithThreeCharts.xlsx");
|
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithThreeCharts.xlsx");
|
||||||
XSSFSheet s1 = wb.getSheetAt(0);
|
XSSFSheet s1 = wb.getSheetAt(0);
|
||||||
XSSFSheet s2 = wb.getSheetAt(1);
|
XSSFSheet s2 = wb.getSheetAt(1);
|
||||||
XSSFSheet s3 = wb.getSheetAt(2);
|
XSSFSheet s3 = wb.getSheetAt(2);
|
||||||
|
|
||||||
assertEquals(0, s1.getRelations().size());
|
assertEquals(0, s1.getRelations().size());
|
||||||
assertEquals(1, s2.getRelations().size());
|
assertEquals(1, s2.getRelations().size());
|
||||||
assertEquals(1, s3.getRelations().size());
|
assertEquals(1, s3.getRelations().size());
|
||||||
|
|
||||||
assertNotNull(XSSFTestDataSamples.writeOutAndReadBack(wb));
|
assertNotNull(XSSFTestDataSamples.writeOutAndReadBack(wb));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGetCharts() throws Exception {
|
public void testGetCharts() throws Exception {
|
||||||
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithThreeCharts.xlsx");
|
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithThreeCharts.xlsx");
|
||||||
|
|
||||||
XSSFSheet s1 = wb.getSheetAt(0);
|
XSSFSheet s1 = wb.getSheetAt(0);
|
||||||
XSSFSheet s2 = wb.getSheetAt(1);
|
XSSFSheet s2 = wb.getSheetAt(1);
|
||||||
XSSFSheet s3 = wb.getSheetAt(2);
|
XSSFSheet s3 = wb.getSheetAt(2);
|
||||||
|
|
||||||
assertEquals(0, s1.createDrawingPatriarch().getCharts().size());
|
assertEquals(0, s1.createDrawingPatriarch().getCharts().size());
|
||||||
assertEquals(2, s2.createDrawingPatriarch().getCharts().size());
|
assertEquals(2, s2.createDrawingPatriarch().getCharts().size());
|
||||||
assertEquals(1, s3.createDrawingPatriarch().getCharts().size());
|
assertEquals(1, s3.createDrawingPatriarch().getCharts().size());
|
||||||
|
|
||||||
// Check the titles
|
// Check the titles
|
||||||
XSSFChart chart = s2.createDrawingPatriarch().getCharts().get(0);
|
XSSFChart chart = s2.createDrawingPatriarch().getCharts().get(0);
|
||||||
assertEquals(null, chart.getTitleText());
|
assertEquals(null, chart.getTitleText());
|
||||||
|
|
||||||
chart = s2.createDrawingPatriarch().getCharts().get(1);
|
chart = s2.createDrawingPatriarch().getCharts().get(1);
|
||||||
assertEquals("Pie Chart Title Thingy", chart.getTitleText().getString());
|
assertEquals("Pie Chart Title Thingy", chart.getTitleText().getString());
|
||||||
|
|
||||||
chart = s3.createDrawingPatriarch().getCharts().get(0);
|
chart = s3.createDrawingPatriarch().getCharts().get(0);
|
||||||
assertEquals("Sheet 3 Chart with Title", chart.getTitleText().getString());
|
assertEquals("Sheet 3 Chart with Title", chart.getTitleText().getString());
|
||||||
|
|
||||||
assertNotNull(XSSFTestDataSamples.writeOutAndReadBack(wb));
|
assertNotNull(XSSFTestDataSamples.writeOutAndReadBack(wb));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,14 +68,15 @@ public final class TestXSSFChart extends TestCase {
|
|||||||
XSSFChart c1 = d1.createChart(a1);
|
XSSFChart c1 = d1.createChart(a1);
|
||||||
|
|
||||||
assertEquals(1, d1.getCharts().size());
|
assertEquals(1, d1.getCharts().size());
|
||||||
|
|
||||||
assertNotNull(c1.getGraphicFrame());
|
assertNotNull(c1.getGraphicFrame());
|
||||||
assertNotNull(c1.getOrCreateLegend());
|
assertNotNull(c1.getOrAddLegend());
|
||||||
|
|
||||||
XSSFClientAnchor a2 = new XSSFClientAnchor(0, 0, 0, 0, 1, 11, 10, 60);
|
XSSFClientAnchor a2 = new XSSFClientAnchor(0, 0, 0, 0, 1, 11, 10, 60);
|
||||||
XSSFChart c2 = d1.createChart(a2);
|
XSSFChart c2 = d1.createChart(a2);
|
||||||
assertNotNull(c2);
|
assertNotNull(c2);
|
||||||
assertEquals(2, d1.getCharts().size());
|
assertEquals(2, d1.getCharts().size());
|
||||||
|
|
||||||
assertNotNull(XSSFTestDataSamples.writeOutAndReadBack(wb));
|
assertNotNull(XSSFTestDataSamples.writeOutAndReadBack(wb));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,24 +17,32 @@
|
|||||||
|
|
||||||
package org.apache.poi.xssf.usermodel.charts;
|
package org.apache.poi.xssf.usermodel.charts;
|
||||||
|
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.AxisCrosses;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.AxisPosition;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFCategoryAxis;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFChart;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFDrawing;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
import org.apache.poi.ss.usermodel.charts.*;
|
|
||||||
import org.apache.poi.xssf.usermodel.*;
|
|
||||||
|
|
||||||
public final class TestXSSFCategoryAxis extends TestCase {
|
public final class TestXSSFCategoryAxis extends TestCase {
|
||||||
|
|
||||||
public void testAccessMethods() throws Exception {
|
public void testAccessMethods() throws Exception {
|
||||||
XSSFWorkbook wb = new XSSFWorkbook();
|
XSSFWorkbook wb = new XSSFWorkbook();
|
||||||
XSSFSheet sheet = wb.createSheet();
|
XSSFSheet sheet = wb.createSheet();
|
||||||
XSSFDrawing drawing = sheet.createDrawingPatriarch();
|
XSSFDrawing drawing = sheet.createDrawingPatriarch();
|
||||||
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
|
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
|
||||||
XSSFChart chart = drawing.createChart(anchor);
|
XSSFChart chart = drawing.createChart(anchor);
|
||||||
XSSFCategoryAxis axis = chart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM);
|
XDDFCategoryAxis axis = chart.createCategoryAxis(AxisPosition.BOTTOM);
|
||||||
|
|
||||||
axis.setCrosses(AxisCrosses.AUTO_ZERO);
|
axis.setCrosses(AxisCrosses.AUTO_ZERO);
|
||||||
assertEquals(axis.getCrosses(), AxisCrosses.AUTO_ZERO);
|
assertEquals(axis.getCrosses(), AxisCrosses.AUTO_ZERO);
|
||||||
|
|
||||||
assertEquals(chart.getAxis().size(), 1);
|
assertEquals(chart.getAxes().size(), 1);
|
||||||
|
|
||||||
|
wb.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,18 +19,22 @@ package org.apache.poi.xssf.usermodel.charts;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import org.apache.poi.xddf.usermodel.chart.AxisPosition;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.AxisTickMark;
|
||||||
import org.apache.poi.ss.usermodel.Sheet;
|
import org.apache.poi.xddf.usermodel.chart.XDDFChartAxis;
|
||||||
import org.apache.poi.ss.usermodel.Workbook;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.*;
|
|
||||||
import org.apache.poi.xssf.XSSFTestDataSamples;
|
import org.apache.poi.xssf.XSSFTestDataSamples;
|
||||||
import org.apache.poi.xssf.usermodel.*;
|
import org.apache.poi.xssf.usermodel.XSSFChart;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFDrawing;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
public final class TestXSSFChartAxis extends TestCase {
|
public final class TestXSSFChartAxis extends TestCase {
|
||||||
|
|
||||||
private static final double EPSILON = 1E-7;
|
private static final double EPSILON = 1E-7;
|
||||||
private final XSSFChartAxis axis;
|
private final XDDFChartAxis axis;
|
||||||
|
|
||||||
public TestXSSFChartAxis() {
|
public TestXSSFChartAxis() {
|
||||||
super();
|
super();
|
||||||
@ -39,9 +43,9 @@ public final class TestXSSFChartAxis extends TestCase {
|
|||||||
XSSFDrawing drawing = sheet.createDrawingPatriarch();
|
XSSFDrawing drawing = sheet.createDrawingPatriarch();
|
||||||
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
|
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
|
||||||
XSSFChart chart = drawing.createChart(anchor);
|
XSSFChart chart = drawing.createChart(anchor);
|
||||||
axis = chart.getChartAxisFactory().createValueAxis(AxisPosition.BOTTOM);
|
axis = chart.createValueAxis(AxisPosition.BOTTOM);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testLogBaseIllegalArgument() throws Exception {
|
public void testLogBaseIllegalArgument() throws Exception {
|
||||||
IllegalArgumentException iae = null;
|
IllegalArgumentException iae = null;
|
||||||
try {
|
try {
|
||||||
@ -119,13 +123,12 @@ public final class TestXSSFChartAxis extends TestCase {
|
|||||||
|
|
||||||
public void testGetChartAxisBug57362() {
|
public void testGetChartAxisBug57362() {
|
||||||
//Load existing excel with some chart on it having primary and secondary axis.
|
//Load existing excel with some chart on it having primary and secondary axis.
|
||||||
final Workbook workbook = XSSFTestDataSamples.openSampleWorkbook("57362.xlsx");
|
final XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("57362.xlsx");
|
||||||
final Sheet sh = workbook.getSheetAt(0);
|
final XSSFSheet sh = workbook.getSheetAt(0);
|
||||||
final XSSFSheet xsh = (XSSFSheet) sh;
|
final XSSFDrawing drawing = sh.createDrawingPatriarch();
|
||||||
final XSSFDrawing drawing = xsh.createDrawingPatriarch();
|
|
||||||
final XSSFChart chart = drawing.getCharts().get(0);
|
final XSSFChart chart = drawing.getCharts().get(0);
|
||||||
|
|
||||||
final List<? extends XSSFChartAxis> axisList = chart.getAxis();
|
final List<? extends XDDFChartAxis> axisList = chart.getAxes();
|
||||||
|
|
||||||
assertEquals(4, axisList.size());
|
assertEquals(4, axisList.size());
|
||||||
assertNotNull(axisList.get(0));
|
assertNotNull(axisList.get(0));
|
||||||
|
@ -23,13 +23,12 @@ import static org.junit.Assert.assertTrue;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import org.apache.poi.ss.usermodel.Chart;
|
import org.apache.poi.xddf.usermodel.chart.LegendPosition;
|
||||||
import org.apache.poi.ss.usermodel.ClientAnchor;
|
import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend;
|
||||||
import org.apache.poi.ss.usermodel.Drawing;
|
import org.apache.poi.xssf.usermodel.XSSFChart;
|
||||||
import org.apache.poi.ss.usermodel.Sheet;
|
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
|
||||||
import org.apache.poi.ss.usermodel.Workbook;
|
import org.apache.poi.xssf.usermodel.XSSFDrawing;
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartLegend;
|
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||||
import org.apache.poi.ss.usermodel.charts.LegendPosition;
|
|
||||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
@ -39,28 +38,28 @@ import org.junit.Test;
|
|||||||
public final class TestXSSFChartLegend {
|
public final class TestXSSFChartLegend {
|
||||||
@Test
|
@Test
|
||||||
public void testLegendPositionAccessMethods() throws IOException {
|
public void testLegendPositionAccessMethods() throws IOException {
|
||||||
Workbook wb = new XSSFWorkbook();
|
XSSFWorkbook wb = new XSSFWorkbook();
|
||||||
Sheet sheet = wb.createSheet();
|
XSSFSheet sheet = wb.createSheet();
|
||||||
Drawing<?> drawing = sheet.createDrawingPatriarch();
|
XSSFDrawing drawing = sheet.createDrawingPatriarch();
|
||||||
ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
|
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
|
||||||
Chart chart = drawing.createChart(anchor);
|
XSSFChart chart = drawing.createChart(anchor);
|
||||||
ChartLegend legend = chart.getOrCreateLegend();
|
XDDFChartLegend legend = chart.getOrAddLegend();
|
||||||
|
|
||||||
legend.setPosition(LegendPosition.TOP_RIGHT);
|
legend.setPosition(LegendPosition.TOP_RIGHT);
|
||||||
assertEquals(LegendPosition.TOP_RIGHT, legend.getPosition());
|
assertEquals(LegendPosition.TOP_RIGHT, legend.getPosition());
|
||||||
|
|
||||||
wb.close();
|
wb.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void test_setOverlay_defaultChartLegend_expectOverlayInitialValueSetToFalse() throws IOException {
|
public void test_setOverlay_defaultChartLegend_expectOverlayInitialValueSetToFalse() throws IOException {
|
||||||
// Arrange
|
// Arrange
|
||||||
Workbook wb = new XSSFWorkbook();
|
XSSFWorkbook wb = new XSSFWorkbook();
|
||||||
Sheet sheet = wb.createSheet();
|
XSSFSheet sheet = wb.createSheet();
|
||||||
Drawing<?> drawing = sheet.createDrawingPatriarch();
|
XSSFDrawing drawing = sheet.createDrawingPatriarch();
|
||||||
ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
|
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
|
||||||
Chart chart = drawing.createChart(anchor);
|
XSSFChart chart = drawing.createChart(anchor);
|
||||||
ChartLegend legend = chart.getOrCreateLegend();
|
XDDFChartLegend legend = chart.getOrAddLegend();
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
||||||
@ -73,12 +72,12 @@ public final class TestXSSFChartLegend {
|
|||||||
@Test
|
@Test
|
||||||
public void test_setOverlay_chartLegendSetToTrue_expectOverlayInitialValueSetToTrue() throws IOException {
|
public void test_setOverlay_chartLegendSetToTrue_expectOverlayInitialValueSetToTrue() throws IOException {
|
||||||
// Arrange
|
// Arrange
|
||||||
Workbook wb = new XSSFWorkbook();
|
XSSFWorkbook wb = new XSSFWorkbook();
|
||||||
Sheet sheet = wb.createSheet();
|
XSSFSheet sheet = wb.createSheet();
|
||||||
Drawing<?> drawing = sheet.createDrawingPatriarch();
|
XSSFDrawing drawing = sheet.createDrawingPatriarch();
|
||||||
ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
|
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
|
||||||
Chart chart = drawing.createChart(anchor);
|
XSSFChart chart = drawing.createChart(anchor);
|
||||||
ChartLegend legend = chart.getOrCreateLegend();
|
XDDFChartLegend legend = chart.getOrAddLegend();
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
legend.setOverlay(true);
|
legend.setOverlay(true);
|
||||||
|
@ -26,24 +26,22 @@ import java.io.IOException;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.poi.ss.usermodel.Cell;
|
import org.apache.poi.ss.usermodel.Cell;
|
||||||
import org.apache.poi.ss.usermodel.Chart;
|
|
||||||
import org.apache.poi.ss.usermodel.ClientAnchor;
|
|
||||||
import org.apache.poi.ss.usermodel.Drawing;
|
|
||||||
import org.apache.poi.ss.usermodel.Row;
|
import org.apache.poi.ss.usermodel.Row;
|
||||||
import org.apache.poi.ss.usermodel.Sheet;
|
|
||||||
import org.apache.poi.ss.usermodel.Workbook;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.AxisCrosses;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.AxisPosition;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartAxis;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartDataSource;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartLegend;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.DataSources;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.LegendPosition;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.LineChartData;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.ValueAxis;
|
|
||||||
import org.apache.poi.ss.util.CellRangeAddress;
|
import org.apache.poi.ss.util.CellRangeAddress;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.AxisCrosses;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.AxisPosition;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.ChartTypes;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.LegendPosition;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFChartAxis;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFDataSource;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFValueAxis;
|
||||||
import org.apache.poi.xssf.XSSFTestDataSamples;
|
import org.apache.poi.xssf.XSSFTestDataSamples;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFChart;
|
import org.apache.poi.xssf.usermodel.XSSFChart;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFDrawing;
|
import org.apache.poi.xssf.usermodel.XSSFDrawing;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
|
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||||
@ -54,9 +52,9 @@ import org.junit.Test;
|
|||||||
* Test get/set chart title.
|
* Test get/set chart title.
|
||||||
*/
|
*/
|
||||||
public class TestXSSFChartTitle {
|
public class TestXSSFChartTitle {
|
||||||
private Workbook createWorkbookWithChart() {
|
private XSSFWorkbook createWorkbookWithChart() {
|
||||||
Workbook wb = new XSSFWorkbook();
|
XSSFWorkbook wb = new XSSFWorkbook();
|
||||||
Sheet sheet = wb.createSheet("linechart");
|
XSSFSheet sheet = wb.createSheet("linechart");
|
||||||
final int NUM_OF_ROWS = 3;
|
final int NUM_OF_ROWS = 3;
|
||||||
final int NUM_OF_COLUMNS = 10;
|
final int NUM_OF_COLUMNS = 10;
|
||||||
|
|
||||||
@ -71,28 +69,26 @@ public class TestXSSFChartTitle {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Drawing<?> drawing = sheet.createDrawingPatriarch();
|
XSSFDrawing drawing = sheet.createDrawingPatriarch();
|
||||||
ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15);
|
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15);
|
||||||
|
|
||||||
Chart chart = drawing.createChart(anchor);
|
XSSFChart chart = drawing.createChart(anchor);
|
||||||
ChartLegend legend = chart.getOrCreateLegend();
|
XDDFChartLegend legend = chart.getOrAddLegend();
|
||||||
legend.setPosition(LegendPosition.TOP_RIGHT);
|
legend.setPosition(LegendPosition.TOP_RIGHT);
|
||||||
|
|
||||||
LineChartData data = chart.getChartDataFactory().createLineChartData();
|
|
||||||
|
|
||||||
// Use a category axis for the bottom axis.
|
// Use a category axis for the bottom axis.
|
||||||
ChartAxis bottomAxis = chart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM);
|
XDDFChartAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
|
||||||
ValueAxis leftAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT);
|
XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
|
||||||
leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
|
leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
|
||||||
|
|
||||||
ChartDataSource<Number> xs = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(0, 0, 0, NUM_OF_COLUMNS - 1));
|
XDDFDataSource<Double> xs = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(0, 0, 0, NUM_OF_COLUMNS - 1));
|
||||||
ChartDataSource<Number> ys1 = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, NUM_OF_COLUMNS - 1));
|
XDDFNumericalDataSource<Double> ys1 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, NUM_OF_COLUMNS - 1));
|
||||||
ChartDataSource<Number> ys2 = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, NUM_OF_COLUMNS - 1));
|
XDDFNumericalDataSource<Double> ys2 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, NUM_OF_COLUMNS - 1));
|
||||||
|
|
||||||
|
XDDFChartData data = chart.createData(ChartTypes.LINE, bottomAxis, leftAxis);
|
||||||
data.addSeries(xs, ys1);
|
data.addSeries(xs, ys1);
|
||||||
data.addSeries(xs, ys2);
|
data.addSeries(xs, ys2);
|
||||||
|
chart.plot(data);
|
||||||
chart.plot(data, bottomAxis, leftAxis);
|
|
||||||
|
|
||||||
return wb;
|
return wb;
|
||||||
}
|
}
|
||||||
@ -100,16 +96,14 @@ public class TestXSSFChartTitle {
|
|||||||
/**
|
/**
|
||||||
* Gets the first chart from the named sheet in the workbook.
|
* Gets the first chart from the named sheet in the workbook.
|
||||||
*/
|
*/
|
||||||
private XSSFChart getChartFromWorkbook(Workbook wb, String sheetName) {
|
private XSSFChart getChartFromWorkbook(XSSFWorkbook wb, String sheetName) {
|
||||||
Sheet sheet = wb.getSheet(sheetName);
|
XSSFSheet sheet = wb.getSheet(sheetName);
|
||||||
if (sheet instanceof XSSFSheet) {
|
XSSFSheet xsheet = sheet;
|
||||||
XSSFSheet xsheet = (XSSFSheet) sheet;
|
XSSFDrawing drawing = xsheet.getDrawingPatriarch();
|
||||||
XSSFDrawing drawing = xsheet.getDrawingPatriarch();
|
if (drawing != null) {
|
||||||
if (drawing != null) {
|
List<XSSFChart> charts = drawing.getCharts();
|
||||||
List<XSSFChart> charts = drawing.getCharts();
|
if (charts != null && charts.size() > 0) {
|
||||||
if (charts != null && charts.size() > 0) {
|
return charts.get(0);
|
||||||
return charts.get(0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
@ -117,7 +111,7 @@ public class TestXSSFChartTitle {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testNewChart() throws IOException {
|
public void testNewChart() throws IOException {
|
||||||
Workbook wb = createWorkbookWithChart();
|
XSSFWorkbook wb = createWorkbookWithChart();
|
||||||
XSSFChart chart = getChartFromWorkbook(wb, "linechart");
|
XSSFChart chart = getChartFromWorkbook(wb, "linechart");
|
||||||
assertNotNull(chart);
|
assertNotNull(chart);
|
||||||
assertNull(chart.getTitleText());
|
assertNull(chart.getTitleText());
|
||||||
@ -126,7 +120,7 @@ public class TestXSSFChartTitle {
|
|||||||
XSSFRichTextString queryTitle = chart.getTitleText();
|
XSSFRichTextString queryTitle = chart.getTitleText();
|
||||||
assertNotNull(queryTitle);
|
assertNotNull(queryTitle);
|
||||||
assertEquals(myTitle, queryTitle.toString());
|
assertEquals(myTitle, queryTitle.toString());
|
||||||
|
|
||||||
final String myTitleFormula = "1 & \" and \" & 2";
|
final String myTitleFormula = "1 & \" and \" & 2";
|
||||||
chart.setTitleFormula(myTitleFormula);
|
chart.setTitleFormula(myTitleFormula);
|
||||||
// setting formula should unset text, but since there is a formula, returns an empty string
|
// setting formula should unset text, but since there is a formula, returns an empty string
|
||||||
@ -139,7 +133,7 @@ public class TestXSSFChartTitle {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testExistingChartWithTitle() throws IOException {
|
public void testExistingChartWithTitle() throws IOException {
|
||||||
Workbook wb = XSSFTestDataSamples.openSampleWorkbook("chartTitle_withTitle.xlsx");
|
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("chartTitle_withTitle.xlsx");
|
||||||
XSSFChart chart = getChartFromWorkbook(wb, "Sheet1");
|
XSSFChart chart = getChartFromWorkbook(wb, "Sheet1");
|
||||||
assertNotNull(chart);
|
assertNotNull(chart);
|
||||||
XSSFRichTextString originalTitle = chart.getTitleText();
|
XSSFRichTextString originalTitle = chart.getTitleText();
|
||||||
@ -155,7 +149,7 @@ public class TestXSSFChartTitle {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testExistingChartNoTitle() throws IOException {
|
public void testExistingChartNoTitle() throws IOException {
|
||||||
Workbook wb = XSSFTestDataSamples.openSampleWorkbook("chartTitle_noTitle.xlsx");
|
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("chartTitle_noTitle.xlsx");
|
||||||
XSSFChart chart = getChartFromWorkbook(wb, "Sheet1");
|
XSSFChart chart = getChartFromWorkbook(wb, "Sheet1");
|
||||||
assertNotNull(chart);
|
assertNotNull(chart);
|
||||||
assertNull(chart.getTitleText());
|
assertNull(chart.getTitleText());
|
||||||
@ -169,7 +163,7 @@ public class TestXSSFChartTitle {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testExistingChartWithFormulaTitle() throws IOException {
|
public void testExistingChartWithFormulaTitle() throws IOException {
|
||||||
Workbook wb = XSSFTestDataSamples.openSampleWorkbook("chartTitle_withTitleFormula.xlsx");
|
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("chartTitle_withTitleFormula.xlsx");
|
||||||
XSSFChart chart = getChartFromWorkbook(wb, "Sheet1");
|
XSSFChart chart = getChartFromWorkbook(wb, "Sheet1");
|
||||||
assertNotNull(chart);
|
assertNotNull(chart);
|
||||||
XSSFRichTextString originalTitle = chart.getTitleText();
|
XSSFRichTextString originalTitle = chart.getTitleText();
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user