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,69 +67,41 @@ public class PieChartDemo {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (chart == null) throw new IllegalStateException("chart not found in the template");
|
if(chart == null) {
|
||||||
|
throw new IllegalStateException("chart not found in the template");
|
||||||
// embedded Excel workbook that holds the chart data
|
}
|
||||||
POIXMLDocumentPart xlsPart = chart.getRelations().get(0);
|
|
||||||
try (XSSFWorkbook wb = new XSSFWorkbook()) {
|
|
||||||
XSSFSheet sheet = wb.createSheet();
|
|
||||||
|
|
||||||
CTChart ctChart = chart.getCTChart();
|
|
||||||
CTPlotArea plotArea = ctChart.getPlotArea();
|
|
||||||
|
|
||||||
CTPieChart pieChart = plotArea.getPieChartArray(0);
|
|
||||||
//Pie Chart Series
|
|
||||||
CTPieSer ser = pieChart.getSerArray(0);
|
|
||||||
|
|
||||||
// Series Text
|
// Series Text
|
||||||
CTSerTx tx = ser.getTx();
|
List<XDDFChartData> series = chart.getChartSeries();
|
||||||
tx.getStrRef().getStrCache().getPtArray(0).setV(chartTitle);
|
XDDFPieChartData pie = (XDDFPieChartData) series.get(0);
|
||||||
sheet.createRow(0).createCell(1).setCellValue(chartTitle);
|
|
||||||
String titleRef = new CellReference(sheet.getSheetName(), 0, 1, true, true).formatAsString();
|
|
||||||
tx.getStrRef().setF(titleRef);
|
|
||||||
|
|
||||||
// Category Axis Data
|
// Category Axis Data
|
||||||
CTAxDataSource cat = ser.getCat();
|
List<String> listCategories = new ArrayList<String>(3);
|
||||||
CTStrData strData = cat.getStrRef().getStrCache();
|
|
||||||
|
|
||||||
// Values
|
// Values
|
||||||
CTNumDataSource val = ser.getVal();
|
List<Double> listValues = new ArrayList<Double>(3);
|
||||||
CTNumData numData = val.getNumRef().getNumCache();
|
|
||||||
|
|
||||||
strData.setPtArray(null); // unset old axis text
|
|
||||||
numData.setPtArray(null); // unset old values
|
|
||||||
|
|
||||||
// set model
|
// set model
|
||||||
int idx = 0;
|
|
||||||
int rownum = 1;
|
|
||||||
String ln;
|
String ln;
|
||||||
while ((ln = modelReader.readLine()) != null) {
|
while((ln = modelReader.readLine()) != null){
|
||||||
String[] vals = ln.split("\\s+");
|
String[] vals = ln.split("\\s+");
|
||||||
CTNumVal numVal = numData.addNewPt();
|
listCategories.add(vals[0]);
|
||||||
numVal.setIdx(idx);
|
listValues.add(Double.valueOf(vals[1]));
|
||||||
numVal.setV(vals[1]);
|
|
||||||
|
|
||||||
CTStrVal sVal = strData.addNewPt();
|
|
||||||
sVal.setIdx(idx);
|
|
||||||
sVal.setV(vals[0]);
|
|
||||||
|
|
||||||
idx++;
|
|
||||||
XSSFRow row = sheet.createRow(rownum++);
|
|
||||||
row.createCell(0).setCellValue(vals[0]);
|
|
||||||
row.createCell(1).setCellValue(Double.valueOf(vals[1]));
|
|
||||||
}
|
}
|
||||||
numData.getPtCount().setVal(idx);
|
String[] categories = listCategories.toArray(new String[listCategories.size()]);
|
||||||
strData.getPtCount().setVal(idx);
|
Double[] values = listValues.toArray(new Double[listValues.size()]);
|
||||||
|
|
||||||
String numDataRange = new CellRangeAddress(1, rownum - 1, 1, 1).formatAsString(sheet.getSheetName(), true);
|
final int numOfPoints = categories.length;
|
||||||
val.getNumRef().setF(numDataRange);
|
final String categoryDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 0, 0));
|
||||||
String axisDataRange = new CellRangeAddress(1, rownum - 1, 0, 0).formatAsString(sheet.getSheetName(), true);
|
final String valuesDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 1, 1));
|
||||||
cat.getStrRef().setF(axisDataRange);
|
final XDDFDataSource<?> categoriesData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange);
|
||||||
|
final XDDFNumericalDataSource<? extends Number> valuesData = XDDFDataSourcesFactory.fromArray(values, valuesDataRange);
|
||||||
|
|
||||||
// updated the embedded workbook with the data
|
XDDFPieChartData.Series firstSeries = (XDDFPieChartData.Series) pie.getSeries().get(0);
|
||||||
try (OutputStream xlsOut = xlsPart.getPackagePart().getOutputStream()) {
|
firstSeries.replaceData(categoriesData, valuesData);
|
||||||
wb.write(xlsOut);
|
firstSeries.setTitle(chartTitle, chart.setSheetTitle(chartTitle));
|
||||||
}
|
firstSeries.setExplosion(25);
|
||||||
|
chart.plot(pie);
|
||||||
|
|
||||||
// save the result
|
// save the result
|
||||||
try (OutputStream out = new FileOutputStream("pie-chart-demo-output.pptx")) {
|
try (OutputStream out = new FileOutputStream("pie-chart-demo-output.pptx")) {
|
||||||
@ -148,5 +110,4 @@ public class PieChartDemo {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
|
||||||
@ -62,28 +63,27 @@ public class ScatterChart {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Drawing<?> drawing = sheet.createDrawingPatriarch();
|
XSSFDrawing drawing = sheet.createDrawingPatriarch();
|
||||||
ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15);
|
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15);
|
||||||
|
|
||||||
Chart chart = drawing.createChart(anchor);
|
XSSFChart chart = drawing.createChart(anchor);
|
||||||
ChartLegend legend = chart.getOrCreateLegend();
|
XDDFChartLegend legend = chart.getOrAddLegend();
|
||||||
legend.setPosition(LegendPosition.TOP_RIGHT);
|
legend.setPosition(LegendPosition.TOP_RIGHT);
|
||||||
|
|
||||||
ScatterChartData data = chart.getChartDataFactory().createScatterChartData();
|
XDDFValueAxis bottomAxis = chart.createValueAxis(AxisPosition.BOTTOM);
|
||||||
|
XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
|
||||||
ValueAxis bottomAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.BOTTOM);
|
|
||||||
ValueAxis leftAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT);
|
|
||||||
leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
|
leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
|
||||||
|
|
||||||
ChartDataSource<Number> xs = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(0, 0, 0, NUM_OF_COLUMNS - 1));
|
XDDFDataSource<Double> xs = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(0, 0, 0, NUM_OF_COLUMNS - 1));
|
||||||
ChartDataSource<Number> ys1 = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, NUM_OF_COLUMNS - 1));
|
XDDFNumericalDataSource<Double> ys1 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, NUM_OF_COLUMNS - 1));
|
||||||
ChartDataSource<Number> ys2 = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, NUM_OF_COLUMNS - 1));
|
XDDFNumericalDataSource<Double> ys2 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, NUM_OF_COLUMNS - 1));
|
||||||
|
|
||||||
|
|
||||||
data.addSerie(xs, ys1);
|
XDDFChartData data = chart.createData(ChartTypes.SCATTER, bottomAxis, leftAxis);
|
||||||
data.addSerie(xs, ys2);
|
|
||||||
|
|
||||||
chart.plot(data, bottomAxis, leftAxis);
|
data.addSeries(xs, ys1);
|
||||||
|
data.addSeries(xs, ys2);
|
||||||
|
chart.plot(data);
|
||||||
|
|
||||||
// Write the output to a file
|
// Write the output to a file
|
||||||
try (FileOutputStream fileOut = new FileOutputStream("ooxml-scatter-chart.xlsx")) {
|
try (FileOutputStream fileOut = new FileOutputStream("ooxml-scatter-chart.xlsx")) {
|
||||||
|
@ -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,18 +19,21 @@ package org.apache.poi.ss.usermodel;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartData;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartAxis;
|
import org.apache.poi.ss.usermodel.charts.ChartAxis;
|
||||||
|
import org.apache.poi.ss.usermodel.charts.ChartAxisFactory;
|
||||||
|
import org.apache.poi.ss.usermodel.charts.ChartData;
|
||||||
|
import org.apache.poi.ss.usermodel.charts.ChartDataFactory;
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartLegend;
|
import org.apache.poi.ss.usermodel.charts.ChartLegend;
|
||||||
import org.apache.poi.ss.usermodel.charts.ManuallyPositionable;
|
import org.apache.poi.ss.usermodel.charts.ManuallyPositionable;
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartDataFactory;
|
import org.apache.poi.util.Removal;
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartAxisFactory;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* High level representation of a chart.
|
* High level representation of a chart.
|
||||||
*
|
*
|
||||||
* @author Roman Kashitsyn
|
* @deprecated
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public interface Chart extends ManuallyPositionable {
|
public interface Chart extends ManuallyPositionable {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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.
|
||||||
|
@ -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 {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -17,15 +17,15 @@
|
|||||||
|
|
||||||
package org.apache.poi.ss.usermodel.charts;
|
package org.apache.poi.ss.usermodel.charts;
|
||||||
|
|
||||||
import org.apache.poi.util.Beta;
|
import org.apache.poi.util.Removal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A factory for different chart axis.
|
* A factory for different chart axis.
|
||||||
*
|
*
|
||||||
* @author Roman Kashitsyn
|
* @deprecated
|
||||||
* @author Martin Andersson
|
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public interface ChartAxisFactory {
|
public interface ChartAxisFactory {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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 {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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;
|
||||||
@ -130,10 +132,16 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
|
|
||||||
Map<String, XSLFSlideMaster> masterMap = new HashMap<>();
|
Map<String, XSLFSlideMaster> masterMap = new HashMap<>();
|
||||||
Map<String, XSLFSlide> shIdMap = new HashMap<>();
|
Map<String, XSLFSlide> shIdMap = new HashMap<>();
|
||||||
|
Map<String, XSLFChart> chartMap = new HashMap<>();
|
||||||
for (RelationPart rp : getRelationParts()) {
|
for (RelationPart rp : getRelationParts()) {
|
||||||
POIXMLDocumentPart p = rp.getDocumentPart();
|
POIXMLDocumentPart p = rp.getDocumentPart();
|
||||||
if (p instanceof XSLFSlide) {
|
if (p instanceof XSLFSlide) {
|
||||||
shIdMap.put(rp.getRelationship().getId(), (XSLFSlide) p);
|
shIdMap.put(rp.getRelationship().getId(), (XSLFSlide) p);
|
||||||
|
for (POIXMLDocumentPart c : p.getRelations()) {
|
||||||
|
if (c instanceof XSLFChart) {
|
||||||
|
chartMap.put(c.getPackagePart().getPartName().getName(), (XSLFChart) c);
|
||||||
|
}
|
||||||
|
}
|
||||||
} else if (p instanceof XSLFSlideMaster) {
|
} else if (p instanceof XSLFSlideMaster) {
|
||||||
masterMap.put(getRelationId(p), (XSLFSlideMaster) p);
|
masterMap.put(getRelationId(p), (XSLFSlideMaster) p);
|
||||||
} else if (p instanceof XSLFTableStyles){
|
} else if (p instanceof XSLFTableStyles){
|
||||||
@ -145,6 +153,11 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_charts = new ArrayList<>(chartMap.size());
|
||||||
|
for(XSLFChart chart : chartMap.values()) {
|
||||||
|
_charts.add(chart);
|
||||||
|
}
|
||||||
|
|
||||||
_masters = new ArrayList<>(masterMap.size());
|
_masters = new ArrayList<>(masterMap.size());
|
||||||
for (CTSlideMasterIdListEntry masterId : _presentation.getSldMasterIdLst().getSldMasterIdList()) {
|
for (CTSlideMasterIdListEntry masterId : _presentation.getSldMasterIdLst().getSldMasterIdList()) {
|
||||||
XSLFSlideMaster master = masterMap.get(masterId.getId2());
|
XSLFSlideMaster master = masterMap.get(masterId.getId2());
|
||||||
@ -208,6 +221,7 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
public XSLFSlide createSlide(XSLFSlideLayout layout) {
|
public XSLFSlide createSlide(XSLFSlideLayout layout) {
|
||||||
int slideNumber = 256, cnt = 1;
|
int slideNumber = 256, cnt = 1;
|
||||||
CTSlideIdList slideList;
|
CTSlideIdList slideList;
|
||||||
|
XSLFRelation relationType = XSLFRelation.SLIDE;
|
||||||
if (!_presentation.isSetSldIdLst()) {
|
if (!_presentation.isSetSldIdLst()) {
|
||||||
slideList = _presentation.addNewSldIdLst();
|
slideList = _presentation.addNewSldIdLst();
|
||||||
} else {
|
} else {
|
||||||
@ -217,35 +231,11 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
cnt++;
|
cnt++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bug 55791: We also need to check that the resulting file name is not already taken
|
cnt = findNextAvailableFileNameIndex(relationType, cnt);
|
||||||
// this can happen when removing/adding slides
|
|
||||||
while(true) {
|
|
||||||
String slideName = XSLFRelation.SLIDE.getFileName(cnt);
|
|
||||||
boolean found = false;
|
|
||||||
for (POIXMLDocumentPart relation : getRelations()) {
|
|
||||||
if (relation.getPackagePart() != null &&
|
|
||||||
slideName.equals(relation.getPackagePart().getPartName().getName())) {
|
|
||||||
// name is taken => try next one
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!found &&
|
RelationPart rp = createRelationship
|
||||||
getPackage().getPartsByName(Pattern.compile(Pattern.quote(slideName))).size() > 0) {
|
(relationType, XSLFFactory.getInstance(), cnt, false);
|
||||||
// name is taken => try next one
|
|
||||||
found = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!found) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
cnt++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RelationPart rp = createRelationship(
|
|
||||||
XSLFRelation.SLIDE, XSLFFactory.getInstance(), cnt, false);
|
|
||||||
XSLFSlide slide = rp.getDocumentPart();
|
XSLFSlide slide = rp.getDocumentPart();
|
||||||
|
|
||||||
CTSlideIdListEntry slideId = slideList.addNewSldId();
|
CTSlideIdListEntry slideId = slideList.addNewSldId();
|
||||||
@ -260,6 +250,35 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
return slide;
|
return slide;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int findNextAvailableFileNameIndex(XSLFRelation relationType, int idx) {
|
||||||
|
// Bug 55791: We also need to check that the resulting file name is not already taken
|
||||||
|
// this can happen when removing/adding slides, notes or charts
|
||||||
|
while(true) {
|
||||||
|
String fileName = relationType.getFileName(idx);
|
||||||
|
boolean found = false;
|
||||||
|
for (POIXMLDocumentPart relation : getRelations()) {
|
||||||
|
if (relation.getPackagePart() != null &&
|
||||||
|
fileName.equals(relation.getPackagePart().getPartName().getName())) {
|
||||||
|
// name is taken => try next one
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!found &&
|
||||||
|
getPackage().getPartsByName(Pattern.compile(Pattern.quote(fileName))).size() > 0) {
|
||||||
|
// name is taken => try next one
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
return idx;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a blank slide using the default (first) master.
|
* Create a blank slide using the default (first) master.
|
||||||
*/
|
*/
|
||||||
@ -279,6 +298,23 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
return createSlide(layout);
|
return createSlide(layout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a blank chart on the given slide.
|
||||||
|
*/
|
||||||
|
public XSLFChart createChart(XSLFSlide slide) {
|
||||||
|
int chartIdx = findNextAvailableFileNameIndex(XSLFRelation.CHART, _charts.size() + 1);
|
||||||
|
XSLFChart chart = (XSLFChart) createRelationship(XSLFRelation.CHART, XSLFFactory.getInstance(), chartIdx, true).getDocumentPart();
|
||||||
|
slide.addRelation(null, XSLFRelation.CHART, chart);
|
||||||
|
createWorkbookRelationship(chart, chartIdx);
|
||||||
|
_charts.add(chart);
|
||||||
|
return chart;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected PackageRelationship createWorkbookRelationship(XSLFChart chart, int chartIdx) {
|
||||||
|
POIXMLDocumentPart worksheet = createRelationship(XSLFChart.WORKBOOK_RELATIONSHIP, XSLFFactory.getInstance(), chartIdx, true).getDocumentPart();
|
||||||
|
return chart.addRelation(null, XSLFChart.WORKBOOK_RELATIONSHIP, worksheet).getRelationship();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return notes slide for the specified slide or create new if it does not exist yet.
|
* Return notes slide for the specified slide or create new if it does not exist yet.
|
||||||
*/
|
*/
|
||||||
@ -301,39 +337,16 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
createNotesMaster();
|
createNotesMaster();
|
||||||
}
|
}
|
||||||
|
|
||||||
Integer slideIndex = XSLFRelation.SLIDE.getFileNameIndex(slide);
|
int slideIndex = XSLFRelation.SLIDE.getFileNameIndex(slide);
|
||||||
|
|
||||||
// Bug 55791: We also need to check that the resulting file name is not already taken
|
XSLFRelation relationType = XSLFRelation.NOTES;
|
||||||
// this can happen when removing/adding slides
|
slideIndex = findNextAvailableFileNameIndex(relationType, slideIndex);
|
||||||
while(true) {
|
|
||||||
String slideName = XSLFRelation.NOTES.getFileName(slideIndex);
|
|
||||||
boolean found = false;
|
|
||||||
for (POIXMLDocumentPart relation : getRelations()) {
|
|
||||||
if (relation.getPackagePart() != null &&
|
|
||||||
slideName.equals(relation.getPackagePart().getPartName().getName())) {
|
|
||||||
// name is taken => try next one
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!found &&
|
|
||||||
getPackage().getPartsByName(Pattern.compile(Pattern.quote(slideName))).size() > 0) {
|
|
||||||
// name is taken => try next one
|
|
||||||
found = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!found) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
slideIndex++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// add notes slide to presentation
|
// add notes slide to presentation
|
||||||
XSLFNotes notesSlide = (XSLFNotes) createRelationship
|
XSLFNotes notesSlide = (XSLFNotes) createRelationship
|
||||||
(XSLFRelation.NOTES, XSLFFactory.getInstance(), slideIndex);
|
(relationType, XSLFFactory.getInstance(), slideIndex);
|
||||||
// link slide and notes slide with each other
|
// link slide and notes slide with each other
|
||||||
slide.addRelation(null, XSLFRelation.NOTES, notesSlide);
|
slide.addRelation(null, relationType, notesSlide);
|
||||||
notesSlide.addRelation(null, XSLFRelation.NOTES_MASTER, _notesMaster);
|
notesSlide.addRelation(null, XSLFRelation.NOTES_MASTER, _notesMaster);
|
||||||
notesSlide.addRelation(null, XSLFRelation.SLIDE, slide);
|
notesSlide.addRelation(null, XSLFRelation.SLIDE, slide);
|
||||||
|
|
||||||
@ -404,6 +417,13 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
return _slides;
|
return _slides;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return all the charts in the slideshow
|
||||||
|
*/
|
||||||
|
public List<XSLFChart> getCharts() {
|
||||||
|
return _charts;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the list of comment authors, if there is one.
|
* Returns the list of comment authors, if there is one.
|
||||||
* Will only be present if at least one slide has comments on it.
|
* Will only be present if at least one slide has comments on it.
|
||||||
@ -445,6 +465,16 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
XSLFSlide slide = _slides.remove(index);
|
XSLFSlide slide = _slides.remove(index);
|
||||||
removeRelation(slide);
|
removeRelation(slide);
|
||||||
_presentation.getSldIdLst().removeSldId(index);
|
_presentation.getSldIdLst().removeSldId(index);
|
||||||
|
for (POIXMLDocumentPart p : slide.getRelations()) {
|
||||||
|
if (p instanceof XSLFChart) {
|
||||||
|
XSLFChart chart = (XSLFChart) p;
|
||||||
|
slide.removeChartRelation(chart);
|
||||||
|
_charts.remove(chart);
|
||||||
|
} else if (p instanceof XSLFSlideLayout) {
|
||||||
|
XSLFSlideLayout layout = (XSLFSlideLayout) p;
|
||||||
|
slide.removeLayoutRelation(layout);
|
||||||
|
}
|
||||||
|
}
|
||||||
return slide;
|
return slide;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,15 +26,28 @@ import java.io.OutputStream;
|
|||||||
|
|
||||||
import javax.xml.namespace.QName;
|
import javax.xml.namespace.QName;
|
||||||
|
|
||||||
|
import org.apache.poi.POIXMLDocument;
|
||||||
import org.apache.poi.POIXMLDocumentPart;
|
import org.apache.poi.POIXMLDocumentPart;
|
||||||
|
import org.apache.poi.POIXMLException;
|
||||||
|
import org.apache.poi.POIXMLRelation;
|
||||||
|
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
||||||
|
import org.apache.poi.openxml4j.exceptions.NotOfficeXmlFileException;
|
||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||||
|
import org.apache.poi.ss.util.CellRangeAddress;
|
||||||
|
import org.apache.poi.ss.util.CellReference;
|
||||||
import org.apache.poi.util.Beta;
|
import org.apache.poi.util.Beta;
|
||||||
import org.apache.poi.util.Internal;
|
import org.apache.poi.xddf.usermodel.chart.XDDFChart;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFDataSource;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFRow;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
import org.apache.xmlbeans.XmlException;
|
import org.apache.xmlbeans.XmlException;
|
||||||
import org.apache.xmlbeans.XmlOptions;
|
import org.apache.xmlbeans.XmlOptions;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.ChartSpaceDocument;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTTitle;
|
||||||
|
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a Chart in a .pptx presentation
|
* Represents a Chart in a .pptx presentation
|
||||||
@ -42,20 +55,30 @@ import org.openxmlformats.schemas.drawingml.x2006.chart.ChartSpaceDocument;
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Beta
|
||||||
public final class XSLFChart extends POIXMLDocumentPart {
|
public final class XSLFChart extends XDDFChart {
|
||||||
|
protected static final POIXMLRelation WORKBOOK_RELATIONSHIP = new POIXMLRelation(
|
||||||
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||||||
|
POIXMLDocument.PACK_OBJECT_REL_TYPE,
|
||||||
|
"/ppt/embeddings/Microsoft_Excel_Worksheet#.xlsx",
|
||||||
|
XSSFWorkbook.class
|
||||||
|
){};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Root element of the Chart part
|
* Underlying workbook
|
||||||
*/
|
*/
|
||||||
private CTChartSpace chartSpace;
|
private XSSFWorkbook workbook;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Chart within that
|
* Construct a PresentationML chart.
|
||||||
*/
|
*/
|
||||||
private CTChart chart;
|
protected XSLFChart() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a chart from a package part.
|
* Construct a PresentationML chart from a package part.
|
||||||
*
|
*
|
||||||
* @param part the package part holding the chart data,
|
* @param part the package part holding the chart data,
|
||||||
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code>
|
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code>
|
||||||
@ -64,29 +87,123 @@ public final class XSLFChart extends POIXMLDocumentPart {
|
|||||||
*/
|
*/
|
||||||
protected XSLFChart(PackagePart part) throws IOException, XmlException {
|
protected XSLFChart(PackagePart part) throws IOException, XmlException {
|
||||||
super(part);
|
super(part);
|
||||||
|
|
||||||
chartSpace = ChartSpaceDocument.Factory.parse(part.getInputStream(), DEFAULT_XML_OPTIONS).getChartSpace();
|
|
||||||
chart = chartSpace.getChart();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public XSLFTextShape getTitle() {
|
||||||
* Return the underlying CTChartSpace bean, the root element of the Chart part.
|
if (!chart.isSetTitle()) {
|
||||||
*
|
chart.addNewTitle();
|
||||||
* @return the underlying CTChartSpace bean
|
}
|
||||||
*/
|
final CTTitle title = chart.getTitle();
|
||||||
@Internal
|
if (title.getTx() != null && title.getTx().isSetRich()) {
|
||||||
public CTChartSpace getCTChartSpace(){
|
return new XSLFTextShape(title, null) {
|
||||||
return chartSpace;
|
@Override
|
||||||
|
protected CTTextBody getTextBody(boolean create) {
|
||||||
|
return title.getTx().getRich();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return new XSLFTextShape(title, null) {
|
||||||
|
@Override
|
||||||
|
protected CTTextBody getTextBody(boolean create) {
|
||||||
|
return title.getTxPr();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public CellReference setSheetTitle(String title) {
|
||||||
* Return the underlying CTChart bean, within the Chart Space
|
XSSFSheet sheet = getSheet();
|
||||||
*
|
sheet.createRow(0).createCell(1).setCellValue(title);
|
||||||
* @return the underlying CTChart bean
|
return new CellReference(sheet.getSheetName(), 0, 1, true, true);
|
||||||
*/
|
}
|
||||||
@Internal
|
|
||||||
public CTChart getCTChart(){
|
public String formatRange(CellRangeAddress range) {
|
||||||
return chart;
|
return range.formatAsString(getSheet().getSheetName(), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private XSSFSheet getSheet() {
|
||||||
|
XSSFSheet sheet = null;
|
||||||
|
try {
|
||||||
|
sheet = getWorkbook().getSheetAt(0);
|
||||||
|
} catch (InvalidFormatException ife) {
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
}
|
||||||
|
return sheet;
|
||||||
|
}
|
||||||
|
|
||||||
|
private PackagePart getWorksheetPart() throws InvalidFormatException {
|
||||||
|
for (RelationPart part : getRelationParts()) {
|
||||||
|
if (WORKBOOK_RELATIONSHIP.getRelation().equals(part.getRelationship().getRelationshipType())) {
|
||||||
|
return getTargetPart(part.getRelationship());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected XSSFWorkbook getWorkbook() throws IOException, InvalidFormatException {
|
||||||
|
if (workbook == null) {
|
||||||
|
try {
|
||||||
|
PackagePart worksheetPart = getWorksheetPart();
|
||||||
|
if (worksheetPart == null) {
|
||||||
|
workbook = new XSSFWorkbook();
|
||||||
|
workbook.createSheet();
|
||||||
|
} else {
|
||||||
|
workbook = new XSSFWorkbook(worksheetPart.getInputStream());
|
||||||
|
}
|
||||||
|
} catch (NotOfficeXmlFileException e) {
|
||||||
|
workbook = new XSSFWorkbook();
|
||||||
|
workbook.createSheet();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return workbook;
|
||||||
|
}
|
||||||
|
|
||||||
|
private XMLSlideShow getSlideShow() {
|
||||||
|
POIXMLDocumentPart p = getParent();
|
||||||
|
while(p != null) {
|
||||||
|
if(p instanceof XMLSlideShow){
|
||||||
|
return (XMLSlideShow)p;
|
||||||
|
}
|
||||||
|
p = p.getParent();
|
||||||
|
}
|
||||||
|
throw new IllegalStateException("SlideShow was not found");
|
||||||
|
}
|
||||||
|
|
||||||
|
private PackagePart createWorksheetPart() throws InvalidFormatException {
|
||||||
|
Integer chartIdx = XSLFRelation.CHART.getFileNameIndex(this);
|
||||||
|
return getTargetPart(getSlideShow().createWorkbookRelationship(this, chartIdx));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void saveWorkbook(XSSFWorkbook workbook) throws IOException, InvalidFormatException {
|
||||||
|
PackagePart worksheetPart = getWorksheetPart();
|
||||||
|
if (worksheetPart == null) {
|
||||||
|
worksheetPart = createWorksheetPart();
|
||||||
|
}
|
||||||
|
try (OutputStream xlsOut = worksheetPart.getOutputStream()) {
|
||||||
|
workbook.write(xlsOut);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fillSheet(XSSFSheet sheet, XDDFDataSource<?> categoryData, XDDFNumericalDataSource<?> valuesData) {
|
||||||
|
int numOfPoints = categoryData.getPointCount();
|
||||||
|
for (int i = 0; i < numOfPoints; i++) {
|
||||||
|
XSSFRow row = sheet.createRow(i + 1); // first row is for title
|
||||||
|
row.createCell(0).setCellValue(categoryData.getPointAt(i).toString());
|
||||||
|
row.createCell(1).setCellValue(valuesData.getPointAt(i).doubleValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void plot(XDDFChartData data) {
|
||||||
|
super.plot(data);
|
||||||
|
XSSFSheet sheet = getSheet();
|
||||||
|
for(XDDFChartData.Series series : data.getSeries()) {
|
||||||
|
fillSheet(sheet, series.getCategoryData(), series.getValuesData());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void importContent(XSLFChart other) {
|
||||||
|
this.chart.set(other.chart);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -94,11 +211,17 @@ public final class XSLFChart extends POIXMLDocumentPart {
|
|||||||
XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
|
XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
|
||||||
xmlOptions.setSaveSyntheticDocumentElement(new QName(CTChartSpace.type.getName().getNamespaceURI(), "chartSpace", "c"));
|
xmlOptions.setSaveSyntheticDocumentElement(new QName(CTChartSpace.type.getName().getNamespaceURI(), "chartSpace", "c"));
|
||||||
|
|
||||||
PackagePart part = getPackagePart();
|
if (workbook != null) {
|
||||||
OutputStream out = part.getOutputStream();
|
try {
|
||||||
chartSpace.save(out, xmlOptions);
|
saveWorkbook(workbook);
|
||||||
out.close();
|
} catch (InvalidFormatException e) {
|
||||||
|
throw new POIXMLException(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PackagePart part = getPackagePart();
|
||||||
|
try (OutputStream out = part.getOutputStream()) {
|
||||||
|
chartSpace.save(out, xmlOptions);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
import java.awt.geom.Rectangle2D;
|
import java.awt.geom.Rectangle2D;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
import javax.xml.namespace.QName;
|
import javax.xml.namespace.QName;
|
||||||
|
|
||||||
@ -102,6 +103,7 @@ public class XSLFGraphicFrame extends XSLFShape implements GraphicalFrame<XSLFSh
|
|||||||
*
|
*
|
||||||
* @param theta the rotation angle in degrees.
|
* @param theta the rotation angle in degrees.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void setRotation(double theta){
|
public void setRotation(double theta){
|
||||||
throw new IllegalArgumentException("Operation not supported");
|
throw new IllegalArgumentException("Operation not supported");
|
||||||
}
|
}
|
||||||
@ -115,14 +117,17 @@ public class XSLFGraphicFrame extends XSLFShape implements GraphicalFrame<XSLFSh
|
|||||||
*
|
*
|
||||||
* @return rotation angle in degrees
|
* @return rotation angle in degrees
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public double getRotation(){
|
public double getRotation(){
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void setFlipHorizontal(boolean flip){
|
public void setFlipHorizontal(boolean flip){
|
||||||
throw new IllegalArgumentException("Operation not supported");
|
throw new IllegalArgumentException("Operation not supported");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void setFlipVertical(boolean flip){
|
public void setFlipVertical(boolean flip){
|
||||||
throw new IllegalArgumentException("Operation not supported");
|
throw new IllegalArgumentException("Operation not supported");
|
||||||
}
|
}
|
||||||
@ -132,10 +137,12 @@ public class XSLFGraphicFrame extends XSLFShape implements GraphicalFrame<XSLFSh
|
|||||||
*
|
*
|
||||||
* @return whether the shape is horizontally flipped
|
* @return whether the shape is horizontally flipped
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public boolean getFlipHorizontal(){
|
public boolean getFlipHorizontal(){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public boolean getFlipVertical(){
|
public boolean getFlipVertical(){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -148,12 +155,39 @@ public class XSLFGraphicFrame extends XSLFShape implements GraphicalFrame<XSLFSh
|
|||||||
String uri = data.getUri();
|
String uri = data.getUri();
|
||||||
if(uri.equals("http://schemas.openxmlformats.org/drawingml/2006/diagram")){
|
if(uri.equals("http://schemas.openxmlformats.org/drawingml/2006/diagram")){
|
||||||
copyDiagram(data, (XSLFGraphicFrame)sh);
|
copyDiagram(data, (XSLFGraphicFrame)sh);
|
||||||
|
} if(uri.equals("http://schemas.openxmlformats.org/drawingml/2006/chart")){
|
||||||
|
copyChart(data, (XSLFGraphicFrame)sh);
|
||||||
} else {
|
} else {
|
||||||
// TODO support other types of objects
|
// TODO support other types of objects
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void copyChart(CTGraphicalObjectData objData, XSLFGraphicFrame srcShape) {
|
||||||
|
XSLFSlide slide = (XSLFSlide) getSheet();
|
||||||
|
XSLFSheet src = srcShape.getSheet();
|
||||||
|
String xpath = "declare namespace c='http://schemas.openxmlformats.org/drawingml/2006/chart' c:chart";
|
||||||
|
XmlObject[] obj = objData.selectPath(xpath);
|
||||||
|
if (obj != null && obj.length == 1) {
|
||||||
|
XmlCursor c = obj[0].newCursor();
|
||||||
|
try {
|
||||||
|
// duplicate chart with embedded workbook
|
||||||
|
QName idQualifiedName = new QName("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "id");
|
||||||
|
String id = c.getAttributeText(idQualifiedName);
|
||||||
|
XSLFChart srcChart = (XSLFChart) src.getRelationById(id);
|
||||||
|
XSLFChart chartCopy = slide.getSlideShow().createChart(slide);
|
||||||
|
chartCopy.importContent(srcChart);
|
||||||
|
chartCopy.saveWorkbook(srcChart.getWorkbook());
|
||||||
|
c.setAttributeText(idQualifiedName, slide.getRelationId(chartCopy));
|
||||||
|
} catch (InvalidFormatException e) {
|
||||||
|
throw new POIXMLException(e);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new POIXMLException(e);
|
||||||
|
}
|
||||||
|
c.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TODO should be moved to a sub-class
|
// TODO should be moved to a sub-class
|
||||||
private void copyDiagram(CTGraphicalObjectData objData, XSLFGraphicFrame srcShape){
|
private void copyDiagram(CTGraphicalObjectData objData, XSLFGraphicFrame srcShape){
|
||||||
String xpath = "declare namespace dgm='http://schemas.openxmlformats.org/drawingml/2006/diagram' $this//dgm:relIds";
|
String xpath = "declare namespace dgm='http://schemas.openxmlformats.org/drawingml/2006/diagram' $this//dgm:relIds";
|
||||||
|
@ -356,28 +356,35 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
|
|||||||
* @return modified 'this'
|
* @return modified 'this'
|
||||||
*/
|
*/
|
||||||
public XSLFSheet importContent(XSLFSheet src){
|
public XSLFSheet importContent(XSLFSheet src){
|
||||||
_shapes = null;
|
|
||||||
_spTree = null;
|
_spTree = null;
|
||||||
_drawing = null;
|
|
||||||
_spTree = null;
|
|
||||||
_placeholders = null;
|
|
||||||
|
|
||||||
// fix-me: wth would this ever happen to work ...
|
|
||||||
|
|
||||||
|
|
||||||
// first copy the source xml
|
// first copy the source xml
|
||||||
getSpTree().set(src.getSpTree());
|
getSpTree().set(src.getSpTree().copy());
|
||||||
|
|
||||||
// recursively update each shape
|
wipeAndReinitialize(src, 0);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void wipeAndReinitialize(XSLFSheet src, int offset) {
|
||||||
|
// explicitly initialize drawing and shapes from _spTree
|
||||||
|
_shapes = null;
|
||||||
|
_drawing = null;
|
||||||
|
initDrawingAndShapes();
|
||||||
|
|
||||||
|
// placeholders will be implicitly initialized when requested
|
||||||
|
_placeholders = null;
|
||||||
|
|
||||||
|
// update each shape according to its own additional copy rules
|
||||||
List<XSLFShape> tgtShapes = getShapes();
|
List<XSLFShape> tgtShapes = getShapes();
|
||||||
List<XSLFShape> srcShapes = src.getShapes();
|
List<XSLFShape> srcShapes = src.getShapes();
|
||||||
for(int i = 0; i < tgtShapes.size(); i++){
|
for(int i = 0; i < srcShapes.size(); i++){
|
||||||
XSLFShape s1 = srcShapes.get(i);
|
XSLFShape s1 = srcShapes.get(i);
|
||||||
XSLFShape s2 = tgtShapes.get(i);
|
XSLFShape s2 = tgtShapes.get(offset + i);
|
||||||
|
|
||||||
s2.copy(s1);
|
s2.copy(s1);
|
||||||
}
|
}
|
||||||
return this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -387,39 +394,26 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
|
|||||||
* @return modified <code>this</code>.
|
* @return modified <code>this</code>.
|
||||||
*/
|
*/
|
||||||
public XSLFSheet appendContent(XSLFSheet src){
|
public XSLFSheet appendContent(XSLFSheet src){
|
||||||
CTGroupShape spTree = getSpTree();
|
|
||||||
int numShapes = getShapes().size();
|
int numShapes = getShapes().size();
|
||||||
|
CTGroupShape spTree = getSpTree();
|
||||||
CTGroupShape srcTree = src.getSpTree();
|
CTGroupShape srcTree = src.getSpTree();
|
||||||
|
|
||||||
for(XmlObject ch : srcTree.selectPath("*")){
|
for(XmlObject ch : srcTree.selectPath("*")){
|
||||||
if(ch instanceof CTShape){ // simple shape
|
if(ch instanceof CTShape){ // simple shape
|
||||||
spTree.addNewSp().set(ch);
|
spTree.addNewSp().set(ch.copy());
|
||||||
} else if (ch instanceof CTGroupShape){
|
} else if (ch instanceof CTGroupShape){
|
||||||
spTree.addNewGrpSp().set(ch);
|
spTree.addNewGrpSp().set(ch.copy());
|
||||||
} else if (ch instanceof CTConnector){
|
} else if (ch instanceof CTConnector){
|
||||||
spTree.addNewCxnSp().set(ch);
|
spTree.addNewCxnSp().set(ch.copy());
|
||||||
} else if (ch instanceof CTPicture){
|
} else if (ch instanceof CTPicture){
|
||||||
spTree.addNewPic().set(ch);
|
spTree.addNewPic().set(ch.copy());
|
||||||
} else if (ch instanceof CTGraphicalObjectFrame){
|
} else if (ch instanceof CTGraphicalObjectFrame){
|
||||||
spTree.addNewGraphicFrame().set(ch);
|
spTree.addNewGraphicFrame().set(ch.copy());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_shapes = null;
|
wipeAndReinitialize(src, numShapes);
|
||||||
_spTree = null;
|
|
||||||
_drawing = null;
|
|
||||||
_spTree = null;
|
|
||||||
_placeholders = null;
|
|
||||||
|
|
||||||
// recursively update each shape
|
|
||||||
List<XSLFShape> tgtShapes = getShapes();
|
|
||||||
List<XSLFShape> srcShapes = src.getShapes();
|
|
||||||
for(int i = 0; i < srcShapes.size(); i++){
|
|
||||||
XSLFShape s1 = srcShapes.get(i);
|
|
||||||
XSLFShape s2 = tgtShapes.get(numShapes + i);
|
|
||||||
|
|
||||||
s2.copy(s1);
|
|
||||||
}
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,6 +124,14 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
|
|||||||
return "sld";
|
return "sld";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void removeChartRelation(XSLFChart chart) {
|
||||||
|
removeRelation(chart);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void removeLayoutRelation(XSLFSlideLayout layout) {
|
||||||
|
removeRelation(layout, false);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public XSLFSlideLayout getMasterSheet(){
|
public XSLFSlideLayout getMasterSheet(){
|
||||||
return getSlideLayout();
|
return getSlideLayout();
|
||||||
|
@ -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,22 +64,15 @@ import org.w3c.dom.Text;
|
|||||||
/**
|
/**
|
||||||
* Represents a SpreadsheetML Chart
|
* Represents a SpreadsheetML Chart
|
||||||
*/
|
*/
|
||||||
public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartAxisFactory {
|
public final class XSSFChart extends XDDFChart implements Chart, ChartAxisFactory {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parent graphic frame.
|
* Parent graphic frame.
|
||||||
*/
|
*/
|
||||||
private XSSFGraphicFrame frame;
|
private XSSFGraphicFrame frame;
|
||||||
|
|
||||||
/**
|
@Deprecated
|
||||||
* Root element of the SpreadsheetML Chart part
|
@Removal(version="4.2")
|
||||||
*/
|
|
||||||
private CTChartSpace chartSpace;
|
|
||||||
/**
|
|
||||||
* The Chart within that
|
|
||||||
*/
|
|
||||||
private CTChart chart;
|
|
||||||
|
|
||||||
List<XSSFChartAxis> axis = new ArrayList<>();
|
List<XSSFChartAxis> axis = new ArrayList<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -97,26 +86,21 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
|
|||||||
/**
|
/**
|
||||||
* Construct a SpreadsheetML chart from a package part.
|
* Construct a SpreadsheetML chart from a package part.
|
||||||
*
|
*
|
||||||
* @param part the package part holding the chart data,
|
* @param part
|
||||||
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code>
|
* the package part holding the chart data, the content type must be
|
||||||
|
* <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code>
|
||||||
*
|
*
|
||||||
* @since POI 3.14-Beta1
|
* @since POI 3.14-Beta1
|
||||||
*/
|
*/
|
||||||
protected XSSFChart(PackagePart part) throws IOException, XmlException {
|
protected XSSFChart(PackagePart part) throws IOException, XmlException {
|
||||||
super(part);
|
super(part);
|
||||||
|
|
||||||
chartSpace = ChartSpaceDocument.Factory.parse(part.getInputStream(), DEFAULT_XML_OPTIONS).getChartSpace();
|
|
||||||
chart = chartSpace.getChart();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a new CTChartSpace bean.
|
* Construct a new CTChartSpace bean. By default, it's just an empty placeholder for chart objects.
|
||||||
* By default, it's just an empty placeholder for chart objects.
|
|
||||||
*/
|
*/
|
||||||
private void createChart() {
|
private void createChart() {
|
||||||
chartSpace = CTChartSpace.Factory.newInstance();
|
CTPlotArea plotArea = getCTPlotArea();
|
||||||
chart = chartSpace.addNewChart();
|
|
||||||
CTPlotArea plotArea = chart.addNewPlotArea();
|
|
||||||
|
|
||||||
plotArea.addNewLayout();
|
plotArea.addNewLayout();
|
||||||
chart.addNewPlotVisOnly().setVal(true);
|
chart.addNewPlotVisOnly().setVal(true);
|
||||||
@ -134,47 +118,27 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
|
|||||||
printSettings.addNewPageSetup();
|
printSettings.addNewPageSetup();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the underlying CTChartSpace bean, the root element of the SpreadsheetML Chart part.
|
|
||||||
*
|
|
||||||
* @return the underlying CTChartSpace bean
|
|
||||||
*/
|
|
||||||
@Internal
|
|
||||||
public CTChartSpace getCTChartSpace(){
|
|
||||||
return chartSpace;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the underlying CTChart bean, within the Chart Space
|
|
||||||
*
|
|
||||||
* @return the underlying CTChart bean
|
|
||||||
*/
|
|
||||||
@Internal
|
|
||||||
public CTChart getCTChart(){
|
|
||||||
return chart;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void commit() throws IOException {
|
protected void commit() throws IOException {
|
||||||
XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
|
XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Saved chart space must have the following namespaces set:
|
* Saved chart space must have the following namespaces set: <c:chartSpace
|
||||||
<c:chartSpace
|
* xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart"
|
||||||
xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart"
|
* xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r=
|
||||||
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
|
* "http://schemas.openxmlformats.org/officeDocument/2006/relationships">
|
||||||
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
|
|
||||||
*/
|
*/
|
||||||
xmlOptions.setSaveSyntheticDocumentElement(new QName(CTChartSpace.type.getName().getNamespaceURI(), "chartSpace", "c"));
|
xmlOptions.setSaveSyntheticDocumentElement(new QName(CTChartSpace.type.getName().getNamespaceURI(), "chartSpace", "c"));
|
||||||
|
|
||||||
PackagePart part = getPackagePart();
|
PackagePart part = getPackagePart();
|
||||||
OutputStream out = part.getOutputStream();
|
try (OutputStream out = part.getOutputStream()) {
|
||||||
chartSpace.save(out, xmlOptions);
|
chartSpace.save(out, xmlOptions);
|
||||||
out.close();
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the parent graphic frame.
|
* Returns the parent graphic frame.
|
||||||
|
*
|
||||||
* @return the graphic frame this chart belongs to
|
* @return the graphic frame this chart belongs to
|
||||||
*/
|
*/
|
||||||
public XSSFGraphicFrame getGraphicFrame() {
|
public XSSFGraphicFrame getGraphicFrame() {
|
||||||
@ -188,19 +152,31 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
|
|||||||
this.frame = frame;
|
this.frame = frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public XSSFChartDataFactory getChartDataFactory() {
|
public XSSFChartDataFactory getChartDataFactory() {
|
||||||
return XSSFChartDataFactory.getInstance();
|
return XSSFChartDataFactory.getInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public XSSFChart getChartAxisFactory() {
|
public XSSFChart getChartAxisFactory() {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public void plot(ChartData data, ChartAxis... chartAxis) {
|
public void plot(ChartData data, ChartAxis... chartAxis) {
|
||||||
data.fillChart(this, chartAxis);
|
data.fillChart(this, chartAxis);
|
||||||
}
|
}
|
||||||
|
|
||||||
public XSSFValueAxis createValueAxis(AxisPosition pos) {
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
|
public XSSFValueAxis createValueAxis(org.apache.poi.ss.usermodel.charts.AxisPosition pos) {
|
||||||
long id = axis.size() + 1;
|
long id = axis.size() + 1;
|
||||||
XSSFValueAxis valueAxis = new XSSFValueAxis(this, id, pos);
|
XSSFValueAxis valueAxis = new XSSFValueAxis(this, id, pos);
|
||||||
if (axis.size() == 1) {
|
if (axis.size() == 1) {
|
||||||
@ -212,7 +188,10 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
|
|||||||
return valueAxis;
|
return valueAxis;
|
||||||
}
|
}
|
||||||
|
|
||||||
public XSSFCategoryAxis createCategoryAxis(AxisPosition pos) {
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
|
public XSSFCategoryAxis createCategoryAxis(org.apache.poi.ss.usermodel.charts.AxisPosition pos) {
|
||||||
long id = axis.size() + 1;
|
long id = axis.size() + 1;
|
||||||
XSSFCategoryAxis categoryAxis = new XSSFCategoryAxis(this, id, pos);
|
XSSFCategoryAxis categoryAxis = new XSSFCategoryAxis(this, id, pos);
|
||||||
if (axis.size() == 1) {
|
if (axis.size() == 1) {
|
||||||
@ -224,7 +203,10 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
|
|||||||
return categoryAxis;
|
return categoryAxis;
|
||||||
}
|
}
|
||||||
|
|
||||||
public XSSFDateAxis createDateAxis(AxisPosition pos) {
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
|
public XSSFDateAxis createDateAxis(org.apache.poi.ss.usermodel.charts.AxisPosition pos) {
|
||||||
long id = axis.size() + 1;
|
long id = axis.size() + 1;
|
||||||
XSSFDateAxis dateAxis = new XSSFDateAxis(this, id, pos);
|
XSSFDateAxis dateAxis = new XSSFDateAxis(this, id, pos);
|
||||||
if (axis.size() == 1) {
|
if (axis.size() == 1) {
|
||||||
@ -236,6 +218,12 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
|
|||||||
return dateAxis;
|
return dateAxis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated use {@link getAxes} instead
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public List<? extends XSSFChartAxis> getAxis() {
|
public List<? extends XSSFChartAxis> getAxis() {
|
||||||
if (axis.isEmpty() && hasAxis()) {
|
if (axis.isEmpty() && hasAxis()) {
|
||||||
parseAxis();
|
parseAxis();
|
||||||
@ -243,26 +231,13 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
|
|||||||
return axis;
|
return axis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public XSSFManualLayout getManualLayout() {
|
public XSSFManualLayout getManualLayout() {
|
||||||
return new XSSFManualLayout(this);
|
return new XSSFManualLayout(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if only visible cells will be present on the chart,
|
|
||||||
* false otherwise
|
|
||||||
*/
|
|
||||||
public boolean isPlotOnlyVisibleCells() {
|
|
||||||
return chart.getPlotVisOnly().getVal();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param plotVisOnly a flag specifying if only visible cells should be
|
|
||||||
* present on the chart
|
|
||||||
*/
|
|
||||||
public void setPlotOnlyVisibleCells(boolean plotVisOnly) {
|
|
||||||
chart.getPlotVisOnly().setVal(plotVisOnly);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the title static text, or null if none is set.
|
* Returns the title static text, or null if none is set.
|
||||||
* Note that a title formula may be set instead.
|
* Note that a title formula may be set instead.
|
||||||
@ -295,8 +270,8 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
|
|||||||
StringBuilder text = new StringBuilder(64);
|
StringBuilder text = new StringBuilder(64);
|
||||||
XmlObject[] t = title
|
XmlObject[] t = title
|
||||||
.selectPath("declare namespace a='"+XSSFDrawing.NAMESPACE_A+"' .//a:t");
|
.selectPath("declare namespace a='"+XSSFDrawing.NAMESPACE_A+"' .//a:t");
|
||||||
for (int m = 0; m < t.length; m++) {
|
for (XmlObject element : t) {
|
||||||
NodeList kids = t[m].getDomNode().getChildNodes();
|
NodeList kids = element.getDomNode().getChildNodes();
|
||||||
final int count = kids.getLength();
|
final int count = kids.getLength();
|
||||||
for (int n = 0; n < count; n++) {
|
for (int n = 0; n < count; n++) {
|
||||||
Node kid = kids.item(n);
|
Node kid = kids.item(n);
|
||||||
@ -315,14 +290,16 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
|
|||||||
* @deprecated POI 3.16, use {@link #setTitleText(String)} instead.
|
* @deprecated POI 3.16, use {@link #setTitleText(String)} instead.
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
@Removal(version="4.0")
|
@Removal(version = "4.0")
|
||||||
public void setTitle(String newTitle) {
|
public void setTitle(String newTitle) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the title text as a static string.
|
* Sets the title text as a static string.
|
||||||
* @param newTitle to use
|
*
|
||||||
|
* @param newTitle
|
||||||
|
* to use
|
||||||
*/
|
*/
|
||||||
public void setTitleText(String newTitle) {
|
public void setTitleText(String newTitle) {
|
||||||
CTTitle ctTitle;
|
CTTitle ctTitle;
|
||||||
@ -348,7 +325,8 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
|
|||||||
rich = tx.getRich();
|
rich = tx.getRich();
|
||||||
} else {
|
} else {
|
||||||
rich = tx.addNewRich();
|
rich = tx.addNewRich();
|
||||||
rich.addNewBodyPr(); // body properties must exist (but can be empty)
|
rich.addNewBodyPr(); // body properties must exist (but can be
|
||||||
|
// empty)
|
||||||
}
|
}
|
||||||
|
|
||||||
CTTextParagraph para;
|
CTTextParagraph para;
|
||||||
@ -372,22 +350,23 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the chart title formula expression if there is one
|
* Get the chart title formula expression if there is one
|
||||||
|
*
|
||||||
* @return formula expression or null
|
* @return formula expression or null
|
||||||
*/
|
*/
|
||||||
public String getTitleFormula() {
|
public String getTitleFormula() {
|
||||||
if(! chart.isSetTitle()) {
|
if (!chart.isSetTitle()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
CTTitle title = chart.getTitle();
|
CTTitle title = chart.getTitle();
|
||||||
|
|
||||||
if (! title.isSetTx()) {
|
if (!title.isSetTx()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
CTTx tx = title.getTx();
|
CTTx tx = title.getTx();
|
||||||
|
|
||||||
if (! tx.isSetStrRef()) {
|
if (!tx.isSetStrRef()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -396,6 +375,7 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the formula expression to use for the chart title
|
* Set the formula expression to use for the chart title
|
||||||
|
*
|
||||||
* @param formula
|
* @param formula
|
||||||
*/
|
*/
|
||||||
public void setTitleFormula(String formula) {
|
public void setTitleFormula(String formula) {
|
||||||
@ -427,26 +407,23 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
|
|||||||
strRef.setF(formula);
|
strRef.setF(formula);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public XSSFChartLegend getOrCreateLegend() {
|
public XSSFChartLegend getOrCreateLegend() {
|
||||||
return new XSSFChartLegend(this);
|
return new XSSFChartLegend(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void deleteLegend() {
|
@Deprecated
|
||||||
if (chart.isSetLegend()) {
|
@Removal(version="4.2")
|
||||||
chart.unsetLegend();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean hasAxis() {
|
private boolean hasAxis() {
|
||||||
CTPlotArea ctPlotArea = chart.getPlotArea();
|
CTPlotArea ctPlotArea = chart.getPlotArea();
|
||||||
int totalAxisCount =
|
int totalAxisCount = ctPlotArea.sizeOfValAxArray() + ctPlotArea.sizeOfCatAxArray() + ctPlotArea.sizeOfDateAxArray() + ctPlotArea.sizeOfSerAxArray();
|
||||||
ctPlotArea.sizeOfValAxArray() +
|
|
||||||
ctPlotArea.sizeOfCatAxArray() +
|
|
||||||
ctPlotArea.sizeOfDateAxArray() +
|
|
||||||
ctPlotArea.sizeOfSerAxArray();
|
|
||||||
return totalAxisCount > 0;
|
return totalAxisCount > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
private void parseAxis() {
|
private void parseAxis() {
|
||||||
// TODO: add other axis types
|
// TODO: add other axis types
|
||||||
parseCategoryAxis();
|
parseCategoryAxis();
|
||||||
@ -454,18 +431,24 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
|
|||||||
parseValueAxis();
|
parseValueAxis();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
private void parseCategoryAxis() {
|
private void parseCategoryAxis() {
|
||||||
for (CTCatAx catAx : chart.getPlotArea().getCatAxArray()) {
|
for (CTCatAx catAx : chart.getPlotArea().getCatAxArray()) {
|
||||||
axis.add(new XSSFCategoryAxis(this, catAx));
|
axis.add(new XSSFCategoryAxis(this, catAx));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
private void parseDateAxis() {
|
private void parseDateAxis() {
|
||||||
for (CTDateAx dateAx : chart.getPlotArea().getDateAxArray()) {
|
for (CTDateAx dateAx : chart.getPlotArea().getDateAxArray()) {
|
||||||
axis.add(new XSSFDateAxis(this, dateAx));
|
axis.add(new XSSFDateAxis(this, dateAx));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
private void parseValueAxis() {
|
private void parseValueAxis() {
|
||||||
for (CTValAx valAx : chart.getPlotArea().getValAxArray()) {
|
for (CTValAx valAx : chart.getPlotArea().getValAxArray()) {
|
||||||
axis.add(new XSSFValueAxis(this, valAx));
|
axis.add(new XSSFValueAxis(this, valAx));
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -17,13 +17,14 @@
|
|||||||
|
|
||||||
package org.apache.poi.xssf.usermodel.charts;
|
package org.apache.poi.xssf.usermodel.charts;
|
||||||
|
|
||||||
import org.apache.poi.ss.usermodel.charts.*;
|
import org.apache.poi.ss.usermodel.charts.ChartDataFactory;
|
||||||
import org.apache.poi.util.Beta;
|
import org.apache.poi.util.Removal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Roman Kashitsyn
|
* @deprecated
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public class XSSFChartDataFactory implements ChartDataFactory {
|
public class XSSFChartDataFactory implements ChartDataFactory {
|
||||||
|
|
||||||
private static XSSFChartDataFactory instance;
|
private static XSSFChartDataFactory instance;
|
||||||
@ -35,6 +36,7 @@ public class XSSFChartDataFactory implements ChartDataFactory {
|
|||||||
/**
|
/**
|
||||||
* @return new scatter charts data instance
|
* @return new scatter charts data instance
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public XSSFScatterChartData createScatterChartData() {
|
public XSSFScatterChartData createScatterChartData() {
|
||||||
return new XSSFScatterChartData();
|
return new XSSFScatterChartData();
|
||||||
}
|
}
|
||||||
@ -42,6 +44,7 @@ public class XSSFChartDataFactory implements ChartDataFactory {
|
|||||||
/**
|
/**
|
||||||
* @return new line charts data instance
|
* @return new line charts data instance
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public XSSFLineChartData createLineChartData() {
|
public XSSFLineChartData createLineChartData() {
|
||||||
return new XSSFLineChartData();
|
return new XSSFLineChartData();
|
||||||
}
|
}
|
||||||
|
@ -17,10 +17,11 @@
|
|||||||
|
|
||||||
package org.apache.poi.xssf.usermodel.charts;
|
package org.apache.poi.xssf.usermodel.charts;
|
||||||
|
|
||||||
import org.apache.poi.util.Beta;
|
|
||||||
import org.apache.poi.util.Internal;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartLegend;
|
import org.apache.poi.ss.usermodel.charts.ChartLegend;
|
||||||
import org.apache.poi.ss.usermodel.charts.LegendPosition;
|
import org.apache.poi.ss.usermodel.charts.LegendPosition;
|
||||||
|
import org.apache.poi.util.Internal;
|
||||||
|
import org.apache.poi.util.Removal;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFChart;
|
import org.apache.poi.xssf.usermodel.XSSFChart;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLegend;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLegend;
|
||||||
@ -29,10 +30,10 @@ import org.openxmlformats.schemas.drawingml.x2006.chart.STLegendPos;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a SpreadsheetML chart legend
|
* Represents a SpreadsheetML chart legend
|
||||||
* @author Roman Kashitsyn
|
* @deprecated use {@link XDDFChartLegend} instead
|
||||||
* @author Martin Andersson
|
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Deprecated
|
||||||
|
@Removal(version="4.2")
|
||||||
public final class XSSFChartLegend implements ChartLegend {
|
public final class XSSFChartLegend implements ChartLegend {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -72,6 +73,7 @@ public final class XSSFChartLegend implements ChartLegend {
|
|||||||
return legend;
|
return legend;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void setPosition(LegendPosition position) {
|
public void setPosition(LegendPosition position) {
|
||||||
if (!legend.isSetLegendPos()) {
|
if (!legend.isSetLegendPos()) {
|
||||||
legend.addNewLegendPos();
|
legend.addNewLegendPos();
|
||||||
@ -82,6 +84,7 @@ public final class XSSFChartLegend implements ChartLegend {
|
|||||||
/*
|
/*
|
||||||
* According to ECMA-376 default position is RIGHT.
|
* According to ECMA-376 default position is RIGHT.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public LegendPosition getPosition() {
|
public LegendPosition getPosition() {
|
||||||
if (legend.isSetLegendPos()) {
|
if (legend.isSetLegendPos()) {
|
||||||
return toLegendPosition(legend.getLegendPos());
|
return toLegendPosition(legend.getLegendPos());
|
||||||
@ -90,6 +93,7 @@ public final class XSSFChartLegend implements ChartLegend {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public XSSFManualLayout getManualLayout() {
|
public XSSFManualLayout getManualLayout() {
|
||||||
if (!legend.isSetLayout()) {
|
if (!legend.isSetLayout()) {
|
||||||
legend.addNewLayout();
|
legend.addNewLayout();
|
||||||
@ -97,10 +101,12 @@ public final class XSSFChartLegend implements ChartLegend {
|
|||||||
return new XSSFManualLayout(legend.getLayout());
|
return new XSSFManualLayout(legend.getLayout());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public boolean isOverlay() {
|
public boolean isOverlay() {
|
||||||
return legend.getOverlay().getVal();
|
return legend.getOverlay().getVal();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void setOverlay(boolean value) {
|
public void setOverlay(boolean value) {
|
||||||
legend.getOverlay().setVal(value);
|
legend.getOverlay().setVal(value);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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,6 +77,7 @@ public final class XSSFManualLayout implements ManualLayout {
|
|||||||
return layout;
|
return layout;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void setWidthRatio(double ratio) {
|
public void setWidthRatio(double ratio) {
|
||||||
if (!layout.isSetW()) {
|
if (!layout.isSetW()) {
|
||||||
layout.addNewW();
|
layout.addNewW();
|
||||||
@ -82,6 +85,7 @@ public final class XSSFManualLayout implements ManualLayout {
|
|||||||
layout.getW().setVal(ratio);
|
layout.getW().setVal(ratio);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public double getWidthRatio() {
|
public double getWidthRatio() {
|
||||||
if (!layout.isSetW()) {
|
if (!layout.isSetW()) {
|
||||||
return 0.0;
|
return 0.0;
|
||||||
@ -89,6 +93,7 @@ public final class XSSFManualLayout implements ManualLayout {
|
|||||||
return layout.getW().getVal();
|
return layout.getW().getVal();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void setHeightRatio(double ratio) {
|
public void setHeightRatio(double ratio) {
|
||||||
if (!layout.isSetH()) {
|
if (!layout.isSetH()) {
|
||||||
layout.addNewH();
|
layout.addNewH();
|
||||||
@ -96,6 +101,7 @@ public final class XSSFManualLayout implements ManualLayout {
|
|||||||
layout.getH().setVal(ratio);
|
layout.getH().setVal(ratio);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public double getHeightRatio() {
|
public double getHeightRatio() {
|
||||||
if (!layout.isSetH()) {
|
if (!layout.isSetH()) {
|
||||||
return 0.0;
|
return 0.0;
|
||||||
@ -103,6 +109,7 @@ public final class XSSFManualLayout implements ManualLayout {
|
|||||||
return layout.getH().getVal();
|
return layout.getH().getVal();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public LayoutTarget getTarget() {
|
public LayoutTarget getTarget() {
|
||||||
if (!layout.isSetLayoutTarget()) {
|
if (!layout.isSetLayoutTarget()) {
|
||||||
return defaultLayoutTarget;
|
return defaultLayoutTarget;
|
||||||
@ -110,6 +117,7 @@ public final class XSSFManualLayout implements ManualLayout {
|
|||||||
return toLayoutTarget(layout.getLayoutTarget());
|
return toLayoutTarget(layout.getLayoutTarget());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void setTarget(LayoutTarget target) {
|
public void setTarget(LayoutTarget target) {
|
||||||
if (!layout.isSetLayoutTarget()) {
|
if (!layout.isSetLayoutTarget()) {
|
||||||
layout.addNewLayoutTarget();
|
layout.addNewLayoutTarget();
|
||||||
@ -117,6 +125,7 @@ public final class XSSFManualLayout implements ManualLayout {
|
|||||||
layout.getLayoutTarget().setVal(fromLayoutTarget(target));
|
layout.getLayoutTarget().setVal(fromLayoutTarget(target));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public LayoutMode getXMode() {
|
public LayoutMode getXMode() {
|
||||||
if (!layout.isSetXMode()) {
|
if (!layout.isSetXMode()) {
|
||||||
return defaultLayoutMode;
|
return defaultLayoutMode;
|
||||||
@ -124,6 +133,7 @@ public final class XSSFManualLayout implements ManualLayout {
|
|||||||
return toLayoutMode(layout.getXMode());
|
return toLayoutMode(layout.getXMode());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void setXMode(LayoutMode mode) {
|
public void setXMode(LayoutMode mode) {
|
||||||
if (!layout.isSetXMode()) {
|
if (!layout.isSetXMode()) {
|
||||||
layout.addNewXMode();
|
layout.addNewXMode();
|
||||||
@ -131,6 +141,7 @@ public final class XSSFManualLayout implements ManualLayout {
|
|||||||
layout.getXMode().setVal(fromLayoutMode(mode));
|
layout.getXMode().setVal(fromLayoutMode(mode));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public LayoutMode getYMode() {
|
public LayoutMode getYMode() {
|
||||||
if (!layout.isSetYMode()) {
|
if (!layout.isSetYMode()) {
|
||||||
return defaultLayoutMode;
|
return defaultLayoutMode;
|
||||||
@ -138,6 +149,7 @@ public final class XSSFManualLayout implements ManualLayout {
|
|||||||
return toLayoutMode(layout.getYMode());
|
return toLayoutMode(layout.getYMode());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void setYMode(LayoutMode mode) {
|
public void setYMode(LayoutMode mode) {
|
||||||
if (!layout.isSetYMode()) {
|
if (!layout.isSetYMode()) {
|
||||||
layout.addNewYMode();
|
layout.addNewYMode();
|
||||||
@ -145,6 +157,7 @@ public final class XSSFManualLayout implements ManualLayout {
|
|||||||
layout.getYMode().setVal(fromLayoutMode(mode));
|
layout.getYMode().setVal(fromLayoutMode(mode));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public double getX() {
|
public double getX() {
|
||||||
if (!layout.isSetX()) {
|
if (!layout.isSetX()) {
|
||||||
return 0.0;
|
return 0.0;
|
||||||
@ -152,6 +165,7 @@ public final class XSSFManualLayout implements ManualLayout {
|
|||||||
return layout.getX().getVal();
|
return layout.getX().getVal();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void setX(double x) {
|
public void setX(double x) {
|
||||||
if (!layout.isSetX()) {
|
if (!layout.isSetX()) {
|
||||||
layout.addNewX();
|
layout.addNewX();
|
||||||
@ -159,6 +173,7 @@ public final class XSSFManualLayout implements ManualLayout {
|
|||||||
layout.getX().setVal(x);
|
layout.getX().setVal(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public double getY() {
|
public double getY() {
|
||||||
if (!layout.isSetY()) {
|
if (!layout.isSetY()) {
|
||||||
return 0.0;
|
return 0.0;
|
||||||
@ -166,6 +181,7 @@ public final class XSSFManualLayout implements ManualLayout {
|
|||||||
return layout.getY().getVal();
|
return layout.getY().getVal();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void setY(double y) {
|
public void setY(double y) {
|
||||||
if (!layout.isSetY()) {
|
if (!layout.isSetY()) {
|
||||||
layout.addNewY();
|
layout.addNewY();
|
||||||
@ -173,6 +189,7 @@ public final class XSSFManualLayout implements ManualLayout {
|
|||||||
layout.getY().setVal(y);
|
layout.getY().setVal(y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public LayoutMode getWidthMode() {
|
public LayoutMode getWidthMode() {
|
||||||
if (!layout.isSetWMode()) {
|
if (!layout.isSetWMode()) {
|
||||||
return defaultLayoutMode;
|
return defaultLayoutMode;
|
||||||
@ -180,6 +197,7 @@ public final class XSSFManualLayout implements ManualLayout {
|
|||||||
return toLayoutMode(layout.getWMode());
|
return toLayoutMode(layout.getWMode());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void setWidthMode(LayoutMode mode) {
|
public void setWidthMode(LayoutMode mode) {
|
||||||
if (!layout.isSetWMode()) {
|
if (!layout.isSetWMode()) {
|
||||||
layout.addNewWMode();
|
layout.addNewWMode();
|
||||||
@ -187,6 +205,7 @@ public final class XSSFManualLayout implements ManualLayout {
|
|||||||
layout.getWMode().setVal(fromLayoutMode(mode));
|
layout.getWMode().setVal(fromLayoutMode(mode));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public LayoutMode getHeightMode() {
|
public LayoutMode getHeightMode() {
|
||||||
if (!layout.isSetHMode()) {
|
if (!layout.isSetHMode()) {
|
||||||
return defaultLayoutMode;
|
return defaultLayoutMode;
|
||||||
@ -194,6 +213,7 @@ public final class XSSFManualLayout implements ManualLayout {
|
|||||||
return toLayoutMode(layout.getHMode());
|
return toLayoutMode(layout.getHMode());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void setHeightMode(LayoutMode mode) {
|
public void setHeightMode(LayoutMode mode) {
|
||||||
if (!layout.isSetHMode()) {
|
if (!layout.isSetHMode()) {
|
||||||
layout.addNewHMode();
|
layout.addNewHMode();
|
||||||
|
@ -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;
|
||||||
@ -69,34 +53,6 @@ public class XWPFChart extends POIXMLDocumentPart {
|
|||||||
*/
|
*/
|
||||||
protected XWPFChart(PackagePart part) throws IOException, XmlException {
|
protected XWPFChart(PackagePart part) throws IOException, XmlException {
|
||||||
super(part);
|
super(part);
|
||||||
|
|
||||||
chartSpace = ChartSpaceDocument.Factory.parse(part.getInputStream(), DEFAULT_XML_OPTIONS).getChartSpace();
|
|
||||||
chart = chartSpace.getChart();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDocumentRead() throws IOException {
|
|
||||||
super.onDocumentRead();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the underlying CTChartSpace bean, the root element of the Chart part.
|
|
||||||
*
|
|
||||||
* @return the underlying CTChartSpace bean
|
|
||||||
*/
|
|
||||||
@Internal
|
|
||||||
public CTChartSpace getCTChartSpace() {
|
|
||||||
return chartSpace;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the underlying CTChart bean, within the Chart Space
|
|
||||||
*
|
|
||||||
* @return the underlying CTChart bean
|
|
||||||
*/
|
|
||||||
@Internal
|
|
||||||
public CTChart getCTChart() {
|
|
||||||
return chart;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -120,7 +76,9 @@ public class XWPFChart extends POIXMLDocumentPart {
|
|||||||
throw new POIXMLException(e);
|
throw new POIXMLException(e);
|
||||||
} finally {
|
} finally {
|
||||||
try {
|
try {
|
||||||
if (is != null) is.close();
|
if (is != null) {
|
||||||
|
is.close();
|
||||||
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new POIXMLException(e);
|
throw new POIXMLException(e);
|
||||||
}
|
}
|
||||||
|
@ -63,7 +63,27 @@ import org.apache.xmlbeans.XmlCursor;
|
|||||||
import org.apache.xmlbeans.XmlException;
|
import org.apache.xmlbeans.XmlException;
|
||||||
import org.apache.xmlbeans.XmlObject;
|
import org.apache.xmlbeans.XmlObject;
|
||||||
import org.apache.xmlbeans.XmlOptions;
|
import org.apache.xmlbeans.XmlOptions;
|
||||||
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTComment;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDocument1;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFtnEdn;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTOnOff;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRow;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSdtBlock;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTStyles;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CommentsDocument;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.DocumentDocument;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.EndnotesDocument;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.FootnotesDocument;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.NumberingDocument;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STDocProtect;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STHdrFtr;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff;
|
||||||
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.StylesDocument;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>High(ish) level class for working with .docx files.</p>
|
* <p>High(ish) level class for working with .docx files.</p>
|
||||||
@ -186,8 +206,9 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
|||||||
}
|
}
|
||||||
docCursor.dispose();
|
docCursor.dispose();
|
||||||
// Sort out headers and footers
|
// Sort out headers and footers
|
||||||
if (doc.getDocument().getBody().getSectPr() != null)
|
if (doc.getDocument().getBody().getSectPr() != null) {
|
||||||
headerFooterPolicy = new XWPFHeaderFooterPolicy(this);
|
headerFooterPolicy = new XWPFHeaderFooterPolicy(this);
|
||||||
|
}
|
||||||
|
|
||||||
// Create for each XML-part in the Package a PartClass
|
// Create for each XML-part in the Package a PartClass
|
||||||
for (RelationPart rp : getRelationParts()) {
|
for (RelationPart rp : getRelationParts()) {
|
||||||
@ -224,7 +245,7 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
|||||||
} else if (relation.equals(XWPFRelation.CHART.getRelation())) {
|
} else if (relation.equals(XWPFRelation.CHART.getRelation())) {
|
||||||
//now we can use all methods to modify charts in XWPFDocument
|
//now we can use all methods to modify charts in XWPFDocument
|
||||||
XWPFChart chartData = (XWPFChart) p;
|
XWPFChart chartData = (XWPFChart) p;
|
||||||
chartData.onDocumentRead();
|
// chartData.onDocumentRead(); // ??? there is nothing to be done there!!!
|
||||||
charts.add(chartData);
|
charts.add(chartData);
|
||||||
} else if (relation.equals(XWPFRelation.GLOSSARY_DOCUMENT.getRelation())) {
|
} else if (relation.equals(XWPFRelation.GLOSSARY_DOCUMENT.getRelation())) {
|
||||||
// We don't currently process the glossary itself
|
// We don't currently process the glossary itself
|
||||||
@ -380,20 +401,25 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
|||||||
|
|
||||||
public XWPFHyperlink getHyperlinkByID(String id) {
|
public XWPFHyperlink getHyperlinkByID(String id) {
|
||||||
for (XWPFHyperlink link : hyperlinks) {
|
for (XWPFHyperlink link : hyperlinks) {
|
||||||
if (link.getId().equals(id))
|
if (link.getId().equals(id)) {
|
||||||
return link;
|
return link;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public XWPFFootnote getFootnoteByID(int id) {
|
public XWPFFootnote getFootnoteByID(int id) {
|
||||||
if (footnotes == null) return null;
|
if (footnotes == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
return footnotes.getFootnoteById(id);
|
return footnotes.getFootnoteById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public XWPFFootnote getEndnoteByID(int id) {
|
public XWPFFootnote getEndnoteByID(int id) {
|
||||||
if (endnotes == null) return null;
|
if (endnotes == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
return endnotes.get(id);
|
return endnotes.get(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -410,9 +436,10 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
|||||||
|
|
||||||
public XWPFComment getCommentByID(String id) {
|
public XWPFComment getCommentByID(String id) {
|
||||||
for (XWPFComment comment : comments) {
|
for (XWPFComment comment : comments) {
|
||||||
if (comment.getId().equals(id))
|
if (comment.getId().equals(id)) {
|
||||||
return comment;
|
return comment;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -667,9 +694,10 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
|||||||
cursor.toCursor(newParaPos);
|
cursor.toCursor(newParaPos);
|
||||||
while (cursor.toPrevSibling()) {
|
while (cursor.toPrevSibling()) {
|
||||||
o = cursor.getObject();
|
o = cursor.getObject();
|
||||||
if (o instanceof CTP || o instanceof CTTbl)
|
if (o instanceof CTP || o instanceof CTTbl) {
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
bodyElements.add(i, newP);
|
bodyElements.add(i, newP);
|
||||||
cursor.toCursor(newParaPos);
|
cursor.toCursor(newParaPos);
|
||||||
cursor.toEndToken();
|
cursor.toEndToken();
|
||||||
@ -706,9 +734,10 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
|||||||
cursor.toCursor(tableCursor);
|
cursor.toCursor(tableCursor);
|
||||||
while (cursor.toPrevSibling()) {
|
while (cursor.toPrevSibling()) {
|
||||||
o = cursor.getObject();
|
o = cursor.getObject();
|
||||||
if (o instanceof CTP || o instanceof CTTbl)
|
if (o instanceof CTP || o instanceof CTTbl) {
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
bodyElements.add(i, newT);
|
bodyElements.add(i, newT);
|
||||||
cursor.toCursor(tableCursor);
|
cursor.toCursor(tableCursor);
|
||||||
cursor.toEndToken();
|
cursor.toEndToken();
|
||||||
@ -1378,7 +1407,9 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
|||||||
throw new POIXMLException(e);
|
throw new POIXMLException(e);
|
||||||
} finally {
|
} finally {
|
||||||
try {
|
try {
|
||||||
if (out != null) out.close();
|
if (out != null) {
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
// ignore
|
// ignore
|
||||||
}
|
}
|
||||||
|
@ -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;
|
|
||||||
|
|
||||||
public class TestXSLFChart {
|
/**
|
||||||
|
|
||||||
/**
|
|
||||||
* a modified version from POI-examples
|
* a modified version from POI-examples
|
||||||
*/
|
*/
|
||||||
|
public class TestXSLFChart {
|
||||||
@Test
|
@Test
|
||||||
public void testFillChartTemplate() throws IOException {
|
public void testFillPieChartTemplate() throws IOException {
|
||||||
|
|
||||||
String chartTitle = "Apache POI"; // first line is chart title
|
|
||||||
|
|
||||||
XMLSlideShow pptx = XSLFTestDataSamples.openSampleDocument("pie-chart.pptx");
|
XMLSlideShow pptx = XSLFTestDataSamples.openSampleDocument("pie-chart.pptx");
|
||||||
XSLFSlide slide = pptx.getSlides().get(0);
|
XSLFChart chart = findChart(pptx.getSlides().get(0));
|
||||||
|
List<XDDFChartData> data = findChartData(chart);
|
||||||
|
|
||||||
|
XDDFPieChartData pie = (XDDFPieChartData) data.get(0);
|
||||||
|
XDDFPieChartData.Series firstSeries = (XDDFPieChartData.Series) pie.getSeries().get(0);
|
||||||
|
firstSeries.setExplosion(25);
|
||||||
|
assertEquals(25, firstSeries.getExplosion());
|
||||||
|
|
||||||
|
fillChartData(chart, pie);
|
||||||
|
pptx.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFillBarChartTemplate() throws IOException {
|
||||||
|
XMLSlideShow pptx = XSLFTestDataSamples.openSampleDocument("bar-chart.pptx");
|
||||||
|
XSLFSlide slide = pptx.getSlides().get(0);
|
||||||
|
// duplicate slide and chart before applying "destructive" tests to it
|
||||||
|
XSLFChart chart2 = findChart(pptx.createSlide().importContent(slide));
|
||||||
|
XSLFChart chart = findChart(slide);
|
||||||
|
|
||||||
|
List<XDDFChartData> data = findChartData(chart);
|
||||||
|
XDDFBarChartData bar = (XDDFBarChartData) data.get(0);
|
||||||
|
assertEquals(BarDirection.BAR, bar.getBarDirection());
|
||||||
|
assertEquals(BarGrouping.CLUSTERED, bar.getBarGrouping());
|
||||||
|
assertEquals(100, bar.getGapWidth());
|
||||||
|
fillChartData(chart, bar);
|
||||||
|
|
||||||
|
XDDFBarChartData column = (XDDFBarChartData) findChartData(chart2).get(0);
|
||||||
|
column.setBarDirection(BarDirection.COL);
|
||||||
|
assertEquals(BarDirection.COL, column.getBarDirection());
|
||||||
|
column.getCategoryAxis().setOrientation(AxisOrientation.MIN_MAX);
|
||||||
|
column.getValueAxes().get(0).setPosition(AxisPosition.BOTTOM);
|
||||||
|
fillChartData(chart2, column);
|
||||||
|
|
||||||
|
pptx.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFillLineChartTemplate() throws IOException {
|
||||||
|
XMLSlideShow pptx = XSLFTestDataSamples.openSampleDocument("line-chart.pptx");
|
||||||
|
XSLFChart chart = findChart(pptx.getSlides().get(0));
|
||||||
|
List<XDDFChartData> data = findChartData(chart);
|
||||||
|
|
||||||
|
XDDFLineChartData line = (XDDFLineChartData) data.get(0);
|
||||||
|
assertEquals(Grouping.STANDARD, line.getGrouping());
|
||||||
|
line.setGrouping(Grouping.PERCENT_STACKED);
|
||||||
|
assertEquals(Grouping.PERCENT_STACKED, line.getGrouping());
|
||||||
|
|
||||||
|
fillChartData(chart, line);
|
||||||
|
pptx.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFillRadarChartTemplate() throws IOException {
|
||||||
|
XMLSlideShow pptx = XSLFTestDataSamples.openSampleDocument("radar-chart.pptx");
|
||||||
|
XSLFChart chart = findChart(pptx.getSlides().get(0));
|
||||||
|
List<XDDFChartData> data = findChartData(chart);
|
||||||
|
|
||||||
|
XDDFRadarChartData radar = (XDDFRadarChartData) data.get(0);
|
||||||
|
assertEquals(RadarStyle.MARKER, radar.getStyle());
|
||||||
|
radar.setStyle(RadarStyle.FILLED);
|
||||||
|
assertEquals(RadarStyle.FILLED, radar.getStyle());
|
||||||
|
|
||||||
|
fillChartData(chart, radar);
|
||||||
|
pptx.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFillScatterChartTemplate() throws IOException {
|
||||||
|
XMLSlideShow pptx = XSLFTestDataSamples.openSampleDocument("scatter-chart.pptx");
|
||||||
|
XSLFChart chart = findChart(pptx.getSlides().get(0));
|
||||||
|
List<XDDFChartData> data = findChartData(chart);
|
||||||
|
|
||||||
|
XDDFScatterChartData scatter = (XDDFScatterChartData) data.get(0);
|
||||||
|
assertEquals(ScatterStyle.LINE_MARKER, scatter.getStyle());
|
||||||
|
scatter.setStyle(ScatterStyle.SMOOTH);
|
||||||
|
assertEquals(ScatterStyle.SMOOTH, scatter.getStyle());
|
||||||
|
|
||||||
|
fillChartData(chart, scatter);
|
||||||
|
pptx.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fillChartData(XSLFChart chart, XDDFChartData data) {
|
||||||
|
final int numOfPoints = 3;
|
||||||
|
final String[] categories = {"First", "Second", "Third"};
|
||||||
|
final Integer[] values = {1, 3, 4};
|
||||||
|
|
||||||
|
final String categoryDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 0, 0));
|
||||||
|
final String valuesDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 1, 1));
|
||||||
|
|
||||||
|
final XDDFChartData.Series series = data.getSeries().get(0);
|
||||||
|
final XDDFDataSource<?> categoryData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange);
|
||||||
|
final XDDFNumericalDataSource<Integer> valuesData = XDDFDataSourcesFactory.fromArray(values, valuesDataRange);
|
||||||
|
series.replaceData(categoryData, valuesData);
|
||||||
|
final String title = "Apache POI";
|
||||||
|
series.setTitle(title, chart.setSheetTitle(title));
|
||||||
|
chart.plot(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
private XSLFChart findChart(XSLFSlide slide) {
|
||||||
// find chart in the slide
|
// find chart in the slide
|
||||||
XSLFChart chart = null;
|
XSLFChart chart = null;
|
||||||
for(POIXMLDocumentPart part : slide.getRelations()){
|
for(POIXMLDocumentPart part : slide.getRelations()){
|
||||||
@ -65,76 +172,161 @@ public class TestXSLFChart {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(chart == null) throw new IllegalStateException("chart not found in the template");
|
if(chart == null) {
|
||||||
|
throw new IllegalStateException("chart not found in the template");
|
||||||
// embedded Excel workbook that holds the chart data
|
|
||||||
POIXMLDocumentPart xlsPart = chart.getRelations().get(0);
|
|
||||||
XSSFWorkbook wb = new XSSFWorkbook();
|
|
||||||
XSSFSheet sheet = wb.createSheet();
|
|
||||||
|
|
||||||
CTChart ctChart = chart.getCTChart();
|
|
||||||
CTPlotArea plotArea = ctChart.getPlotArea();
|
|
||||||
|
|
||||||
CTPieChart pieChart = plotArea.getPieChartArray(0);
|
|
||||||
//Pie Chart Series
|
|
||||||
CTPieSer ser = pieChart.getSerArray(0);
|
|
||||||
|
|
||||||
// Series Text
|
|
||||||
CTSerTx tx = ser.getTx();
|
|
||||||
tx.getStrRef().getStrCache().getPtArray(0).setV(chartTitle);
|
|
||||||
sheet.createRow(0).createCell(1).setCellValue(chartTitle);
|
|
||||||
String titleRef = new CellReference(sheet.getSheetName(), 0, 1, true, true).formatAsString();
|
|
||||||
tx.getStrRef().setF(titleRef);
|
|
||||||
|
|
||||||
|
|
||||||
// Category Axis Data
|
|
||||||
CTAxDataSource cat = ser.getCat();
|
|
||||||
CTStrData strData = cat.getStrRef().getStrCache();
|
|
||||||
|
|
||||||
// Values
|
|
||||||
CTNumDataSource valSrc = ser.getVal();
|
|
||||||
CTNumData numData = valSrc.getNumRef().getNumCache();
|
|
||||||
|
|
||||||
strData.setPtArray(null); // unset old axis text
|
|
||||||
numData.setPtArray(null); // unset old values
|
|
||||||
|
|
||||||
Map<String, Double> pieModel = new LinkedHashMap<>();
|
|
||||||
pieModel.put("First", 1.0);
|
|
||||||
pieModel.put("Second", 3.0);
|
|
||||||
pieModel.put("Third", 4.0);
|
|
||||||
|
|
||||||
// set model
|
|
||||||
int idx = 0;
|
|
||||||
int rownum = 1;
|
|
||||||
for(String key : pieModel.keySet()){
|
|
||||||
double val = pieModel.get(key);
|
|
||||||
|
|
||||||
CTNumVal numVal = numData.addNewPt();
|
|
||||||
numVal.setIdx(idx);
|
|
||||||
numVal.setV("" + val);
|
|
||||||
|
|
||||||
CTStrVal sVal = strData.addNewPt();
|
|
||||||
sVal.setIdx(idx);
|
|
||||||
sVal.setV(key);
|
|
||||||
|
|
||||||
idx++;
|
|
||||||
XSSFRow row = sheet.createRow(rownum++);
|
|
||||||
row.createCell(0).setCellValue(key);
|
|
||||||
row.createCell(1).setCellValue(val);
|
|
||||||
}
|
|
||||||
numData.getPtCount().setVal(idx);
|
|
||||||
strData.getPtCount().setVal(idx);
|
|
||||||
|
|
||||||
String numDataRange = new CellRangeAddress(1, rownum-1, 1, 1).formatAsString(sheet.getSheetName(), true);
|
|
||||||
valSrc.getNumRef().setF(numDataRange);
|
|
||||||
String axisDataRange = new CellRangeAddress(1, rownum-1, 0, 0).formatAsString(sheet.getSheetName(), true);
|
|
||||||
cat.getStrRef().setF(axisDataRange);
|
|
||||||
|
|
||||||
// updated the embedded workbook with the data
|
|
||||||
OutputStream xlsOut = xlsPart.getPackagePart().getOutputStream();
|
|
||||||
wb.write(xlsOut);
|
|
||||||
xlsOut.close();
|
|
||||||
wb.close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
checkLegendOperations(chart);
|
||||||
|
return chart;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<XDDFChartData> findChartData(XSLFChart chart) {
|
||||||
|
List<XDDFChartData> data = chart.getChartSeries();
|
||||||
|
assertNotNull(data);
|
||||||
|
assertEquals(1, data.size());
|
||||||
|
|
||||||
|
XDDFChartData firstSeries = data.get(0);
|
||||||
|
assertNotNull(firstSeries);
|
||||||
|
if (firstSeries instanceof XDDFScatterChartData) {
|
||||||
|
assertEquals(null, firstSeries.getCategoryAxis());
|
||||||
|
assertEquals(2, firstSeries.getValueAxes().size());
|
||||||
|
checkAxisOperations(firstSeries.getValueAxes().get(0));
|
||||||
|
checkAxisOperations(firstSeries.getValueAxes().get(1));
|
||||||
|
} else if (!(firstSeries instanceof XDDFPieChartData)) {
|
||||||
|
assertNotNull(firstSeries.getCategoryAxis());
|
||||||
|
assertEquals(1, firstSeries.getValueAxes().size());
|
||||||
|
checkAxisOperations(firstSeries.getValueAxes().get(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkLegendOperations(XSLFChart chart) {
|
||||||
|
XDDFChartLegend legend = chart.getOrAddLegend();
|
||||||
|
assertFalse(legend.isOverlay());
|
||||||
|
legend.setOverlay(true);
|
||||||
|
assertTrue(legend.isOverlay());
|
||||||
|
legend.setPosition(LegendPosition.TOP_RIGHT);
|
||||||
|
assertEquals(LegendPosition.TOP_RIGHT, legend.getPosition());
|
||||||
|
|
||||||
|
XDDFManualLayout layout = legend.getOrAddManualLayout();
|
||||||
|
assertNotNull(layout.getTarget());
|
||||||
|
assertNotNull(layout.getXMode());
|
||||||
|
assertNotNull(layout.getYMode());
|
||||||
|
assertNotNull(layout.getHeightMode());
|
||||||
|
assertNotNull(layout.getWidthMode());
|
||||||
|
/*
|
||||||
|
* According to interface, 0.0 should be returned for
|
||||||
|
* uninitialized double properties.
|
||||||
|
*/
|
||||||
|
assertTrue(layout.getX() == 0.0);
|
||||||
|
assertTrue(layout.getY() == 0.0);
|
||||||
|
assertTrue(layout.getWidthRatio() == 0.0);
|
||||||
|
assertTrue(layout.getHeightRatio() == 0.0);
|
||||||
|
|
||||||
|
final double newRatio = 1.1;
|
||||||
|
final double newCoordinate = 0.3;
|
||||||
|
final LayoutMode nonDefaultMode = LayoutMode.FACTOR;
|
||||||
|
final LayoutTarget nonDefaultTarget = LayoutTarget.OUTER;
|
||||||
|
|
||||||
|
layout.setWidthRatio(newRatio);
|
||||||
|
assertTrue(layout.getWidthRatio() == newRatio);
|
||||||
|
|
||||||
|
layout.setHeightRatio(newRatio);
|
||||||
|
assertTrue(layout.getHeightRatio() == newRatio);
|
||||||
|
|
||||||
|
layout.setX(newCoordinate);
|
||||||
|
assertTrue(layout.getX() == newCoordinate);
|
||||||
|
|
||||||
|
layout.setY(newCoordinate);
|
||||||
|
assertTrue(layout.getY() == newCoordinate);
|
||||||
|
|
||||||
|
layout.setXMode(nonDefaultMode);
|
||||||
|
assertTrue(layout.getXMode() == nonDefaultMode);
|
||||||
|
|
||||||
|
layout.setYMode(nonDefaultMode);
|
||||||
|
assertTrue(layout.getYMode() == nonDefaultMode);
|
||||||
|
|
||||||
|
layout.setWidthMode(nonDefaultMode);
|
||||||
|
assertTrue(layout.getWidthMode() == nonDefaultMode);
|
||||||
|
|
||||||
|
layout.setHeightMode(nonDefaultMode);
|
||||||
|
assertTrue(layout.getHeightMode() == nonDefaultMode);
|
||||||
|
|
||||||
|
layout.setTarget(nonDefaultTarget);
|
||||||
|
assertTrue(layout.getTarget() == nonDefaultTarget);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkAxisOperations(XDDFValueAxis axis) {
|
||||||
|
axis.setCrossBetween(AxisCrossBetween.MIDPOINT_CATEGORY);
|
||||||
|
assertEquals(AxisCrossBetween.MIDPOINT_CATEGORY, axis.getCrossBetween());
|
||||||
|
|
||||||
|
axis.setCrosses(AxisCrosses.AUTO_ZERO);
|
||||||
|
assertEquals(AxisCrosses.AUTO_ZERO, axis.getCrosses());
|
||||||
|
|
||||||
|
final String numberFormat = "General";
|
||||||
|
axis.setNumberFormat(numberFormat);
|
||||||
|
assertEquals(numberFormat, axis.getNumberFormat());
|
||||||
|
|
||||||
|
axis.setPosition(AxisPosition.BOTTOM);
|
||||||
|
assertEquals(AxisPosition.BOTTOM, axis.getPosition());
|
||||||
|
|
||||||
|
axis.setMajorTickMark(AxisTickMark.NONE);
|
||||||
|
assertEquals(AxisTickMark.NONE, axis.getMajorTickMark());
|
||||||
|
|
||||||
|
axis.setMajorTickMark(AxisTickMark.IN);
|
||||||
|
assertEquals(AxisTickMark.IN, axis.getMajorTickMark());
|
||||||
|
|
||||||
|
axis.setMajorTickMark(AxisTickMark.OUT);
|
||||||
|
assertEquals(AxisTickMark.OUT, axis.getMajorTickMark());
|
||||||
|
|
||||||
|
axis.setMajorTickMark(AxisTickMark.CROSS);
|
||||||
|
assertEquals(AxisTickMark.CROSS, axis.getMajorTickMark());
|
||||||
|
|
||||||
|
axis.setMinorTickMark(AxisTickMark.NONE);
|
||||||
|
assertEquals(AxisTickMark.NONE, axis.getMinorTickMark());
|
||||||
|
|
||||||
|
axis.setMinorTickMark(AxisTickMark.IN);
|
||||||
|
assertEquals(AxisTickMark.IN, axis.getMinorTickMark());
|
||||||
|
|
||||||
|
axis.setMinorTickMark(AxisTickMark.OUT);
|
||||||
|
assertEquals(AxisTickMark.OUT, axis.getMinorTickMark());
|
||||||
|
|
||||||
|
axis.setMinorTickMark(AxisTickMark.CROSS);
|
||||||
|
assertEquals(AxisTickMark.CROSS, axis.getMinorTickMark());
|
||||||
|
|
||||||
|
axis.setVisible(true);
|
||||||
|
assertTrue(axis.isVisible());
|
||||||
|
|
||||||
|
axis.setVisible(false);
|
||||||
|
assertFalse(axis.isVisible());
|
||||||
|
|
||||||
|
final double EPSILON = 1E-7;
|
||||||
|
axis.setLogBase(Math.E);
|
||||||
|
assertTrue(Math.abs(axis.getLogBase() - Math.E) < EPSILON);
|
||||||
|
|
||||||
|
final double newValue = 10.0;
|
||||||
|
|
||||||
|
axis.setMinimum(newValue);
|
||||||
|
assertTrue(Math.abs(axis.getMinimum() - newValue) < EPSILON);
|
||||||
|
|
||||||
|
axis.setMaximum(newValue);
|
||||||
|
assertTrue(Math.abs(axis.getMaximum() - newValue) < EPSILON);
|
||||||
|
|
||||||
|
IllegalArgumentException iae = null;
|
||||||
|
try {
|
||||||
|
axis.setLogBase(0.0);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
iae = e;
|
||||||
|
}
|
||||||
|
assertNotNull(iae);
|
||||||
|
|
||||||
|
iae = null;
|
||||||
|
try {
|
||||||
|
axis.setLogBase(30000.0);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
iae = e;
|
||||||
|
}
|
||||||
|
assertNotNull(iae);
|
||||||
|
}
|
||||||
}
|
}
|
@ -17,10 +17,10 @@
|
|||||||
|
|
||||||
package org.apache.poi.xssf.usermodel;
|
package org.apache.poi.xssf.usermodel;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
|
||||||
|
|
||||||
import org.apache.poi.xssf.XSSFTestDataSamples;
|
import org.apache.poi.xssf.XSSFTestDataSamples;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
public final class TestXSSFChart extends TestCase {
|
public final class TestXSSFChart extends TestCase {
|
||||||
|
|
||||||
public void testGetAccessors() {
|
public void testGetAccessors() {
|
||||||
@ -68,8 +68,9 @@ public final class TestXSSFChart extends TestCase {
|
|||||||
XSSFChart c1 = d1.createChart(a1);
|
XSSFChart c1 = d1.createChart(a1);
|
||||||
|
|
||||||
assertEquals(1, d1.getCharts().size());
|
assertEquals(1, d1.getCharts().size());
|
||||||
|
|
||||||
assertNotNull(c1.getGraphicFrame());
|
assertNotNull(c1.getGraphicFrame());
|
||||||
assertNotNull(c1.getOrCreateLegend());
|
assertNotNull(c1.getOrAddLegend());
|
||||||
|
|
||||||
XSSFClientAnchor a2 = new XSSFClientAnchor(0, 0, 0, 0, 1, 11, 10, 60);
|
XSSFClientAnchor a2 = new XSSFClientAnchor(0, 0, 0, 0, 1, 11, 10, 60);
|
||||||
XSSFChart c2 = d1.createChart(a2);
|
XSSFChart c2 = d1.createChart(a2);
|
||||||
|
@ -17,10 +17,16 @@
|
|||||||
|
|
||||||
package org.apache.poi.xssf.usermodel.charts;
|
package org.apache.poi.xssf.usermodel.charts;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import org.apache.poi.xddf.usermodel.chart.AxisCrosses;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.AxisPosition;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFCategoryAxis;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFChart;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFDrawing;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
|
|
||||||
import org.apache.poi.ss.usermodel.charts.*;
|
import junit.framework.TestCase;
|
||||||
import org.apache.poi.xssf.usermodel.*;
|
|
||||||
|
|
||||||
public final class TestXSSFCategoryAxis extends TestCase {
|
public final class TestXSSFCategoryAxis extends TestCase {
|
||||||
|
|
||||||
@ -30,11 +36,13 @@ public final class TestXSSFCategoryAxis extends TestCase {
|
|||||||
XSSFDrawing drawing = sheet.createDrawingPatriarch();
|
XSSFDrawing drawing = sheet.createDrawingPatriarch();
|
||||||
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
|
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
|
||||||
XSSFChart chart = drawing.createChart(anchor);
|
XSSFChart chart = drawing.createChart(anchor);
|
||||||
XSSFCategoryAxis axis = chart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM);
|
XDDFCategoryAxis axis = chart.createCategoryAxis(AxisPosition.BOTTOM);
|
||||||
|
|
||||||
axis.setCrosses(AxisCrosses.AUTO_ZERO);
|
axis.setCrosses(AxisCrosses.AUTO_ZERO);
|
||||||
assertEquals(axis.getCrosses(), AxisCrosses.AUTO_ZERO);
|
assertEquals(axis.getCrosses(), AxisCrosses.AUTO_ZERO);
|
||||||
|
|
||||||
assertEquals(chart.getAxis().size(), 1);
|
assertEquals(chart.getAxes().size(), 1);
|
||||||
|
|
||||||
|
wb.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,18 +19,22 @@ package org.apache.poi.xssf.usermodel.charts;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import org.apache.poi.xddf.usermodel.chart.AxisPosition;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.AxisTickMark;
|
||||||
import org.apache.poi.ss.usermodel.Sheet;
|
import org.apache.poi.xddf.usermodel.chart.XDDFChartAxis;
|
||||||
import org.apache.poi.ss.usermodel.Workbook;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.*;
|
|
||||||
import org.apache.poi.xssf.XSSFTestDataSamples;
|
import org.apache.poi.xssf.XSSFTestDataSamples;
|
||||||
import org.apache.poi.xssf.usermodel.*;
|
import org.apache.poi.xssf.usermodel.XSSFChart;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFDrawing;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
public final class TestXSSFChartAxis extends TestCase {
|
public final class TestXSSFChartAxis extends TestCase {
|
||||||
|
|
||||||
private static final double EPSILON = 1E-7;
|
private static final double EPSILON = 1E-7;
|
||||||
private final XSSFChartAxis axis;
|
private final XDDFChartAxis axis;
|
||||||
|
|
||||||
public TestXSSFChartAxis() {
|
public TestXSSFChartAxis() {
|
||||||
super();
|
super();
|
||||||
@ -39,7 +43,7 @@ public final class TestXSSFChartAxis extends TestCase {
|
|||||||
XSSFDrawing drawing = sheet.createDrawingPatriarch();
|
XSSFDrawing drawing = sheet.createDrawingPatriarch();
|
||||||
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
|
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
|
||||||
XSSFChart chart = drawing.createChart(anchor);
|
XSSFChart chart = drawing.createChart(anchor);
|
||||||
axis = chart.getChartAxisFactory().createValueAxis(AxisPosition.BOTTOM);
|
axis = chart.createValueAxis(AxisPosition.BOTTOM);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testLogBaseIllegalArgument() throws Exception {
|
public void testLogBaseIllegalArgument() throws Exception {
|
||||||
@ -119,13 +123,12 @@ public final class TestXSSFChartAxis extends TestCase {
|
|||||||
|
|
||||||
public void testGetChartAxisBug57362() {
|
public void testGetChartAxisBug57362() {
|
||||||
//Load existing excel with some chart on it having primary and secondary axis.
|
//Load existing excel with some chart on it having primary and secondary axis.
|
||||||
final Workbook workbook = XSSFTestDataSamples.openSampleWorkbook("57362.xlsx");
|
final XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("57362.xlsx");
|
||||||
final Sheet sh = workbook.getSheetAt(0);
|
final XSSFSheet sh = workbook.getSheetAt(0);
|
||||||
final XSSFSheet xsh = (XSSFSheet) sh;
|
final XSSFDrawing drawing = sh.createDrawingPatriarch();
|
||||||
final XSSFDrawing drawing = xsh.createDrawingPatriarch();
|
|
||||||
final XSSFChart chart = drawing.getCharts().get(0);
|
final XSSFChart chart = drawing.getCharts().get(0);
|
||||||
|
|
||||||
final List<? extends XSSFChartAxis> axisList = chart.getAxis();
|
final List<? extends XDDFChartAxis> axisList = chart.getAxes();
|
||||||
|
|
||||||
assertEquals(4, axisList.size());
|
assertEquals(4, axisList.size());
|
||||||
assertNotNull(axisList.get(0));
|
assertNotNull(axisList.get(0));
|
||||||
|
@ -23,13 +23,12 @@ import static org.junit.Assert.assertTrue;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import org.apache.poi.ss.usermodel.Chart;
|
import org.apache.poi.xddf.usermodel.chart.LegendPosition;
|
||||||
import org.apache.poi.ss.usermodel.ClientAnchor;
|
import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend;
|
||||||
import org.apache.poi.ss.usermodel.Drawing;
|
import org.apache.poi.xssf.usermodel.XSSFChart;
|
||||||
import org.apache.poi.ss.usermodel.Sheet;
|
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
|
||||||
import org.apache.poi.ss.usermodel.Workbook;
|
import org.apache.poi.xssf.usermodel.XSSFDrawing;
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartLegend;
|
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||||
import org.apache.poi.ss.usermodel.charts.LegendPosition;
|
|
||||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
@ -39,12 +38,12 @@ import org.junit.Test;
|
|||||||
public final class TestXSSFChartLegend {
|
public final class TestXSSFChartLegend {
|
||||||
@Test
|
@Test
|
||||||
public void testLegendPositionAccessMethods() throws IOException {
|
public void testLegendPositionAccessMethods() throws IOException {
|
||||||
Workbook wb = new XSSFWorkbook();
|
XSSFWorkbook wb = new XSSFWorkbook();
|
||||||
Sheet sheet = wb.createSheet();
|
XSSFSheet sheet = wb.createSheet();
|
||||||
Drawing<?> drawing = sheet.createDrawingPatriarch();
|
XSSFDrawing drawing = sheet.createDrawingPatriarch();
|
||||||
ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
|
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
|
||||||
Chart chart = drawing.createChart(anchor);
|
XSSFChart chart = drawing.createChart(anchor);
|
||||||
ChartLegend legend = chart.getOrCreateLegend();
|
XDDFChartLegend legend = chart.getOrAddLegend();
|
||||||
|
|
||||||
legend.setPosition(LegendPosition.TOP_RIGHT);
|
legend.setPosition(LegendPosition.TOP_RIGHT);
|
||||||
assertEquals(LegendPosition.TOP_RIGHT, legend.getPosition());
|
assertEquals(LegendPosition.TOP_RIGHT, legend.getPosition());
|
||||||
@ -55,12 +54,12 @@ public final class TestXSSFChartLegend {
|
|||||||
@Test
|
@Test
|
||||||
public void test_setOverlay_defaultChartLegend_expectOverlayInitialValueSetToFalse() throws IOException {
|
public void test_setOverlay_defaultChartLegend_expectOverlayInitialValueSetToFalse() throws IOException {
|
||||||
// Arrange
|
// Arrange
|
||||||
Workbook wb = new XSSFWorkbook();
|
XSSFWorkbook wb = new XSSFWorkbook();
|
||||||
Sheet sheet = wb.createSheet();
|
XSSFSheet sheet = wb.createSheet();
|
||||||
Drawing<?> drawing = sheet.createDrawingPatriarch();
|
XSSFDrawing drawing = sheet.createDrawingPatriarch();
|
||||||
ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
|
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
|
||||||
Chart chart = drawing.createChart(anchor);
|
XSSFChart chart = drawing.createChart(anchor);
|
||||||
ChartLegend legend = chart.getOrCreateLegend();
|
XDDFChartLegend legend = chart.getOrAddLegend();
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
||||||
@ -73,12 +72,12 @@ public final class TestXSSFChartLegend {
|
|||||||
@Test
|
@Test
|
||||||
public void test_setOverlay_chartLegendSetToTrue_expectOverlayInitialValueSetToTrue() throws IOException {
|
public void test_setOverlay_chartLegendSetToTrue_expectOverlayInitialValueSetToTrue() throws IOException {
|
||||||
// Arrange
|
// Arrange
|
||||||
Workbook wb = new XSSFWorkbook();
|
XSSFWorkbook wb = new XSSFWorkbook();
|
||||||
Sheet sheet = wb.createSheet();
|
XSSFSheet sheet = wb.createSheet();
|
||||||
Drawing<?> drawing = sheet.createDrawingPatriarch();
|
XSSFDrawing drawing = sheet.createDrawingPatriarch();
|
||||||
ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
|
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
|
||||||
Chart chart = drawing.createChart(anchor);
|
XSSFChart chart = drawing.createChart(anchor);
|
||||||
ChartLegend legend = chart.getOrCreateLegend();
|
XDDFChartLegend legend = chart.getOrAddLegend();
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
legend.setOverlay(true);
|
legend.setOverlay(true);
|
||||||
|
@ -26,24 +26,22 @@ import java.io.IOException;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.poi.ss.usermodel.Cell;
|
import org.apache.poi.ss.usermodel.Cell;
|
||||||
import org.apache.poi.ss.usermodel.Chart;
|
|
||||||
import org.apache.poi.ss.usermodel.ClientAnchor;
|
|
||||||
import org.apache.poi.ss.usermodel.Drawing;
|
|
||||||
import org.apache.poi.ss.usermodel.Row;
|
import org.apache.poi.ss.usermodel.Row;
|
||||||
import org.apache.poi.ss.usermodel.Sheet;
|
|
||||||
import org.apache.poi.ss.usermodel.Workbook;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.AxisCrosses;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.AxisPosition;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartAxis;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartDataSource;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.ChartLegend;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.DataSources;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.LegendPosition;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.LineChartData;
|
|
||||||
import org.apache.poi.ss.usermodel.charts.ValueAxis;
|
|
||||||
import org.apache.poi.ss.util.CellRangeAddress;
|
import org.apache.poi.ss.util.CellRangeAddress;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.AxisCrosses;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.AxisPosition;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.ChartTypes;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.LegendPosition;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFChartAxis;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFDataSource;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFValueAxis;
|
||||||
import org.apache.poi.xssf.XSSFTestDataSamples;
|
import org.apache.poi.xssf.XSSFTestDataSamples;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFChart;
|
import org.apache.poi.xssf.usermodel.XSSFChart;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFDrawing;
|
import org.apache.poi.xssf.usermodel.XSSFDrawing;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
|
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||||
@ -54,9 +52,9 @@ import org.junit.Test;
|
|||||||
* Test get/set chart title.
|
* Test get/set chart title.
|
||||||
*/
|
*/
|
||||||
public class TestXSSFChartTitle {
|
public class TestXSSFChartTitle {
|
||||||
private Workbook createWorkbookWithChart() {
|
private XSSFWorkbook createWorkbookWithChart() {
|
||||||
Workbook wb = new XSSFWorkbook();
|
XSSFWorkbook wb = new XSSFWorkbook();
|
||||||
Sheet sheet = wb.createSheet("linechart");
|
XSSFSheet sheet = wb.createSheet("linechart");
|
||||||
final int NUM_OF_ROWS = 3;
|
final int NUM_OF_ROWS = 3;
|
||||||
final int NUM_OF_COLUMNS = 10;
|
final int NUM_OF_COLUMNS = 10;
|
||||||
|
|
||||||
@ -71,28 +69,26 @@ public class TestXSSFChartTitle {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Drawing<?> drawing = sheet.createDrawingPatriarch();
|
XSSFDrawing drawing = sheet.createDrawingPatriarch();
|
||||||
ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15);
|
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15);
|
||||||
|
|
||||||
Chart chart = drawing.createChart(anchor);
|
XSSFChart chart = drawing.createChart(anchor);
|
||||||
ChartLegend legend = chart.getOrCreateLegend();
|
XDDFChartLegend legend = chart.getOrAddLegend();
|
||||||
legend.setPosition(LegendPosition.TOP_RIGHT);
|
legend.setPosition(LegendPosition.TOP_RIGHT);
|
||||||
|
|
||||||
LineChartData data = chart.getChartDataFactory().createLineChartData();
|
|
||||||
|
|
||||||
// Use a category axis for the bottom axis.
|
// Use a category axis for the bottom axis.
|
||||||
ChartAxis bottomAxis = chart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM);
|
XDDFChartAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
|
||||||
ValueAxis leftAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT);
|
XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
|
||||||
leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
|
leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
|
||||||
|
|
||||||
ChartDataSource<Number> xs = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(0, 0, 0, NUM_OF_COLUMNS - 1));
|
XDDFDataSource<Double> xs = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(0, 0, 0, NUM_OF_COLUMNS - 1));
|
||||||
ChartDataSource<Number> ys1 = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, NUM_OF_COLUMNS - 1));
|
XDDFNumericalDataSource<Double> ys1 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, NUM_OF_COLUMNS - 1));
|
||||||
ChartDataSource<Number> ys2 = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, NUM_OF_COLUMNS - 1));
|
XDDFNumericalDataSource<Double> ys2 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, NUM_OF_COLUMNS - 1));
|
||||||
|
|
||||||
|
XDDFChartData data = chart.createData(ChartTypes.LINE, bottomAxis, leftAxis);
|
||||||
data.addSeries(xs, ys1);
|
data.addSeries(xs, ys1);
|
||||||
data.addSeries(xs, ys2);
|
data.addSeries(xs, ys2);
|
||||||
|
chart.plot(data);
|
||||||
chart.plot(data, bottomAxis, leftAxis);
|
|
||||||
|
|
||||||
return wb;
|
return wb;
|
||||||
}
|
}
|
||||||
@ -100,10 +96,9 @@ public class TestXSSFChartTitle {
|
|||||||
/**
|
/**
|
||||||
* Gets the first chart from the named sheet in the workbook.
|
* Gets the first chart from the named sheet in the workbook.
|
||||||
*/
|
*/
|
||||||
private XSSFChart getChartFromWorkbook(Workbook wb, String sheetName) {
|
private XSSFChart getChartFromWorkbook(XSSFWorkbook wb, String sheetName) {
|
||||||
Sheet sheet = wb.getSheet(sheetName);
|
XSSFSheet sheet = wb.getSheet(sheetName);
|
||||||
if (sheet instanceof XSSFSheet) {
|
XSSFSheet xsheet = sheet;
|
||||||
XSSFSheet xsheet = (XSSFSheet) sheet;
|
|
||||||
XSSFDrawing drawing = xsheet.getDrawingPatriarch();
|
XSSFDrawing drawing = xsheet.getDrawingPatriarch();
|
||||||
if (drawing != null) {
|
if (drawing != null) {
|
||||||
List<XSSFChart> charts = drawing.getCharts();
|
List<XSSFChart> charts = drawing.getCharts();
|
||||||
@ -111,13 +106,12 @@ public class TestXSSFChartTitle {
|
|||||||
return charts.get(0);
|
return charts.get(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testNewChart() throws IOException {
|
public void testNewChart() throws IOException {
|
||||||
Workbook wb = createWorkbookWithChart();
|
XSSFWorkbook wb = createWorkbookWithChart();
|
||||||
XSSFChart chart = getChartFromWorkbook(wb, "linechart");
|
XSSFChart chart = getChartFromWorkbook(wb, "linechart");
|
||||||
assertNotNull(chart);
|
assertNotNull(chart);
|
||||||
assertNull(chart.getTitleText());
|
assertNull(chart.getTitleText());
|
||||||
@ -139,7 +133,7 @@ public class TestXSSFChartTitle {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testExistingChartWithTitle() throws IOException {
|
public void testExistingChartWithTitle() throws IOException {
|
||||||
Workbook wb = XSSFTestDataSamples.openSampleWorkbook("chartTitle_withTitle.xlsx");
|
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("chartTitle_withTitle.xlsx");
|
||||||
XSSFChart chart = getChartFromWorkbook(wb, "Sheet1");
|
XSSFChart chart = getChartFromWorkbook(wb, "Sheet1");
|
||||||
assertNotNull(chart);
|
assertNotNull(chart);
|
||||||
XSSFRichTextString originalTitle = chart.getTitleText();
|
XSSFRichTextString originalTitle = chart.getTitleText();
|
||||||
@ -155,7 +149,7 @@ public class TestXSSFChartTitle {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testExistingChartNoTitle() throws IOException {
|
public void testExistingChartNoTitle() throws IOException {
|
||||||
Workbook wb = XSSFTestDataSamples.openSampleWorkbook("chartTitle_noTitle.xlsx");
|
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("chartTitle_noTitle.xlsx");
|
||||||
XSSFChart chart = getChartFromWorkbook(wb, "Sheet1");
|
XSSFChart chart = getChartFromWorkbook(wb, "Sheet1");
|
||||||
assertNotNull(chart);
|
assertNotNull(chart);
|
||||||
assertNull(chart.getTitleText());
|
assertNull(chart.getTitleText());
|
||||||
@ -169,7 +163,7 @@ public class TestXSSFChartTitle {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testExistingChartWithFormulaTitle() throws IOException {
|
public void testExistingChartWithFormulaTitle() throws IOException {
|
||||||
Workbook wb = XSSFTestDataSamples.openSampleWorkbook("chartTitle_withTitleFormula.xlsx");
|
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("chartTitle_withTitleFormula.xlsx");
|
||||||
XSSFChart chart = getChartFromWorkbook(wb, "Sheet1");
|
XSSFChart chart = getChartFromWorkbook(wb, "Sheet1");
|
||||||
assertNotNull(chart);
|
assertNotNull(chart);
|
||||||
XSSFRichTextString originalTitle = chart.getTitleText();
|
XSSFRichTextString originalTitle = chart.getTitleText();
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user