git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1761537 13f79535-47bb-0310-9956-ffa450edef68pull/38/head
@@ -78,7 +78,7 @@ under the License. | |||
JVM system properties for running tests, | |||
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="java.awt.headless" value="true"/> | |||
<property name="additionaljar" value=""/> |
@@ -28,10 +28,13 @@ import javax.xml.namespace.QName; | |||
import org.apache.poi.POIXMLDocumentPart; | |||
import org.apache.poi.openxml4j.opc.PackagePart; | |||
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.CellType; | |||
import org.apache.poi.ss.usermodel.Name; | |||
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.util.AreaReference; | |||
import org.apache.poi.ss.util.CellReference; | |||
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.CTCacheFields; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotCacheDefinition; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheetSource; | |||
public class XSSFPivotCacheDefinition extends POIXMLDocumentPart{ | |||
@@ -116,6 +120,40 @@ public class XSSFPivotCacheDefinition extends POIXMLDocumentPart{ | |||
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. | |||
* @param sheet The sheet where the data i collected from | |||
@@ -123,7 +161,7 @@ public class XSSFPivotCacheDefinition extends POIXMLDocumentPart{ | |||
@Beta | |||
protected void createCacheFields(Sheet sheet) { | |||
//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 lastCell = ar.getLastCell(); | |||
int columnStart = firstCell.getCol(); |
@@ -30,11 +30,11 @@ import javax.xml.namespace.QName; | |||
import org.apache.poi.POIXMLDocumentPart; | |||
import org.apache.poi.openxml4j.opc.PackagePart; | |||
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.CellType; | |||
import org.apache.poi.ss.usermodel.DataConsolidateFunction; | |||
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.CellReference; | |||
import org.apache.poi.util.Beta; | |||
@@ -214,13 +214,8 @@ public class XSSFPivotTable extends POIXMLDocumentPart { | |||
} | |||
protected AreaReference getPivotArea() { | |||
AreaReference pivotArea = new AreaReference( | |||
getPivotCacheDefinition() | |||
.getCTPivotCacheDefinition() | |||
.getCacheSource() | |||
.getWorksheetSource() | |||
.getRef(), | |||
SpreadsheetVersion.EXCEL2007); | |||
final Workbook wb = getDataSheet().getWorkbook(); | |||
AreaReference pivotArea = getPivotCacheDefinition().getPivotArea(wb); | |||
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 | |||
* @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 sourceSheet Sheet where the source will be collected from | |||
*/ | |||
@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. | |||
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()); | |||
setDataSheet(sourceSheet); | |||
String[] firstCell = source.getFirstCell().getCellRefParts(); | |||
String[] lastCell = source.getLastCell().getCellRefParts(); | |||
worksheetSource.setRef(firstCell[2]+firstCell[1]+':'+lastCell[2]+lastCell[1]); | |||
refConfig.configureReference(worksheetSource); | |||
if (worksheetSource.getName() == null && worksheetSource.getRef() == null) throw new IllegalArgumentException("Pivot table source area reference or name must be specified."); | |||
} | |||
@Beta | |||
@@ -465,11 +461,20 @@ public class XSSFPivotTable extends POIXMLDocumentPart { | |||
int firstColumn = sourceArea.getFirstCell().getCol(); | |||
int lastColumn = sourceArea.getLastCell().getCol(); | |||
CTPivotField pivotField; | |||
for(int i = 0; i<=lastColumn-firstColumn; i++) { | |||
for(int i = firstColumn; i<=lastColumn; i++) { | |||
pivotField = pivotFields.addNewPivotField(); | |||
pivotField.setDataField(false); | |||
pivotField.setShowAll(false); | |||
} | |||
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); | |||
} | |||
} |
@@ -64,8 +64,10 @@ import org.apache.poi.ss.usermodel.Footer; | |||
import org.apache.poi.ss.usermodel.Header; | |||
import org.apache.poi.ss.usermodel.IgnoredErrorType; | |||
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.Sheet; | |||
import org.apache.poi.ss.usermodel.Table; | |||
import org.apache.poi.ss.util.AreaReference; | |||
import org.apache.poi.ss.util.CellAddress; | |||
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.Removal; | |||
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.XSSFIgnoredErrorHelper; | |||
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 | |||
* @param source Area from where data will be collected | |||
* @param position A reference to the cell where the table will start | |||
* @param sourceSheet The sheet where source will be collected from | |||
* Create a pivot table using the AreaReference range 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(AreaReference source, CellReference position, Sheet sourceSheet) { | |||
public XSSFPivotTable createPivotTable(final AreaReference source, CellReference position, Sheet sourceSheet) { | |||
final String sourceSheetName = source.getFirstCell().getSheetName(); | |||
if(sourceSheetName != null && !sourceSheetName.equalsIgnoreCase(sourceSheet.getSheetName())) { | |||
throw new IllegalArgumentException("The area is referenced in another sheet than the " | |||
+ "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(); | |||
//Creates default settings for the pivot table | |||
pivotTable.setDefaultPivotTableDefinition(); | |||
//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.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 | |||
* @param source Area from where data will be collected | |||
* @param position A reference to the cell where the table will start | |||
* Create a pivot table using the AreaReference 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 | |||
@@ -4201,6 +4234,57 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { | |||
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 | |||
*/ |
@@ -16,16 +16,13 @@ | |||
==================================================================== */ | |||
package org.apache.poi.xssf.usermodel; | |||
import static org.junit.Assert.assertEquals; | |||
import static org.junit.Assert.assertNotNull; | |||
import static org.junit.Assert.fail; | |||
import static org.junit.Assert.*; | |||
import java.io.IOException; | |||
import org.apache.poi.ss.usermodel.Cell; | |||
import org.apache.poi.ss.usermodel.CellType; | |||
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.CellReference; | |||
import org.apache.poi.xssf.XSSFITestDataProvider; | |||
@@ -38,97 +35,27 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotFields; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotTableDefinition; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STDataConsolidateFunction; | |||
public class TestXSSFPivotTable { | |||
public abstract class BaseTestXSSFPivotTable { | |||
private static final XSSFITestDataProvider _testDataProvider = XSSFITestDataProvider.instance; | |||
private XSSFWorkbook wb; | |||
private XSSFPivotTable pivotTable; | |||
private XSSFPivotTable offsetPivotTable; | |||
private Cell offsetOuterCell; | |||
protected XSSFWorkbook wb; | |||
protected XSSFPivotTable pivotTable; | |||
protected XSSFPivotTable offsetPivotTable; | |||
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 | |||
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", _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")); | |||
} | |||
public abstract void setUp(); | |||
@After | |||
public void tearDown() throws IOException { | |||
XSSFWorkbook wb2 = _testDataProvider.writeOutAndReadBack(wb); | |||
wb.close(); | |||
wb2.close(); | |||
if (wb != null) { | |||
XSSFWorkbook wb2 = _testDataProvider.writeOutAndReadBack(wb); | |||
wb.close(); | |||
wb2.close(); | |||
} | |||
} | |||
/** | |||
@@ -155,6 +82,7 @@ public class TestXSSFPivotTable { | |||
assertEquals(0, (int)pivotTable.getRowLabelColumns().get(0)); | |||
assertEquals(1, (int)pivotTable.getRowLabelColumns().get(1)); | |||
} | |||
/** | |||
* 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 | |||
*/ | |||
@Test | |||
public void testAddReportFilter() { | |||
int columnIndex = 0; | |||
@@ -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")); | |||
} | |||
} |
@@ -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")); | |||
} | |||
} |