diff --git a/src/java/org/apache/poi/hssf/model/Workbook.java b/src/java/org/apache/poi/hssf/model/Workbook.java
index 64b0714f8..f622707d3 100644
--- a/src/java/org/apache/poi/hssf/model/Workbook.java
+++ b/src/java/org/apache/poi/hssf/model/Workbook.java
@@ -335,6 +335,29 @@ public class Workbook implements Model {
return retval;
}
+
+ /**Retrieves the Builtin NameRecord that matches the name and index
+ * There shouldn't be too many names to make the sequential search too slow
+ * @param name byte representation of the builtin name to match
+ * @param sheetIndex zero-based sheet reference
+ * @return null if no builtin NameRecord matches
+ */
+ public NameRecord getSpecificBuiltinRecord(byte name, int sheetIndex)
+ {
+ Iterator iterator = names.iterator();
+ while (iterator.hasNext()) {
+ NameRecord record = ( NameRecord ) iterator.next();
+
+ //print areas are one based
+ if (record.getBuiltInName() == name && record.getIndexToSheet() == sheetIndex) {
+ return record;
+ }
+ }
+
+ return null;
+
+ }
+
public int getNumRecords() {
return records.size();
}
@@ -1817,6 +1840,7 @@ public class Workbook implements Model {
return name;
}
+
/** creates new name
* @return new name record
*/
@@ -1832,6 +1856,22 @@ public class Workbook implements Model {
return name;
}
+ /**Generates a NameRecord to represent a built-in region
+ * @return a new NameRecord unless the index is invalid
+ */
+ public NameRecord createBuiltInName(byte builtInName, int index)
+ {
+ if (index == -1 || index+1 > (int)Short.MAX_VALUE)
+ throw new IllegalArgumentException("Index is not valid ["+index+"]");
+
+ NameRecord name = new NameRecord(builtInName, (short)(index));
+
+ addName(name);
+
+ return name;
+ }
+
+
/** removes the name
* @param namenum name index
*/
@@ -2018,4 +2058,7 @@ public class Workbook implements Model {
}
return palette;
}
+
+
}
+
diff --git a/src/java/org/apache/poi/hssf/model/WorkbookRecordList.java b/src/java/org/apache/poi/hssf/model/WorkbookRecordList.java
index a846d6753..8140119de 100644
--- a/src/java/org/apache/poi/hssf/model/WorkbookRecordList.java
+++ b/src/java/org/apache/poi/hssf/model/WorkbookRecordList.java
@@ -1,10 +1,65 @@
+
+/* ====================================================================
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2002 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Apache" and "Apache Software Foundation" and
+ * "Apache POI" must not be used to endorse or promote products
+ * derived from this software without prior written permission. For
+ * written permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * "Apache POI", nor may "Apache" appear in their name, without
+ * prior written permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ *
+ * i.e. Reference = Sheet2!$A$1:$B$2 + * @param sheetIndex Zero-based sheet index (0 Represents the first sheet to keep consistent with java) + * @param reference Valid name Reference for the Print Area + */ + public void setPrintArea(int sheetIndex, String reference) + { + NameRecord name = workbook.getSpecificBuiltinRecord(NameRecord.BUILTIN_PRINT_AREA, sheetIndex+1); + + + if (name == null) + name = workbook.createBuiltInName(NameRecord.BUILTIN_PRINT_AREA, sheetIndex+1); + //adding one here because 0 indicates a global named region; doesnt make sense for print areas + + HSSFName nameWrapper = new HSSFName(workbook, name); + //the external name does some housekeeping, refactor to lower level? + + nameWrapper.setReference(reference); + } + + + /** + * Retrieves the reference for the printarea of the specified sheet + * @param sheetIndex Zero-based sheet index (0 Represents the first sheet to keep consistent with java) + * @return String Null if no print area has been defined + */ + public String getPrintArea(int sheetIndex) + { + NameRecord name = workbook.getSpecificBuiltinRecord(NameRecord.BUILTIN_PRINT_AREA, sheetIndex+1); + if (name == null) return null; + //adding one here because 0 indicates a global named region; doesnt make sense for print areas + + return name.getAreaReference(workbook.getSheetReferences()); + } + /** creates a new named range and add it to the model * @return named range high level diff --git a/src/java/org/apache/poi/hssf/util/RangeAddress.java b/src/java/org/apache/poi/hssf/util/RangeAddress.java index 05d5877d6..33841262c 100644 --- a/src/java/org/apache/poi/hssf/util/RangeAddress.java +++ b/src/java/org/apache/poi/hssf/util/RangeAddress.java @@ -62,7 +62,7 @@ package org.apache.poi.hssf.util; * * REFERENCE:
* @author IgOr KaTz && EuGeNe BuMaGiN (Tal Moshaiov) (VistaPortal LDT.) - * @version 1.0 +@version 1.0 */ public class RangeAddress { @@ -72,7 +72,13 @@ public class RangeAddress { String m_sheetName; String m_cellFrom; String m_cellTo; - + + /** + * Accepts an external reference from excel. + *
+ * i.e. Sheet1!$A$4:$B$9
+ * @param _url
+ */
public RangeAddress (String _url) {
init (_url);
}
@@ -82,10 +88,14 @@ public class RangeAddress {
+ numTo26Sys (_endCol) + _endRow);
}
+ /**
+ *
+ * @return String note: All absolute references are removed
+ */
public String getAddress (){
String result = "";
if(m_sheetName != null)
- result += m_sheetName;
+ result += m_sheetName+"!";
if(m_cellFrom != null){
result += m_cellFrom;
if(m_cellTo != null)
@@ -94,6 +104,7 @@ public class RangeAddress {
return result;
}
+
public String getSheetName (){
return m_sheetName;
}
@@ -231,21 +242,21 @@ public class RangeAddress {
if (index >= 0) {
String fromStr = _url.substring(0, index);
String toStr = _url.substring(index+1);
- index = fromStr.indexOf('.');
+ index = fromStr.indexOf('!');
if (index >= 0) {
result[0] = fromStr.substring(0, index);
result[1] = fromStr.substring(index+1);
} else {
result[1] = fromStr;
}
- index = toStr.indexOf('.');
+ index = toStr.indexOf('!');
if (index >= 0) {
result[2] = toStr.substring(index+1);
} else {
result[2] = toStr;
}
} else {
- index = _url.indexOf('.');
+ index = _url.indexOf('!');
if (index >= 0) {
result[0] = _url.substring(0, index);
result[1] = _url.substring(index+1);
diff --git a/src/testcases/org/apache/poi/hssf/HSSFTests.java b/src/testcases/org/apache/poi/hssf/HSSFTests.java
index 6882169e6..ca43bfdb3 100644
--- a/src/testcases/org/apache/poi/hssf/HSSFTests.java
+++ b/src/testcases/org/apache/poi/hssf/HSSFTests.java
@@ -63,6 +63,7 @@ import org.apache.poi.hssf.usermodel.TestWorkbook;
import org.apache.poi.hssf.util.TestAreaReference;
import org.apache.poi.hssf.util.TestCellReference;
import org.apache.poi.hssf.util.TestRKUtil;
+import org.apache.poi.hssf.util.TestRangeAddress;
import org.apache.poi.hssf.util.TestSheetReferences;
/**
@@ -144,6 +145,7 @@ public class HSSFTests
suite.addTest(new TestSuite(TestRowRecordsAggregate.class));
suite.addTest(new TestSuite(TestAreaReference.class));
suite.addTest(new TestSuite(TestCellReference.class));
+ suite.addTest(new TestSuite(TestRangeAddress.class));
suite.addTest(new TestSuite(TestRKUtil.class));
suite.addTest(new TestSuite(TestSheetReferences.class));
diff --git a/src/testcases/org/apache/poi/hssf/data/SimpleWithPrintArea.xls b/src/testcases/org/apache/poi/hssf/data/SimpleWithPrintArea.xls
new file mode 100755
index 000000000..0434dbcc8
Binary files /dev/null and b/src/testcases/org/apache/poi/hssf/data/SimpleWithPrintArea.xls differ
diff --git a/src/testcases/org/apache/poi/hssf/data/namedinput.xls b/src/testcases/org/apache/poi/hssf/data/namedinput.xls
new file mode 100755
index 000000000..115fcd590
Binary files /dev/null and b/src/testcases/org/apache/poi/hssf/data/namedinput.xls differ
diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFCell.java b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFCell.java
index 5953c7d48..f81bd5a76 100644
--- a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFCell.java
+++ b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFCell.java
@@ -232,7 +232,7 @@ extends TestCase {
throws java.io.IOException {
String readFilename = System.getProperty("HSSF.testdata.path");
- File file = File.createTempFile("testBoolErr",".xls");
+ File file = File.createTempFile("testFormulaStyle",".xls");
FileOutputStream out = new FileOutputStream(file);
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet s = wb.createSheet("Sheet1");
diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestNamedRange.java b/src/testcases/org/apache/poi/hssf/usermodel/TestNamedRange.java
index 3f76ec7ba..d7f4f5f44 100644
--- a/src/testcases/org/apache/poi/hssf/usermodel/TestNamedRange.java
+++ b/src/testcases/org/apache/poi/hssf/usermodel/TestNamedRange.java
@@ -1,27 +1,75 @@
-/*
- * RangeTestTest.java
- * NetBeans JUnit based test
+
+/* ====================================================================
+ * The Apache Software License, Version 1.1
*
- * Created on April 21, 2002, 6:23 PM
+ * Copyright (c) 2002 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Apache" and "Apache Software Foundation" and
+ * "Apache POI" must not be used to endorse or promote products
+ * derived from this software without prior written permission. For
+ * written permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * "Apache POI", nor may "Apache" appear in their name, without
+ * prior written permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ *
+ * Addresses Bug #9632 + */ + public void testNamedRead() throws IOException + { + FileInputStream fis = null; + POIFSFileSystem fs = null; + HSSFWorkbook wb = null; + + String filename = System.getProperty("HSSF.testdata.path"); + + filename = filename + "/namedinput.xls"; + + + fis = new FileInputStream(filename); + fs = new POIFSFileSystem(fis); + wb = new HSSFWorkbook(fs); + + //Get index of the namedrange with the name = "NamedRangeName" , which was defined in input.xls as A1:D10 + int NamedRangeIndex = wb.getNameIndex("NamedRangeName"); + + //Getting NAmed Range + HSSFName namedRange1 = wb.getNameAt(NamedRangeIndex); + String sheetName = wb.getSheetName(0); + + //Getting its reference + String reference = namedRange1.getReference(); + + fis.close(); + + assertEquals(sheetName+"!$A$1:$D$10", reference); + + HSSFName namedRange2 = wb.getNameAt(1); + + assertEquals(sheetName+"!$D$17:$G$27", namedRange2.getReference()); + assertEquals("SecondNamedRange", namedRange2.getNameName()); + + } + + /** + * Reads an excel file already containing a named range and updates it + *
+ * Addresses Bug #16411 + */ + public void testNamedReadModify() throws IOException + { + FileInputStream fis = null; + POIFSFileSystem fs = null; + HSSFWorkbook wb = null; + + String filename = System.getProperty("HSSF.testdata.path"); + + filename = filename + "/namedinput.xls"; + + + fis = new FileInputStream(filename); + fs = new POIFSFileSystem(fis); + wb = new HSSFWorkbook(fs); + + + HSSFName name = wb.getNameAt(0); + String sheetName = wb.getSheetName(0); + + assertEquals(sheetName+"!$A$1:$D$10", name.getReference()); + + name = wb.getNameAt(1); + String newReference = sheetName +"!$A$1:$C$36"; + + name.setReference(newReference); + assertEquals(newReference, name.getReference()); + + } + + /** + * Test that multiple named ranges can be added written and read + */ + public void testMultipleNamedWrite() + throws IOException + { + HSSFWorkbook wb = new HSSFWorkbook(); + + + HSSFSheet sheet = wb.createSheet("Sheet1"); + String sheetName = wb.getSheetName(0); + + assertEquals("Sheet1", sheetName); + + //Creating new Named Range + HSSFName newNamedRange = wb.createName(); + + newNamedRange.setNameName("RangeTest"); + newNamedRange.setReference(sheetName + "!$D$4:$E$8"); + + //Creating another new Named Range + HSSFName newNamedRange2 = wb.createName(); + + newNamedRange2.setNameName("AnotherTest"); + newNamedRange2.setReference(sheetName + "!$F$1:$G$6"); + + + HSSFName namedRange1 = wb.getNameAt(0); + String referece = namedRange1.getReference(); + + File file = File.createTempFile("testMultiNamedRange", ".xls"); + + FileOutputStream fileOut = new FileOutputStream(file); + wb.write(fileOut); + fileOut.close(); + + + assertTrue("file exists",file.exists()); + + + FileInputStream in = new FileInputStream(file); + wb = new HSSFWorkbook(in); + HSSFName nm =wb.getNameAt(wb.getNameIndex("RangeTest")); + assertTrue("Name is "+nm.getNameName(),"RangeTest".equals(nm.getNameName())); + assertTrue("Reference is "+nm.getReference(),(wb.getSheetName(0)+"!$D$4:$E$8").equals(nm.getReference())); + + nm = wb.getNameAt(wb.getNameIndex("AnotherTest")); + assertTrue("Name is "+nm.getNameName(),"AnotherTest".equals(nm.getNameName())); + assertTrue("Reference is "+nm.getReference(),newNamedRange2.getReference().equals(nm.getReference())); + + + } + + /** + * Test case provided by czhang@cambian.com (Chun Zhang) + *
+ * Addresses Bug #13775
+ * @throws IOException
+ */
+ public void testMultiNamedRange()
+ throws IOException
+ {
+
+ // Create a new workbook
+ HSSFWorkbook wb = new HSSFWorkbook ();
+
+
+ // Create a worksheet 'sheet1' in the new workbook
+ wb.createSheet ();
+ wb.setSheetName (0, "sheet1");
+
+ // Create another worksheet 'sheet2' in the new workbook
+ wb.createSheet ();
+ wb.setSheetName (1, "sheet2");
+
+ // Create a new named range for worksheet 'sheet1'
+ HSSFName namedRange1 = wb.createName();
+
+ // Set the name for the named range for worksheet 'sheet1'
+ namedRange1.setNameName("RangeTest1");
+
+ // Set the reference for the named range for worksheet 'sheet1'
+ namedRange1.setReference("sheet1" + "!$A$1:$L$41");
+
+ // Create a new named range for worksheet 'sheet2'
+ HSSFName namedRange2 = wb.createName();
+
+ // Set the name for the named range for worksheet 'sheet2'
+ namedRange2.setNameName("RangeTest2");
+
+ // Set the reference for the named range for worksheet 'sheet2'
+ namedRange2.setReference("sheet2" + "!$A$1:$O$21");
+
+ // Write the workbook to a file
+ File file = File.createTempFile("testMuiltipletNamedRanges", ".xls");
+ FileOutputStream fileOut = new FileOutputStream(file);
+ wb.write(fileOut);
+ fileOut.close();
+
+ assertTrue("file exists",file.exists());
+
+ // Read the Excel file and verify its content
+ FileInputStream in = new FileInputStream(file);
+ wb = new HSSFWorkbook(in);
+ HSSFName nm1 =wb.getNameAt(wb.getNameIndex("RangeTest1"));
+ assertTrue("Name is "+nm1.getNameName(),"RangeTest1".equals(nm1.getNameName()));
+ assertTrue("Reference is "+nm1.getReference(),(wb.getSheetName(0)+"!$A$1:$L$41").equals(nm1.getReference()));
+
+ HSSFName nm2 =wb.getNameAt(wb.getNameIndex("RangeTest2"));
+ assertTrue("Name is "+nm2.getNameName(),"RangeTest2".equals(nm2.getNameName()));
+ assertTrue("Reference is "+nm2.getReference(),(wb.getSheetName(1)+"!$A$1:$O$21").equals(nm2.getReference()));
+ }
+
+
+ /**
+ * Test to see if the print areas can be retrieved/created in memory
+ */
+ public void testSinglePrintArea()
+ {
+ HSSFWorkbook workbook = new HSSFWorkbook();
+ HSSFSheet sheet = workbook.createSheet("Test Print Area");
+ String sheetName = workbook.getSheetName(0);
+
+ String reference = sheetName+"!$A$1:$B$1";
+ workbook.setPrintArea(0, reference);
+
+ String retrievedPrintArea = workbook.getPrintArea(0);
+
+ assertNotNull("Print Area not defined for first sheet", retrievedPrintArea);
+ assertEquals(reference, retrievedPrintArea);
+
+ }
+
+ /**
+ * Test to see if the print area can be retrieved from an excel created file
+ */
+ public void testPrintAreaFileRead()
+ throws IOException
+ {
+ FileInputStream fis = null;
+ POIFSFileSystem fs = null;
+ HSSFWorkbook workbook = null;
+
+ String filename = System.getProperty("HSSF.testdata.path");
+
+ filename = filename + "/SimpleWithPrintArea.xls";
+
+ try {
+
+ fis = new FileInputStream(filename);
+ fs = new POIFSFileSystem(fis);
+ workbook = new HSSFWorkbook(fs);
+
+ String sheetName = workbook.getSheetName(0);
+ String reference = sheetName+"!$A$1:$C$5";
+
+ assertEquals(reference, workbook.getPrintArea(0));
+
+ } finally {
+ fis.close();
+
+ }
+
+
+
+ }
+
+
+ /**
+ * Test to see if the print area made it to the file
+ */
+ public void testPrintAreaFile()
+ throws IOException
+ {
+ HSSFWorkbook workbook = new HSSFWorkbook();
+ HSSFSheet sheet = workbook.createSheet("Test Print Area");
+ String sheetName = workbook.getSheetName(0);
+
+
+ String reference = sheetName+"!$A$1:$B$1";
+ workbook.setPrintArea(0, reference);
+
+ File file = File.createTempFile("testPrintArea",".xls");
+
+ FileOutputStream fileOut = new FileOutputStream(file);
+ workbook.write(fileOut);
+ fileOut.close();
+
+ assertTrue("file exists",file.exists());
+
+ FileInputStream in = new FileInputStream(file);
+ workbook = new HSSFWorkbook(in);
+
+ String retrievedPrintArea = workbook.getPrintArea(0);
+ assertNotNull("Print Area not defined for first sheet", retrievedPrintArea);
+ assertEquals("References Match", reference, retrievedPrintArea);
+
+ }
+
+ /**
+ * Test to see if multiple print areas made it to the file
+ */
+ public void testMultiplePrintAreaFile()
+ throws IOException
+ {
+ HSSFWorkbook workbook = new HSSFWorkbook();
+
+ HSSFSheet sheet = workbook.createSheet("Sheet 1");
+ sheet = workbook.createSheet("Sheet 2");
+ sheet = workbook.createSheet("Sheet 3");
+
+ String sheetName = workbook.getSheetName(0);
+ String reference = null;
+
+ reference = sheetName+"!$A$1:$B$1";
+ workbook.setPrintArea(0, reference);
+
+ sheetName = workbook.getSheetName(1);
+ String reference2 = sheetName+"!$B$2:$D$5";
+ workbook.setPrintArea(1, reference2);
+
+ sheetName = workbook.getSheetName(2);
+ String reference3 = sheetName+"!$D$2:$F$5";
+ workbook.setPrintArea(2, reference3);
+
+ File file = File.createTempFile("testMultiPrintArea",".xls");
+
+ FileOutputStream fileOut = new FileOutputStream(file);
+ workbook.write(fileOut);
+ fileOut.close();
+
+ assertTrue("file exists",file.exists());
+
+ FileInputStream in = new FileInputStream(file);
+ workbook = new HSSFWorkbook(in);
+
+ String retrievedPrintArea = workbook.getPrintArea(0);
+ assertNotNull("Print Area Not Found (Sheet 1)", retrievedPrintArea);
+ assertEquals(reference, retrievedPrintArea);
+
+ String retrievedPrintArea2 = workbook.getPrintArea(1);
+ assertNotNull("Print Area Not Found (Sheet 2)", retrievedPrintArea2);
+ assertEquals(reference2, retrievedPrintArea2);
+
+ String retrievedPrintArea3 = workbook.getPrintArea(2);
+ assertNotNull("Print Area Not Found (Sheet 3)", retrievedPrintArea3);
+ assertEquals(reference3, retrievedPrintArea3);
+
+
+ }
}
diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestWorkbook.java b/src/testcases/org/apache/poi/hssf/usermodel/TestWorkbook.java
index 845e49b44..9a0f4f8da 100644
--- a/src/testcases/org/apache/poi/hssf/usermodel/TestWorkbook.java
+++ b/src/testcases/org/apache/poi/hssf/usermodel/TestWorkbook.java
@@ -55,19 +55,21 @@
package org.apache.poi.hssf.usermodel;
-import java.io.*;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Iterator;
-import java.util.*;
+import junit.framework.TestCase;
-import junit.framework.*;
-
-import org.apache.poi.poifs.filesystem.POIFSFileSystem;
-import org.apache.poi.hssf.util.*;
import org.apache.poi.hssf.model.Workbook;
import org.apache.poi.hssf.record.BackupRecord;
import org.apache.poi.hssf.record.LabelSSTRecord;
import org.apache.poi.hssf.record.Record;
import org.apache.poi.hssf.record.aggregates.ValueRecordsAggregate;
+import org.apache.poi.hssf.util.Region;
+import org.apache.poi.poifs.filesystem.POIFSFileSystem;
/**
* Class to test Workbook functionality
@@ -720,6 +722,35 @@ public class TestWorkbook
file.deleteOnExit();
}
+ /**
+ * Generate a file to visually/programmatically verify repeating rows and cols made it
+ */
+ public void testRepeatingColsRows() throws IOException
+ {
+ HSSFWorkbook workbook = new HSSFWorkbook();
+ HSSFSheet sheet = workbook.createSheet("Test Print Titles");
+ String sheetName = workbook.getSheetName(0);
+
+ HSSFRow row = sheet.createRow(0);
+
+ HSSFCell cell = row.createCell((short)1);
+ cell.setCellValue("hi");
+
+
+ workbook.setRepeatingRowsAndColumns(0, 0, 1, 0, 0);
+
+ File file = File.createTempFile("testPrintTitles",".xls");
+
+ FileOutputStream fileOut = new FileOutputStream(file);
+ workbook.write(fileOut);
+ fileOut.close();
+
+ assertTrue("file exists",file.exists());
+
+
+ }
+
+
public static void main(String [] ignored_args)
{
String filename = System.getProperty("HSSF.testdata.path");
diff --git a/src/testcases/org/apache/poi/hssf/util/TestRangeAddress.java b/src/testcases/org/apache/poi/hssf/util/TestRangeAddress.java
new file mode 100755
index 000000000..9c9280d6d
--- /dev/null
+++ b/src/testcases/org/apache/poi/hssf/util/TestRangeAddress.java
@@ -0,0 +1,81 @@
+/* ====================================================================
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2002 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Apache" and "Apache Software Foundation" and
+ * "Apache POI" must not be used to endorse or promote products
+ * derived from this software without prior written permission. For
+ * written permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * "Apache POI", nor may "Apache" appear in their name, without
+ * prior written permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ *