bug 59853: support PivotTables with named structured references; patch from Greg Woolsey

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1761537 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Javen O'Neal 2016-09-20 07:55:13 +00:00
parent be5158c813
commit 676ca76fd9
7 changed files with 394 additions and 115 deletions

View File

@ -78,7 +78,7 @@ under the License.
JVM system properties for running tests, JVM system properties for running tests,
user.language and user.country are required as we have locale-sensitive formatters user.language and user.country are required as we have locale-sensitive formatters
--> -->
<property name="testpattern" value="Test*"/> <property name="testpattern" value="Test*"/> <!--note: this excludes BaseTest* -->
<property name="POI.testdata.path" value="test-data"/> <property name="POI.testdata.path" value="test-data"/>
<property name="java.awt.headless" value="true"/> <property name="java.awt.headless" value="true"/>
<property name="additionaljar" value=""/> <property name="additionaljar" value=""/>

View File

@ -28,10 +28,13 @@ import javax.xml.namespace.QName;
import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.POIXMLDocumentPart;
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.openxml4j.opc.PackageRelationship;
import org.apache.poi.ss.SpreadsheetVersion;
import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Name;
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.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.AreaReference; import org.apache.poi.ss.util.AreaReference;
import org.apache.poi.ss.util.CellReference; import org.apache.poi.ss.util.CellReference;
import org.apache.poi.util.Beta; import org.apache.poi.util.Beta;
@ -41,6 +44,7 @@ import org.apache.xmlbeans.XmlOptions;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCacheField; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCacheField;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCacheFields; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCacheFields;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotCacheDefinition; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotCacheDefinition;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheetSource;
public class XSSFPivotCacheDefinition extends POIXMLDocumentPart{ public class XSSFPivotCacheDefinition extends POIXMLDocumentPart{
@ -116,6 +120,40 @@ public class XSSFPivotCacheDefinition extends POIXMLDocumentPart{
out.close(); out.close();
} }
/**
* Find the 2D base data area for the pivot table, either from its direct reference or named table/range.
* @return AreaReference representing the current area defined by the pivot table
* @throws IllegalArgumentException if the ref attribute is not contiguous or the name attribute is not found.
*/
@Beta
public AreaReference getPivotArea(Workbook wb) throws IllegalArgumentException {
final CTWorksheetSource wsSource = ctPivotCacheDefinition.getCacheSource().getWorksheetSource();
final String ref = wsSource.getRef();
final String name = wsSource.getName();
if (ref == null && name == null) throw new IllegalArgumentException("Pivot cache must reference an area, named range, or table.");
// this is the XML format, so tell the reference that.
if (ref != null) return new AreaReference(ref, SpreadsheetVersion.EXCEL2007);
if (name != null) {
// named range or table?
final Name range = wb.getName(name);
if (range != null) return new AreaReference(range.getRefersToFormula(), SpreadsheetVersion.EXCEL2007);
// not a named range, check for a table.
// do this second, as tables are sheet-specific, but named ranges are not, and may not have a sheet name given.
final XSSFSheet sheet = (XSSFSheet) wb.getSheet(wsSource.getSheet());
for (XSSFTable table : sheet.getTables()) {
if (table.getName().equals(name)) { //case-sensitive?
return new AreaReference(table.getStartCellReference(), table.getEndCellReference());
}
}
}
throw new IllegalArgumentException("Name '" + name + "' was not found.");
}
/** /**
* Generates a cache field for each column in the reference area for the pivot table. * Generates a cache field for each column in the reference area for the pivot table.
* @param sheet The sheet where the data i collected from * @param sheet The sheet where the data i collected from
@ -123,7 +161,7 @@ public class XSSFPivotCacheDefinition extends POIXMLDocumentPart{
@Beta @Beta
protected void createCacheFields(Sheet sheet) { protected void createCacheFields(Sheet sheet) {
//Get values for start row, start and end column //Get values for start row, start and end column
AreaReference ar = new AreaReference(ctPivotCacheDefinition.getCacheSource().getWorksheetSource().getRef()); AreaReference ar = getPivotArea(sheet.getWorkbook());
CellReference firstCell = ar.getFirstCell(); CellReference firstCell = ar.getFirstCell();
CellReference lastCell = ar.getLastCell(); CellReference lastCell = ar.getLastCell();
int columnStart = firstCell.getCol(); int columnStart = firstCell.getCol();

View File

@ -30,11 +30,11 @@ import javax.xml.namespace.QName;
import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.POIXMLDocumentPart;
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.openxml4j.opc.PackageRelationship;
import org.apache.poi.ss.SpreadsheetVersion;
import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DataConsolidateFunction; import org.apache.poi.ss.usermodel.DataConsolidateFunction;
import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.AreaReference; import org.apache.poi.ss.util.AreaReference;
import org.apache.poi.ss.util.CellReference; import org.apache.poi.ss.util.CellReference;
import org.apache.poi.util.Beta; import org.apache.poi.util.Beta;
@ -214,13 +214,8 @@ public class XSSFPivotTable extends POIXMLDocumentPart {
} }
protected AreaReference getPivotArea() { protected AreaReference getPivotArea() {
AreaReference pivotArea = new AreaReference( final Workbook wb = getDataSheet().getWorkbook();
getPivotCacheDefinition() AreaReference pivotArea = getPivotCacheDefinition().getPivotArea(wb);
.getCTPivotCacheDefinition()
.getCacheSource()
.getWorksheetSource()
.getRef(),
SpreadsheetVersion.EXCEL2007);
return pivotArea; return pivotArea;
} }
@ -419,12 +414,14 @@ public class XSSFPivotTable extends POIXMLDocumentPart {
/** /**
* Creates cacheSource and workSheetSource for pivot table and sets the source reference as well assets the location of the pivot table * Creates cacheSource and workSheetSource for pivot table and sets the source reference as well assets the location of the pivot table
* @param source Source for data for pivot table * @param sourceRef Source for data for pivot table - mutually exclusive with sourceName
* @param sourceName Source for data for pivot table - mutually exclusive with sourceRef
* @param position Position for pivot table in sheet * @param position Position for pivot table in sheet
* @param sourceSheet Sheet where the source will be collected from * @param sourceSheet Sheet where the source will be collected from
*/ */
@Beta @Beta
protected void createSourceReferences(AreaReference source, CellReference position, Sheet sourceSheet){ protected void createSourceReferences(CellReference position, Sheet sourceSheet, PivotTableReferenceConfigurator refConfig){
//Get cell one to the right and one down from position, add both to AreaReference and set pivot table location. //Get cell one to the right and one down from position, add both to AreaReference and set pivot table location.
AreaReference destination = new AreaReference(position, new CellReference(position.getRow()+1, position.getCol()+1)); AreaReference destination = new AreaReference(position, new CellReference(position.getRow()+1, position.getCol()+1));
@ -448,9 +445,8 @@ public class XSSFPivotTable extends POIXMLDocumentPart {
worksheetSource.setSheet(sourceSheet.getSheetName()); worksheetSource.setSheet(sourceSheet.getSheetName());
setDataSheet(sourceSheet); setDataSheet(sourceSheet);
String[] firstCell = source.getFirstCell().getCellRefParts(); refConfig.configureReference(worksheetSource);
String[] lastCell = source.getLastCell().getCellRefParts(); if (worksheetSource.getName() == null && worksheetSource.getRef() == null) throw new IllegalArgumentException("Pivot table source area reference or name must be specified.");
worksheetSource.setRef(firstCell[2]+firstCell[1]+':'+lastCell[2]+lastCell[1]);
} }
@Beta @Beta
@ -465,11 +461,20 @@ public class XSSFPivotTable extends POIXMLDocumentPart {
int firstColumn = sourceArea.getFirstCell().getCol(); int firstColumn = sourceArea.getFirstCell().getCol();
int lastColumn = sourceArea.getLastCell().getCol(); int lastColumn = sourceArea.getLastCell().getCol();
CTPivotField pivotField; CTPivotField pivotField;
for(int i = 0; i<=lastColumn-firstColumn; i++) { for(int i = firstColumn; i<=lastColumn; i++) {
pivotField = pivotFields.addNewPivotField(); pivotField = pivotFields.addNewPivotField();
pivotField.setDataField(false); pivotField.setDataField(false);
pivotField.setShowAll(false); pivotField.setShowAll(false);
} }
pivotFields.setCount(pivotFields.sizeOfPivotFieldArray()); pivotFields.setCount(pivotFields.sizeOfPivotFieldArray());
} }
protected static interface PivotTableReferenceConfigurator {
/**
* Configure the name or area reference for the pivot table
* @param wsSource CTWorksheetSource that needs the pivot source reference assignment
*/
public void configureReference(CTWorksheetSource wsSource);
}
} }

View File

@ -64,8 +64,10 @@ import org.apache.poi.ss.usermodel.Footer;
import org.apache.poi.ss.usermodel.Header; import org.apache.poi.ss.usermodel.Header;
import org.apache.poi.ss.usermodel.IgnoredErrorType; import org.apache.poi.ss.usermodel.IgnoredErrorType;
import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Name;
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.Sheet;
import org.apache.poi.ss.usermodel.Table;
import org.apache.poi.ss.util.AreaReference; import org.apache.poi.ss.util.AreaReference;
import org.apache.poi.ss.util.CellAddress; import org.apache.poi.ss.util.CellAddress;
import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddress;
@ -80,6 +82,7 @@ import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger; import org.apache.poi.util.POILogger;
import org.apache.poi.util.Removal; import org.apache.poi.util.Removal;
import org.apache.poi.xssf.model.CommentsTable; import org.apache.poi.xssf.model.CommentsTable;
import org.apache.poi.xssf.usermodel.XSSFPivotTable.PivotTableReferenceConfigurator;
import org.apache.poi.xssf.usermodel.helpers.ColumnHelper; import org.apache.poi.xssf.usermodel.helpers.ColumnHelper;
import org.apache.poi.xssf.usermodel.helpers.XSSFIgnoredErrorHelper; import org.apache.poi.xssf.usermodel.helpers.XSSFIgnoredErrorHelper;
import org.apache.poi.xssf.usermodel.helpers.XSSFRowShifter; import org.apache.poi.xssf.usermodel.helpers.XSSFRowShifter;
@ -4158,27 +4161,56 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
} }
/** /**
* Create a pivot table and set area of source, source sheet and a position for pivot table * Create a pivot table using the AreaReference range on sourceSheet, at the given position.
* @param source Area from where data will be collected * If the source reference contains a sheet name, it must match the sourceSheet
* @param position A reference to the cell where the table will start * @param source location of pivot data
* @param sourceSheet The sheet where source will be collected from * @param position A reference to the top left cell where the pivot table will start
* @param sourceSheet The sheet containing the source data, if the source reference doesn't contain a sheet name
* @throws IllegalArgumentException if source references a sheet different than sourceSheet
* @return The pivot table * @return The pivot table
*/ */
@Beta @Beta
public XSSFPivotTable createPivotTable(AreaReference source, CellReference position, Sheet sourceSheet) { public XSSFPivotTable createPivotTable(final AreaReference source, CellReference position, Sheet sourceSheet) {
final String sourceSheetName = source.getFirstCell().getSheetName(); final String sourceSheetName = source.getFirstCell().getSheetName();
if(sourceSheetName != null && !sourceSheetName.equalsIgnoreCase(sourceSheet.getSheetName())) { if(sourceSheetName != null && !sourceSheetName.equalsIgnoreCase(sourceSheet.getSheetName())) {
throw new IllegalArgumentException("The area is referenced in another sheet than the " throw new IllegalArgumentException("The area is referenced in another sheet than the "
+ "defined source sheet " + sourceSheet.getSheetName() + "."); + "defined source sheet " + sourceSheet.getSheetName() + ".");
} }
return createPivotTable(position, sourceSheet, new PivotTableReferenceConfigurator() {
public void configureReference(CTWorksheetSource wsSource) {
final String[] firstCell = source.getFirstCell().getCellRefParts();
final String firstRow = firstCell[1];
final String firstCol = firstCell[2];
final String[] lastCell = source.getLastCell().getCellRefParts();
final String lastRow = lastCell[1];
final String lastCol = lastCell[2];
final String ref = firstCol+firstRow+':'+lastCol+lastRow; //or just source.formatAsString()
wsSource.setRef(ref);
}
});
}
/**
* Create a pivot table using the AreaReference or named/table range on sourceSheet, at the given position.
* If the source reference contains a sheet name, it must match the sourceSheet.
* @param sourceRef location of pivot data - mutually exclusive with SourceName
* @param sourceName range or table name for pivot data - mutually exclusive with SourceRef
* @param position A reference to the top left cell where the pivot table will start
* @param sourceSheet The sheet containing the source data, if the source reference doesn't contain a sheet name
* @throws IllegalArgumentException if source references a sheet different than sourceSheet
* @return The pivot table
*/
private XSSFPivotTable createPivotTable(CellReference position, Sheet sourceSheet, PivotTableReferenceConfigurator refConfig) {
XSSFPivotTable pivotTable = createPivotTable(); XSSFPivotTable pivotTable = createPivotTable();
//Creates default settings for the pivot table //Creates default settings for the pivot table
pivotTable.setDefaultPivotTableDefinition(); pivotTable.setDefaultPivotTableDefinition();
//Set sources and references //Set sources and references
pivotTable.createSourceReferences(source, position, sourceSheet); pivotTable.createSourceReferences(position, sourceSheet, refConfig);
//Create cachefield/s and empty SharedItems //Create cachefield/s and empty SharedItems - must be after creating references
pivotTable.getPivotCacheDefinition().createCacheFields(sourceSheet); pivotTable.getPivotCacheDefinition().createCacheFields(sourceSheet);
pivotTable.createDefaultDataColumns(); pivotTable.createDefaultDataColumns();
@ -4186,9 +4218,10 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
} }
/** /**
* Create a pivot table and set area of source and a position for pivot table * Create a pivot table using the AreaReference range, at the given position.
* @param source Area from where data will be collected * If the source reference contains a sheet name, that sheet is used, otherwise this sheet is assumed as the source sheet.
* @param position A reference to the cell where the table will start * @param source location of pivot data
* @param position A reference to the top left cell where the pivot table will start
* @return The pivot table * @return The pivot table
*/ */
@Beta @Beta
@ -4201,6 +4234,57 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
return createPivotTable(source, position, this); return createPivotTable(source, position, this);
} }
/**
* Create a pivot table using the Name range reference on sourceSheet, at the given position.
* If the source reference contains a sheet name, it must match the sourceSheet
* @param source location of pivot data
* @param position A reference to the top left cell where the pivot table will start
* @param sourceSheet The sheet containing the source data, if the source reference doesn't contain a sheet name
* @throws IllegalArgumentException if source references a sheet different than sourceSheet
* @return The pivot table
*/
@Beta
public XSSFPivotTable createPivotTable(final Name source, CellReference position, Sheet sourceSheet) {
if(source.getSheetName() != null && !source.getSheetName().equals(sourceSheet.getSheetName())) {
throw new IllegalArgumentException("The named range references another sheet than the "
+ "defined source sheet " + sourceSheet.getSheetName() + ".");
}
return createPivotTable(position, sourceSheet, new PivotTableReferenceConfigurator() {
public void configureReference(CTWorksheetSource wsSource) {
wsSource.setName(source.getNameName());
}
});
}
/**
* Create a pivot table using the Name range, at the given position.
* If the source reference contains a sheet name, that sheet is used, otherwise this sheet is assumed as the source sheet.
* @param source location of pivot data
* @param position A reference to the top left cell where the pivot table will start
* @return The pivot table
*/
@Beta
public XSSFPivotTable createPivotTable(Name source, CellReference position) {
return createPivotTable(source, position, getWorkbook().getSheet(source.getSheetName()));
}
/**
* Create a pivot table using the Table, at the given position.
* Tables are required to have a sheet reference, so no additional logic around reference sheet is needed.
* @param source location of pivot data
* @param position A reference to the top left cell where the pivot table will start
* @return The pivot table
*/
@Beta
public XSSFPivotTable createPivotTable(final Table source, CellReference position) {
return createPivotTable(position, getWorkbook().getSheet(source.getSheetName()), new PivotTableReferenceConfigurator() {
public void configureReference(CTWorksheetSource wsSource) {
wsSource.setName(source.getName());
}
});
}
/** /**
* Returns all the pivot tables for this Sheet * Returns all the pivot tables for this Sheet
*/ */

View File

@ -16,16 +16,13 @@
==================================================================== */ ==================================================================== */
package org.apache.poi.xssf.usermodel; package org.apache.poi.xssf.usermodel;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.*;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
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.CellType; import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DataConsolidateFunction; import org.apache.poi.ss.usermodel.DataConsolidateFunction;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.util.AreaReference; import org.apache.poi.ss.util.AreaReference;
import org.apache.poi.ss.util.CellReference; import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.XSSFITestDataProvider; import org.apache.poi.xssf.XSSFITestDataProvider;
@ -38,98 +35,28 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotFields;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotTableDefinition; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotTableDefinition;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STDataConsolidateFunction; import org.openxmlformats.schemas.spreadsheetml.x2006.main.STDataConsolidateFunction;
public class TestXSSFPivotTable { public abstract class BaseTestXSSFPivotTable {
private static final XSSFITestDataProvider _testDataProvider = XSSFITestDataProvider.instance; private static final XSSFITestDataProvider _testDataProvider = XSSFITestDataProvider.instance;
private XSSFWorkbook wb; protected XSSFWorkbook wb;
private XSSFPivotTable pivotTable; protected XSSFPivotTable pivotTable;
private XSSFPivotTable offsetPivotTable; protected XSSFPivotTable offsetPivotTable;
private Cell offsetOuterCell; protected Cell offsetOuterCell;
/**
* required to set up the test pivot tables and cell reference, either by name or reference.
* @see junit.framework.TestCase#setUp()
*/
@Before @Before
public void setUp(){ public abstract void setUp();
wb = new XSSFWorkbook();
XSSFSheet sheet = wb.createSheet();
Row row1 = sheet.createRow(0);
// Create a cell and put a value in it.
Cell cell = row1.createCell(0);
cell.setCellValue("Names");
Cell cell2 = row1.createCell(1);
cell2.setCellValue("#");
Cell cell7 = row1.createCell(2);
cell7.setCellValue("Data");
Cell cell10 = row1.createCell(3);
cell10.setCellValue("Value");
Row row2 = sheet.createRow(1);
Cell cell3 = row2.createCell(0);
cell3.setCellValue("Jan");
Cell cell4 = row2.createCell(1);
cell4.setCellValue(10);
Cell cell8 = row2.createCell(2);
cell8.setCellValue("Apa");
Cell cell11 = row1.createCell(3);
cell11.setCellValue(11.11);
Row row3 = sheet.createRow(2);
Cell cell5 = row3.createCell(0);
cell5.setCellValue("Ben");
Cell cell6 = row3.createCell(1);
cell6.setCellValue(9);
Cell cell9 = row3.createCell(2);
cell9.setCellValue("Bepa");
Cell cell12 = row1.createCell(3);
cell12.setCellValue(12.12);
AreaReference source = new AreaReference("A1:C2", _testDataProvider.getSpreadsheetVersion());
pivotTable = sheet.createPivotTable(source, new CellReference("H5"));
XSSFSheet offsetSheet = wb.createSheet();
Row tableRow_1 = offsetSheet.createRow(1);
offsetOuterCell = tableRow_1.createCell(1);
offsetOuterCell.setCellValue(-1);
Cell tableCell_1_1 = tableRow_1.createCell(2);
tableCell_1_1.setCellValue("Row #");
Cell tableCell_1_2 = tableRow_1.createCell(3);
tableCell_1_2.setCellValue("Exponent");
Cell tableCell_1_3 = tableRow_1.createCell(4);
tableCell_1_3.setCellValue("10^Exponent");
Row tableRow_2 = offsetSheet.createRow(2);
Cell tableCell_2_1 = tableRow_2.createCell(2);
tableCell_2_1.setCellValue(0);
Cell tableCell_2_2 = tableRow_2.createCell(3);
tableCell_2_2.setCellValue(0);
Cell tableCell_2_3 = tableRow_2.createCell(4);
tableCell_2_3.setCellValue(1);
Row tableRow_3= offsetSheet.createRow(3);
Cell tableCell_3_1 = tableRow_3.createCell(2);
tableCell_3_1.setCellValue(1);
Cell tableCell_3_2 = tableRow_3.createCell(3);
tableCell_3_2.setCellValue(1);
Cell tableCell_3_3 = tableRow_3.createCell(4);
tableCell_3_3.setCellValue(10);
Row tableRow_4 = offsetSheet.createRow(4);
Cell tableCell_4_1 = tableRow_4.createCell(2);
tableCell_4_1.setCellValue(2);
Cell tableCell_4_2 = tableRow_4.createCell(3);
tableCell_4_2.setCellValue(2);
Cell tableCell_4_3 = tableRow_4.createCell(4);
tableCell_4_3.setCellValue(100);
AreaReference offsetSource = new AreaReference(new CellReference("C2"), new CellReference("E4"));
offsetPivotTable = offsetSheet.createPivotTable(offsetSource, new CellReference("C6"));
}
@After @After
public void tearDown() throws IOException { public void tearDown() throws IOException {
if (wb != null) {
XSSFWorkbook wb2 = _testDataProvider.writeOutAndReadBack(wb); XSSFWorkbook wb2 = _testDataProvider.writeOutAndReadBack(wb);
wb.close(); wb.close();
wb2.close(); wb2.close();
} }
}
/** /**
* Verify that when creating a row label it's created on the correct row * Verify that when creating a row label it's created on the correct row
@ -155,6 +82,7 @@ public class TestXSSFPivotTable {
assertEquals(0, (int)pivotTable.getRowLabelColumns().get(0)); assertEquals(0, (int)pivotTable.getRowLabelColumns().get(0));
assertEquals(1, (int)pivotTable.getRowLabelColumns().get(1)); assertEquals(1, (int)pivotTable.getRowLabelColumns().get(1));
} }
/** /**
* Verify that it's not possible to create a row label outside of the referenced area. * Verify that it's not possible to create a row label outside of the referenced area.
*/ */
@ -314,6 +242,7 @@ public class TestXSSFPivotTable {
/** /**
* Verify that it's possible to create a new filter * Verify that it's possible to create a new filter
*/ */
@Test
public void testAddReportFilter() { public void testAddReportFilter() {
int columnIndex = 0; int columnIndex = 0;

View File

@ -0,0 +1,112 @@
/* ====================================================================
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.xssf.usermodel;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.util.CellReference;
import org.junit.Before;
/**
* Test pivot tables created by named range
*/
public class TestXSSFPivotTableName extends BaseTestXSSFPivotTable {
@Override
@Before
public void setUp(){
wb = new XSSFWorkbook();
XSSFSheet sheet = wb.createSheet();
Row row1 = sheet.createRow(0);
// Create a cell and put a value in it.
Cell cell = row1.createCell(0);
cell.setCellValue("Names");
Cell cell2 = row1.createCell(1);
cell2.setCellValue("#");
Cell cell7 = row1.createCell(2);
cell7.setCellValue("Data");
Cell cell10 = row1.createCell(3);
cell10.setCellValue("Value");
Row row2 = sheet.createRow(1);
Cell cell3 = row2.createCell(0);
cell3.setCellValue("Jan");
Cell cell4 = row2.createCell(1);
cell4.setCellValue(10);
Cell cell8 = row2.createCell(2);
cell8.setCellValue("Apa");
Cell cell11 = row1.createCell(3);
cell11.setCellValue(11.11);
Row row3 = sheet.createRow(2);
Cell cell5 = row3.createCell(0);
cell5.setCellValue("Ben");
Cell cell6 = row3.createCell(1);
cell6.setCellValue(9);
Cell cell9 = row3.createCell(2);
cell9.setCellValue("Bepa");
Cell cell12 = row1.createCell(3);
cell12.setCellValue(12.12);
XSSFName namedRange = sheet.getWorkbook().createName();
namedRange.setRefersToFormula(sheet.getSheetName() + "!" + "A1:C2");
pivotTable = sheet.createPivotTable(namedRange, new CellReference("H5"));
XSSFSheet offsetSheet = wb.createSheet();
Row tableRow_1 = offsetSheet.createRow(1);
offsetOuterCell = tableRow_1.createCell(1);
offsetOuterCell.setCellValue(-1);
Cell tableCell_1_1 = tableRow_1.createCell(2);
tableCell_1_1.setCellValue("Row #");
Cell tableCell_1_2 = tableRow_1.createCell(3);
tableCell_1_2.setCellValue("Exponent");
Cell tableCell_1_3 = tableRow_1.createCell(4);
tableCell_1_3.setCellValue("10^Exponent");
Row tableRow_2 = offsetSheet.createRow(2);
Cell tableCell_2_1 = tableRow_2.createCell(2);
tableCell_2_1.setCellValue(0);
Cell tableCell_2_2 = tableRow_2.createCell(3);
tableCell_2_2.setCellValue(0);
Cell tableCell_2_3 = tableRow_2.createCell(4);
tableCell_2_3.setCellValue(1);
Row tableRow_3= offsetSheet.createRow(3);
Cell tableCell_3_1 = tableRow_3.createCell(2);
tableCell_3_1.setCellValue(1);
Cell tableCell_3_2 = tableRow_3.createCell(3);
tableCell_3_2.setCellValue(1);
Cell tableCell_3_3 = tableRow_3.createCell(4);
tableCell_3_3.setCellValue(10);
Row tableRow_4 = offsetSheet.createRow(4);
Cell tableCell_4_1 = tableRow_4.createCell(2);
tableCell_4_1.setCellValue(2);
Cell tableCell_4_2 = tableRow_4.createCell(3);
tableCell_4_2.setCellValue(2);
Cell tableCell_4_3 = tableRow_4.createCell(4);
tableCell_4_3.setCellValue(100);
namedRange = sheet.getWorkbook().createName();
namedRange.setRefersToFormula("C2:E4");
namedRange.setSheetIndex(sheet.getWorkbook().getSheetIndex(sheet));
offsetPivotTable = offsetSheet.createPivotTable(namedRange, new CellReference("C6"));
}
}

View File

@ -0,0 +1,111 @@
/* ====================================================================
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.xssf.usermodel;
import org.apache.poi.ss.SpreadsheetVersion;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.util.AreaReference;
import org.apache.poi.ss.util.CellReference;
import org.junit.Before;
/**
* Test pivot tables created by area reference
*/
public class TestXSSFPivotTableRef extends BaseTestXSSFPivotTable {
@Override
@Before
public void setUp(){
wb = new XSSFWorkbook();
XSSFSheet sheet = wb.createSheet();
Row row1 = sheet.createRow(0);
// Create a cell and put a value in it.
Cell cell = row1.createCell(0);
cell.setCellValue("Names");
Cell cell2 = row1.createCell(1);
cell2.setCellValue("#");
Cell cell7 = row1.createCell(2);
cell7.setCellValue("Data");
Cell cell10 = row1.createCell(3);
cell10.setCellValue("Value");
Row row2 = sheet.createRow(1);
Cell cell3 = row2.createCell(0);
cell3.setCellValue("Jan");
Cell cell4 = row2.createCell(1);
cell4.setCellValue(10);
Cell cell8 = row2.createCell(2);
cell8.setCellValue("Apa");
Cell cell11 = row1.createCell(3);
cell11.setCellValue(11.11);
Row row3 = sheet.createRow(2);
Cell cell5 = row3.createCell(0);
cell5.setCellValue("Ben");
Cell cell6 = row3.createCell(1);
cell6.setCellValue(9);
Cell cell9 = row3.createCell(2);
cell9.setCellValue("Bepa");
Cell cell12 = row1.createCell(3);
cell12.setCellValue(12.12);
AreaReference source = new AreaReference("A1:C2", SpreadsheetVersion.EXCEL2007);
pivotTable = sheet.createPivotTable(source, new CellReference("H5"));
XSSFSheet offsetSheet = wb.createSheet();
Row tableRow_1 = offsetSheet.createRow(1);
offsetOuterCell = tableRow_1.createCell(1);
offsetOuterCell.setCellValue(-1);
Cell tableCell_1_1 = tableRow_1.createCell(2);
tableCell_1_1.setCellValue("Row #");
Cell tableCell_1_2 = tableRow_1.createCell(3);
tableCell_1_2.setCellValue("Exponent");
Cell tableCell_1_3 = tableRow_1.createCell(4);
tableCell_1_3.setCellValue("10^Exponent");
Row tableRow_2 = offsetSheet.createRow(2);
Cell tableCell_2_1 = tableRow_2.createCell(2);
tableCell_2_1.setCellValue(0);
Cell tableCell_2_2 = tableRow_2.createCell(3);
tableCell_2_2.setCellValue(0);
Cell tableCell_2_3 = tableRow_2.createCell(4);
tableCell_2_3.setCellValue(1);
Row tableRow_3= offsetSheet.createRow(3);
Cell tableCell_3_1 = tableRow_3.createCell(2);
tableCell_3_1.setCellValue(1);
Cell tableCell_3_2 = tableRow_3.createCell(3);
tableCell_3_2.setCellValue(1);
Cell tableCell_3_3 = tableRow_3.createCell(4);
tableCell_3_3.setCellValue(10);
Row tableRow_4 = offsetSheet.createRow(4);
Cell tableCell_4_1 = tableRow_4.createCell(2);
tableCell_4_1.setCellValue(2);
Cell tableCell_4_2 = tableRow_4.createCell(3);
tableCell_4_2.setCellValue(2);
Cell tableCell_4_3 = tableRow_4.createCell(4);
tableCell_4_3.setCellValue(100);
AreaReference offsetSource = new AreaReference(new CellReference("C2"), new CellReference("E4"));
offsetPivotTable = offsetSheet.createPivotTable(offsetSource, new CellReference("C6"));
}
}