41187 - fixed HSSFSheet to properly read xls files without ROW records
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@655278 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
0277016ab5
commit
c1a11a8b7c
@ -37,6 +37,7 @@
|
||||
|
||||
<!-- Don't forget to update status.xml too! -->
|
||||
<release version="3.1-beta2" date="2008-05-??">
|
||||
<action dev="POI-DEVELOPERS" type="fix">41187 - fixed HSSFSheet to properly read xls files without ROW records</action>
|
||||
<action dev="POI-DEVELOPERS" type="fix">44950 - fixed HSSFFormulaEvaluator.evaluateInCell() and Area3DEval.getValue() also added validation for number of elements in AreaEvals</action>
|
||||
<action dev="POI-DEVELOPERS" type="fix">42570 - fixed LabelRecord to use empty string instead of null when the length is zero.</action>
|
||||
<action dev="POI-DEVELOPERS" type="fix">42564 - fixed ArrayPtg to use ConstantValueParser. Fixed a few other ArrayPtg encoding issues.</action>
|
||||
|
@ -34,6 +34,7 @@
|
||||
<!-- Don't forget to update changes.xml too! -->
|
||||
<changes>
|
||||
<release version="3.1-beta2" date="2008-05-??">
|
||||
<action dev="POI-DEVELOPERS" type="fix">41187 - fixed HSSFSheet to properly read xls files without ROW records</action>
|
||||
<action dev="POI-DEVELOPERS" type="fix">44950 - fixed HSSFFormulaEvaluator.evaluateInCell() and Area3DEval.getValue() also added validation for number of elements in AreaEvals</action>
|
||||
<action dev="POI-DEVELOPERS" type="fix">42570 - fixed LabelRecord to use empty string instead of null when the length is zero.</action>
|
||||
<action dev="POI-DEVELOPERS" type="fix">42564 - fixed ArrayPtg to use ConstantValueParser. Fixed a few other ArrayPtg encoding issues.</action>
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,4 +1,3 @@
|
||||
|
||||
/* ====================================================================
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
@ -15,7 +14,6 @@
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
==================================================================== */
|
||||
|
||||
|
||||
package org.apache.poi.hssf.record;
|
||||
|
||||
@ -31,20 +29,18 @@ import org.apache.poi.util.LittleEndian;
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
* @version 2.0-pre
|
||||
*/
|
||||
|
||||
public class RowRecord
|
||||
extends Record
|
||||
implements Comparable
|
||||
{
|
||||
public final static short sid = 0x208;
|
||||
public final class RowRecord extends Record implements Comparable {
|
||||
public final static short sid = 0x208;
|
||||
|
||||
/** The maximum row number that excel can handle (zero bazed) ie 65536 rows is
|
||||
private static final int OPTION_BITS_ALWAYS_SET = 0x0100;
|
||||
private static final int DEFAULT_HEIGHT_BIT = 0x8000;
|
||||
|
||||
/** The maximum row number that excel can handle (zero based) ie 65536 rows is
|
||||
* max number of rows.
|
||||
*/
|
||||
public final static int MAX_ROW_NUMBER = 65535;
|
||||
|
||||
//private short field_1_row_number;
|
||||
private int field_1_row_number;
|
||||
private int field_1_row_number;
|
||||
private short field_2_first_col;
|
||||
private short field_3_last_col; // plus 1
|
||||
private short field_4_height;
|
||||
@ -52,7 +48,8 @@ public class RowRecord
|
||||
|
||||
// for generated sheets.
|
||||
private short field_6_reserved;
|
||||
private short field_7_option_flags;
|
||||
/** 16 bit options flags */
|
||||
private int field_7_option_flags;
|
||||
private static final BitField outlineLevel = BitFieldFactory.getInstance(0x07);
|
||||
|
||||
// bit 3 reserved
|
||||
@ -62,8 +59,17 @@ public class RowRecord
|
||||
private static final BitField formatted = BitFieldFactory.getInstance(0x80);
|
||||
private short field_8_xf_index; // only if isFormatted
|
||||
|
||||
public RowRecord()
|
||||
{
|
||||
public RowRecord(int rowNumber) {
|
||||
field_1_row_number = rowNumber;
|
||||
field_2_first_col = -1;
|
||||
field_3_last_col = -1;
|
||||
field_4_height = (short)DEFAULT_HEIGHT_BIT;
|
||||
field_4_height = (short)DEFAULT_HEIGHT_BIT;
|
||||
field_5_optimize = ( short ) 0;
|
||||
field_6_reserved = ( short ) 0;
|
||||
field_7_option_flags = OPTION_BITS_ALWAYS_SET; // seems necessary for outlining
|
||||
|
||||
field_8_xf_index = ( short ) 0xf;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -86,7 +92,6 @@ public class RowRecord
|
||||
|
||||
protected void fillFields(RecordInputStream in)
|
||||
{
|
||||
//field_1_row_number = LittleEndian.getShort(data, 0 + offset);
|
||||
field_1_row_number = in.readUShort();
|
||||
field_2_first_col = in.readShort();
|
||||
field_3_last_col = in.readShort();
|
||||
@ -156,7 +161,7 @@ public class RowRecord
|
||||
|
||||
public void setOptionFlags(short options)
|
||||
{
|
||||
field_7_option_flags = options;
|
||||
field_7_option_flags = options | OPTION_BITS_ALWAYS_SET;
|
||||
}
|
||||
|
||||
// option bitfields
|
||||
@ -169,20 +174,18 @@ public class RowRecord
|
||||
|
||||
public void setOutlineLevel(short ol)
|
||||
{
|
||||
field_7_option_flags =
|
||||
outlineLevel.setShortValue(field_7_option_flags, ol);
|
||||
field_7_option_flags = outlineLevel.setValue(field_7_option_flags, ol);
|
||||
}
|
||||
|
||||
/**
|
||||
* set whether or not to colapse this row
|
||||
* @param c - colapse or not
|
||||
* set whether or not to collapse this row
|
||||
* @param c - collapse or not
|
||||
* @see #setOptionFlags(short)
|
||||
*/
|
||||
|
||||
public void setColapsed(boolean c)
|
||||
{
|
||||
field_7_option_flags = colapsed.setShortBoolean(field_7_option_flags,
|
||||
c);
|
||||
field_7_option_flags = colapsed.setBoolean(field_7_option_flags, c);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -193,8 +196,7 @@ public class RowRecord
|
||||
|
||||
public void setZeroHeight(boolean z)
|
||||
{
|
||||
field_7_option_flags =
|
||||
zeroHeight.setShortBoolean(field_7_option_flags, z);
|
||||
field_7_option_flags = zeroHeight.setBoolean(field_7_option_flags, z);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -205,8 +207,7 @@ public class RowRecord
|
||||
|
||||
public void setBadFontHeight(boolean f)
|
||||
{
|
||||
field_7_option_flags =
|
||||
badFontHeight.setShortBoolean(field_7_option_flags, f);
|
||||
field_7_option_flags = badFontHeight.setBoolean(field_7_option_flags, f);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -217,8 +218,7 @@ public class RowRecord
|
||||
|
||||
public void setFormatted(boolean f)
|
||||
{
|
||||
field_7_option_flags = formatted.setShortBoolean(field_7_option_flags,
|
||||
f);
|
||||
field_7_option_flags = formatted.setBoolean(field_7_option_flags, f);
|
||||
}
|
||||
|
||||
// end bitfields
|
||||
@ -293,7 +293,7 @@ public class RowRecord
|
||||
|
||||
public short getOptionFlags()
|
||||
{
|
||||
return field_7_option_flags;
|
||||
return (short)field_7_option_flags;
|
||||
}
|
||||
|
||||
// option bitfields
|
||||
@ -306,7 +306,7 @@ public class RowRecord
|
||||
|
||||
public short getOutlineLevel()
|
||||
{
|
||||
return outlineLevel.getShortValue(field_7_option_flags);
|
||||
return (short)outlineLevel.getValue(field_7_option_flags);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -410,7 +410,6 @@ public class RowRecord
|
||||
{
|
||||
LittleEndian.putShort(data, 0 + offset, sid);
|
||||
LittleEndian.putShort(data, 2 + offset, ( short ) 16);
|
||||
//LittleEndian.putShort(data, 4 + offset, getRowNumber());
|
||||
LittleEndian.putShort(data, 4 + offset, ( short ) getRowNumber());
|
||||
LittleEndian.putShort(data, 6 + offset, getFirstCol() == -1 ? (short)0 : getFirstCol());
|
||||
LittleEndian.putShort(data, 8 + offset, getLastCol() == -1 ? (short)0 : getLastCol());
|
||||
@ -419,7 +418,6 @@ public class RowRecord
|
||||
LittleEndian.putShort(data, 14 + offset, field_6_reserved);
|
||||
LittleEndian.putShort(data, 16 + offset, getOptionFlags());
|
||||
|
||||
// LittleEndian.putShort(data,18,getOutlineLevel());
|
||||
LittleEndian.putShort(data, 18 + offset, getXFIndex());
|
||||
return getRecordSize();
|
||||
}
|
||||
@ -469,8 +467,7 @@ public class RowRecord
|
||||
}
|
||||
|
||||
public Object clone() {
|
||||
RowRecord rec = new RowRecord();
|
||||
rec.field_1_row_number = field_1_row_number;
|
||||
RowRecord rec = new RowRecord(field_1_row_number);
|
||||
rec.field_2_first_col = field_2_first_col;
|
||||
rec.field_3_last_col = field_3_last_col;
|
||||
rec.field_4_height = field_4_height;
|
||||
|
@ -35,19 +35,17 @@ import java.util.TreeMap;
|
||||
* @author Jason Height (jheight at chariot dot net dot au)
|
||||
*/
|
||||
|
||||
public class RowRecordsAggregate
|
||||
extends Record
|
||||
{
|
||||
int firstrow = -1;
|
||||
int lastrow = -1;
|
||||
Map records = null;
|
||||
int size = 0;
|
||||
public final class RowRecordsAggregate extends Record {
|
||||
private int firstrow = -1;
|
||||
private int lastrow = -1;
|
||||
private Map records = null; // TODO - use a proper key in this map
|
||||
private int size = 0;
|
||||
|
||||
/** Creates a new instance of ValueRecordsAggregate */
|
||||
|
||||
public RowRecordsAggregate()
|
||||
{
|
||||
records = new TreeMap();
|
||||
records = new TreeMap();
|
||||
}
|
||||
|
||||
public void insertRow(RowRecord row)
|
||||
@ -74,15 +72,13 @@ public class RowRecordsAggregate
|
||||
records.remove(row);
|
||||
}
|
||||
|
||||
public RowRecord getRow(int rownum)
|
||||
{
|
||||
// Row must be between 0 and 65535
|
||||
if(rownum < 0 || rownum > 65535) {
|
||||
throw new IllegalArgumentException("The row number must be between 0 and 65535");
|
||||
}
|
||||
public RowRecord getRow(int rownum) {
|
||||
// Row must be between 0 and 65535
|
||||
if(rownum < 0 || rownum > 65535) {
|
||||
throw new IllegalArgumentException("The row number must be between 0 and 65535");
|
||||
}
|
||||
|
||||
RowRecord row = new RowRecord();
|
||||
row.setRowNumber(rownum);
|
||||
RowRecord row = new RowRecord(rownum);
|
||||
return ( RowRecord ) records.get(row);
|
||||
}
|
||||
|
||||
@ -333,7 +329,7 @@ public class RowRecordsAggregate
|
||||
|
||||
// Find the start of the group.
|
||||
int startRow = findStartOfRowOutlineGroup( rowNumber );
|
||||
RowRecord rowRecord = (RowRecord) getRow( startRow );
|
||||
RowRecord rowRecord = getRow( startRow );
|
||||
|
||||
// Hide all the columns until the end of the group
|
||||
int lastRow = writeHidden( rowRecord, startRow, true );
|
||||
@ -358,17 +354,8 @@ public class RowRecordsAggregate
|
||||
* @return RowRecord created for the passed in row number
|
||||
* @see org.apache.poi.hssf.record.RowRecord
|
||||
*/
|
||||
public static RowRecord createRow(int row)
|
||||
{
|
||||
RowRecord rowrec = new RowRecord();
|
||||
|
||||
//rowrec.setRowNumber(( short ) row);
|
||||
rowrec.setRowNumber(row);
|
||||
rowrec.setHeight(( short ) 0xff);
|
||||
rowrec.setOptimize(( short ) 0x0);
|
||||
rowrec.setOptionFlags(( short ) 0x100); // seems necessary for outlining
|
||||
rowrec.setXFIndex(( short ) 0xf);
|
||||
return rowrec;
|
||||
public static RowRecord createRow(int rowNumber) {
|
||||
return new RowRecord(rowNumber);
|
||||
}
|
||||
|
||||
public boolean isRowGroupCollapsed( int row )
|
||||
@ -399,12 +386,12 @@ public class RowRecordsAggregate
|
||||
int endIdx = findEndOfRowOutlineGroup( idx );
|
||||
|
||||
// expand:
|
||||
// colapsed bit must be unset
|
||||
// collapsed bit must be unset
|
||||
// hidden bit gets unset _if_ surrounding groups are expanded you can determine
|
||||
// this by looking at the hidden bit of the enclosing group. You will have
|
||||
// to look at the start and the end of the current group to determine which
|
||||
// is the enclosing group
|
||||
// hidden bit only is altered for this outline level. ie. don't uncollapse contained groups
|
||||
// hidden bit only is altered for this outline level. ie. don't un-collapse contained groups
|
||||
if ( !isRowGroupHiddenByParent( idx ) )
|
||||
{
|
||||
for ( int i = startIdx; i <= endIdx; i++ )
|
||||
|
@ -21,7 +21,6 @@ import java.util.Iterator;
|
||||
import java.util.NoSuchElementException;
|
||||
|
||||
import org.apache.poi.hssf.model.Sheet;
|
||||
import org.apache.poi.hssf.model.Workbook;
|
||||
import org.apache.poi.hssf.record.CellValueRecordInterface;
|
||||
import org.apache.poi.hssf.record.RowRecord;
|
||||
|
||||
@ -37,11 +36,9 @@ public final class HSSFRow implements Comparable {
|
||||
|
||||
// used for collections
|
||||
public final static int INITIAL_CAPACITY = 5;
|
||||
//private short rowNum;
|
||||
|
||||
private int rowNum;
|
||||
private HSSFCell[] cells=new HSSFCell[INITIAL_CAPACITY];
|
||||
// private short firstcell = -1;
|
||||
// private short lastcell = -1;
|
||||
|
||||
/**
|
||||
* reference to low level representation
|
||||
@ -61,7 +58,8 @@ public final class HSSFRow implements Comparable {
|
||||
|
||||
private Sheet sheet;
|
||||
|
||||
protected HSSFRow()
|
||||
// TODO - ditch this constructor
|
||||
HSSFRow()
|
||||
{
|
||||
}
|
||||
|
||||
@ -73,18 +71,12 @@ public final class HSSFRow implements Comparable {
|
||||
* @param rowNum the row number of this row (0 based)
|
||||
* @see org.apache.poi.hssf.usermodel.HSSFSheet#createRow(int)
|
||||
*/
|
||||
|
||||
//protected HSSFRow(Workbook book, Sheet sheet, short rowNum)
|
||||
protected HSSFRow(HSSFWorkbook book, Sheet sheet, int rowNum)
|
||||
HSSFRow(HSSFWorkbook book, Sheet sheet, int rowNum)
|
||||
{
|
||||
this.rowNum = rowNum;
|
||||
this.book = book;
|
||||
this.sheet = sheet;
|
||||
row = new RowRecord();
|
||||
row.setOptionFlags( (short)0x100 ); // seems necessary for outlining to work.
|
||||
row.setHeight((short) 0xff);
|
||||
row.setLastCol((short) -1);
|
||||
row.setFirstCol((short) -1);
|
||||
row = new RowRecord(rowNum);
|
||||
|
||||
setRowNum(rowNum);
|
||||
}
|
||||
@ -98,8 +90,7 @@ public final class HSSFRow implements Comparable {
|
||||
* @param record the low level api object this row should represent
|
||||
* @see org.apache.poi.hssf.usermodel.HSSFSheet#createRow(int)
|
||||
*/
|
||||
|
||||
protected HSSFRow(HSSFWorkbook book, Sheet sheet, RowRecord record)
|
||||
HSSFRow(HSSFWorkbook book, Sheet sheet, RowRecord record)
|
||||
{
|
||||
this.book = book;
|
||||
this.sheet = sheet;
|
||||
@ -200,12 +191,11 @@ public final class HSSFRow implements Comparable {
|
||||
* @param rowNum the row number (0-based)
|
||||
* @throws IndexOutOfBoundsException if the row number is not within the range 0-65535.
|
||||
*/
|
||||
|
||||
//public void setRowNum(short rowNum)
|
||||
public void setRowNum(int rowNum)
|
||||
{
|
||||
if ((rowNum < 0) || (rowNum > RowRecord.MAX_ROW_NUMBER))
|
||||
throw new IndexOutOfBoundsException("Row number must be between 0 and "+RowRecord.MAX_ROW_NUMBER+", was <"+rowNum+">");
|
||||
public void setRowNum(int rowNum) {
|
||||
if ((rowNum < 0) || (rowNum > RowRecord.MAX_ROW_NUMBER)) {
|
||||
throw new IllegalArgumentException("Invalid row number (" + rowNum
|
||||
+ ") outside allowable range (0.." + RowRecord.MAX_ROW_NUMBER + ")");
|
||||
}
|
||||
this.rowNum = rowNum;
|
||||
if (row != null)
|
||||
{
|
||||
@ -217,8 +207,6 @@ public final class HSSFRow implements Comparable {
|
||||
* get row number this row represents
|
||||
* @return the row number (0 based)
|
||||
*/
|
||||
|
||||
//public short getRowNum()
|
||||
public int getRowNum()
|
||||
{
|
||||
return rowNum;
|
||||
|
@ -136,6 +136,7 @@ public final class HSSFSheet {
|
||||
{
|
||||
int sloc = sheet.getLoc();
|
||||
RowRecord row = sheet.getNextRow();
|
||||
boolean rowRecordsAlreadyPresent = row!=null;
|
||||
|
||||
while (row != null)
|
||||
{
|
||||
@ -160,6 +161,18 @@ public final class HSSFSheet {
|
||||
if ( ( lastrow == null ) || ( lastrow.getRowNum() != cval.getRow() ) )
|
||||
{
|
||||
hrow = getRow( cval.getRow() );
|
||||
if (hrow == null) {
|
||||
// Some tools (like Perl module Spreadsheet::WriteExcel - bug 41187) skip the RowRecords
|
||||
// Excel, OpenOffice.org and GoogleDocs are all OK with this, so POI should be too.
|
||||
if (rowRecordsAlreadyPresent) {
|
||||
// if at least one row record is present, all should be present.
|
||||
throw new RuntimeException("Unexpected missing row when some rows already present");
|
||||
}
|
||||
// create the row record on the fly now.
|
||||
RowRecord rowRec = new RowRecord(cval.getRow());
|
||||
sheet.addRow(rowRec);
|
||||
hrow = createRowFromRecord(rowRec);
|
||||
}
|
||||
}
|
||||
if ( hrow != null )
|
||||
{
|
||||
|
@ -22,9 +22,7 @@ import junit.framework.TestSuite;
|
||||
|
||||
import org.apache.poi.hssf.eventmodel.TestEventRecordFactory;
|
||||
import org.apache.poi.hssf.eventmodel.TestModelFactory;
|
||||
import org.apache.poi.hssf.model.TestDrawingManager;
|
||||
import org.apache.poi.hssf.model.TestFormulaParser;
|
||||
import org.apache.poi.hssf.model.TestSheet;
|
||||
import org.apache.poi.hssf.model.AllModelTests;
|
||||
import org.apache.poi.hssf.record.AllRecordTests;
|
||||
import org.apache.poi.hssf.usermodel.AllUserModelTests;
|
||||
import org.apache.poi.hssf.util.TestAreaReference;
|
||||
@ -50,10 +48,10 @@ public final class HSSFTests {
|
||||
TestSuite suite = new TestSuite("Tests for org.apache.poi.hssf");
|
||||
// $JUnit-BEGIN$
|
||||
|
||||
suite.addTest(AllModelTests.suite());
|
||||
suite.addTest(AllUserModelTests.suite());
|
||||
suite.addTest(AllRecordTests.suite());
|
||||
|
||||
suite.addTest(new TestSuite(TestFormulaParser.class));
|
||||
suite.addTest(new TestSuite(TestAreaReference.class));
|
||||
suite.addTest(new TestSuite(TestCellReference.class));
|
||||
suite.addTest(new TestSuite(TestRangeAddress.class));
|
||||
@ -61,8 +59,6 @@ public final class HSSFTests {
|
||||
suite.addTest(new TestSuite(TestSheetReferences.class));
|
||||
suite.addTest(new TestSuite(TestEventRecordFactory.class));
|
||||
suite.addTest(new TestSuite(TestModelFactory.class));
|
||||
suite.addTest(new TestSuite(TestDrawingManager.class));
|
||||
suite.addTest(new TestSuite(TestSheet.class));
|
||||
// $JUnit-END$
|
||||
return suite;
|
||||
}
|
||||
|
BIN
src/testcases/org/apache/poi/hssf/data/ex41187-19267.xls
Normal file
BIN
src/testcases/org/apache/poi/hssf/data/ex41187-19267.xls
Normal file
Binary file not shown.
40
src/testcases/org/apache/poi/hssf/model/AllModelTests.java
Executable file
40
src/testcases/org/apache/poi/hssf/model/AllModelTests.java
Executable file
@ -0,0 +1,40 @@
|
||||
/* ====================================================================
|
||||
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.hssf.model;
|
||||
|
||||
import junit.framework.Test;
|
||||
import junit.framework.TestSuite;
|
||||
|
||||
/**
|
||||
* Collects all tests for <tt>org.apache.poi.hssf.model</tt>.
|
||||
*
|
||||
* @author Josh Micich
|
||||
*/
|
||||
public final class AllModelTests {
|
||||
|
||||
public static Test suite() {
|
||||
TestSuite result = new TestSuite(AllModelTests.class.getName());
|
||||
result.addTestSuite(TestDrawingManager.class);
|
||||
result.addTestSuite(TestDrawingManager2.class);
|
||||
result.addTestSuite(TestFormulaParser.class);
|
||||
result.addTestSuite(TestFormulaParserEval.class);
|
||||
result.addTestSuite(TestSheet.class);
|
||||
result.addTestSuite(TestSheetAdditional.class);
|
||||
return result;
|
||||
}
|
||||
}
|
@ -1,4 +1,3 @@
|
||||
|
||||
/* ====================================================================
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
@ -15,7 +14,6 @@
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
==================================================================== */
|
||||
|
||||
|
||||
package org.apache.poi.hssf.model;
|
||||
|
||||
@ -34,8 +32,7 @@ import java.util.List;
|
||||
*
|
||||
* @author Glen Stampoultzis (glens at apache.org)
|
||||
*/
|
||||
public class TestSheet extends TestCase
|
||||
{
|
||||
public final class TestSheet extends TestCase {
|
||||
public void testCreateSheet() throws Exception
|
||||
{
|
||||
// Check we're adding row and cell aggregates
|
||||
@ -76,6 +73,21 @@ public class TestSheet extends TestCase
|
||||
if ((regionsToAdd % 1027) != 0)
|
||||
recordsExpected++;
|
||||
assertTrue("The " + regionsToAdd + " merged regions should have been spread out over " + recordsExpected + " records, not " + recordsAdded, recordsAdded == recordsExpected);
|
||||
// Check we can't add one with invalid date
|
||||
try {
|
||||
sheet.addMergedRegion(10, (short)10, 9, (short)12);
|
||||
fail("Expected an exception to occur");
|
||||
} catch(IllegalArgumentException e) {
|
||||
// occurs during successful test
|
||||
assertEquals("The 'to' row (9) must not be less than the 'from' row (10)", e.getMessage());
|
||||
}
|
||||
try {
|
||||
sheet.addMergedRegion(10, (short)10, 12, (short)9);
|
||||
fail("Expected an exception to occur");
|
||||
} catch(IllegalArgumentException e) {
|
||||
// occurs during successful test
|
||||
assertEquals("The 'to' col (9) must not be less than the 'from' col (10)", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public void testRemoveMergedRegion()
|
||||
@ -113,9 +125,9 @@ public class TestSheet extends TestCase
|
||||
|
||||
MergeCellsRecord merged = new MergeCellsRecord();
|
||||
merged.addArea(0, (short)0, 1, (short)2);
|
||||
records.add(new RowRecord());
|
||||
records.add(new RowRecord());
|
||||
records.add(new RowRecord());
|
||||
records.add(new RowRecord(0));
|
||||
records.add(new RowRecord(1));
|
||||
records.add(new RowRecord(2));
|
||||
records.add(merged);
|
||||
|
||||
Sheet sheet = Sheet.createSheet(records, 0);
|
||||
@ -142,20 +154,11 @@ public class TestSheet extends TestCase
|
||||
*/
|
||||
public void testRowAggregation() {
|
||||
List records = new ArrayList();
|
||||
RowRecord row = new RowRecord();
|
||||
row.setRowNumber(0);
|
||||
records.add(row);
|
||||
|
||||
row = new RowRecord();
|
||||
row.setRowNumber(1);
|
||||
records.add(row);
|
||||
|
||||
records.add(new RowRecord(0));
|
||||
records.add(new RowRecord(1));
|
||||
records.add(new StringRecord());
|
||||
|
||||
row = new RowRecord();
|
||||
row.setRowNumber(2);
|
||||
records.add(row);
|
||||
|
||||
records.add(new RowRecord(2));
|
||||
|
||||
Sheet sheet = Sheet.createSheet(records, 0);
|
||||
assertNotNull("Row [2] was skipped", sheet.getRow(2));
|
||||
@ -197,9 +200,9 @@ public class TestSheet extends TestCase
|
||||
Iterator iterator = sheet.getRowBreaks();
|
||||
while (iterator.hasNext()) {
|
||||
PageBreakRecord.Break breakItem = (PageBreakRecord.Break)iterator.next();
|
||||
int main = (int)breakItem.main;
|
||||
int main = breakItem.main;
|
||||
if (main != 0 && main != 10 && main != 11) fail("Invalid page break");
|
||||
if (main == 0) is0 = true;
|
||||
if (main == 0) is0 = true;
|
||||
if (main == 10) is10= true;
|
||||
if (main == 11) is11 = true;
|
||||
}
|
||||
@ -216,8 +219,6 @@ public class TestSheet extends TestCase
|
||||
assertFalse("row should be removed", sheet.isRowBroken(10));
|
||||
|
||||
assertEquals("no more breaks", 0, sheet.getNumRowBreaks());
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -256,10 +257,10 @@ public class TestSheet extends TestCase
|
||||
Iterator iterator = sheet.getColumnBreaks();
|
||||
while (iterator.hasNext()) {
|
||||
PageBreakRecord.Break breakItem = (PageBreakRecord.Break)iterator.next();
|
||||
int main = (int)breakItem.main;
|
||||
int main = breakItem.main;
|
||||
if (main != 0 && main != 1 && main != 10 && main != 15) fail("Invalid page break");
|
||||
if (main == 0) is0 = true;
|
||||
if (main == 1) is1 = true;
|
||||
if (main == 0) is0 = true;
|
||||
if (main == 1) is1 = true;
|
||||
if (main == 10) is10= true;
|
||||
if (main == 15) is15 = true;
|
||||
}
|
||||
@ -286,72 +287,69 @@ public class TestSheet extends TestCase
|
||||
* works as designed.
|
||||
*/
|
||||
public void testXFIndexForColumn() {
|
||||
try{
|
||||
final short TEST_IDX = 10;
|
||||
final short DEFAULT_IDX = 0xF; // 15
|
||||
short xfindex = Short.MIN_VALUE;
|
||||
Sheet sheet = Sheet.createSheet();
|
||||
|
||||
// without ColumnInfoRecord
|
||||
xfindex = sheet.getXFIndexForColAt((short) 0);
|
||||
assertEquals(DEFAULT_IDX, xfindex);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 1);
|
||||
assertEquals(DEFAULT_IDX, xfindex);
|
||||
|
||||
ColumnInfoRecord nci = ( ColumnInfoRecord ) sheet.createColInfo();
|
||||
sheet.columns.insertColumn(nci);
|
||||
|
||||
// single column ColumnInfoRecord
|
||||
nci.setFirstColumn((short) 2);
|
||||
nci.setLastColumn((short) 2);
|
||||
nci.setXFIndex(TEST_IDX);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 0);
|
||||
assertEquals(DEFAULT_IDX, xfindex);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 1);
|
||||
assertEquals(DEFAULT_IDX, xfindex);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 2);
|
||||
assertEquals(TEST_IDX, xfindex);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 3);
|
||||
assertEquals(DEFAULT_IDX, xfindex);
|
||||
final short TEST_IDX = 10;
|
||||
final short DEFAULT_IDX = 0xF; // 15
|
||||
short xfindex = Short.MIN_VALUE;
|
||||
Sheet sheet = Sheet.createSheet();
|
||||
|
||||
// without ColumnInfoRecord
|
||||
xfindex = sheet.getXFIndexForColAt((short) 0);
|
||||
assertEquals(DEFAULT_IDX, xfindex);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 1);
|
||||
assertEquals(DEFAULT_IDX, xfindex);
|
||||
|
||||
ColumnInfoRecord nci = ( ColumnInfoRecord ) sheet.createColInfo();
|
||||
sheet.columns.insertColumn(nci);
|
||||
|
||||
// single column ColumnInfoRecord
|
||||
nci.setFirstColumn((short) 2);
|
||||
nci.setLastColumn((short) 2);
|
||||
nci.setXFIndex(TEST_IDX);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 0);
|
||||
assertEquals(DEFAULT_IDX, xfindex);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 1);
|
||||
assertEquals(DEFAULT_IDX, xfindex);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 2);
|
||||
assertEquals(TEST_IDX, xfindex);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 3);
|
||||
assertEquals(DEFAULT_IDX, xfindex);
|
||||
|
||||
// ten column ColumnInfoRecord
|
||||
nci.setFirstColumn((short) 2);
|
||||
nci.setLastColumn((short) 11);
|
||||
nci.setXFIndex(TEST_IDX);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 1);
|
||||
assertEquals(DEFAULT_IDX, xfindex);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 2);
|
||||
assertEquals(TEST_IDX, xfindex);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 6);
|
||||
assertEquals(TEST_IDX, xfindex);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 11);
|
||||
assertEquals(TEST_IDX, xfindex);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 12);
|
||||
assertEquals(DEFAULT_IDX, xfindex);
|
||||
// ten column ColumnInfoRecord
|
||||
nci.setFirstColumn((short) 2);
|
||||
nci.setLastColumn((short) 11);
|
||||
nci.setXFIndex(TEST_IDX);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 1);
|
||||
assertEquals(DEFAULT_IDX, xfindex);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 2);
|
||||
assertEquals(TEST_IDX, xfindex);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 6);
|
||||
assertEquals(TEST_IDX, xfindex);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 11);
|
||||
assertEquals(TEST_IDX, xfindex);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 12);
|
||||
assertEquals(DEFAULT_IDX, xfindex);
|
||||
|
||||
// single column ColumnInfoRecord starting at index 0
|
||||
nci.setFirstColumn((short) 0);
|
||||
nci.setLastColumn((short) 0);
|
||||
nci.setXFIndex(TEST_IDX);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 0);
|
||||
assertEquals(TEST_IDX, xfindex);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 1);
|
||||
assertEquals(DEFAULT_IDX, xfindex);
|
||||
// single column ColumnInfoRecord starting at index 0
|
||||
nci.setFirstColumn((short) 0);
|
||||
nci.setLastColumn((short) 0);
|
||||
nci.setXFIndex(TEST_IDX);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 0);
|
||||
assertEquals(TEST_IDX, xfindex);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 1);
|
||||
assertEquals(DEFAULT_IDX, xfindex);
|
||||
|
||||
// ten column ColumnInfoRecord starting at index 0
|
||||
nci.setFirstColumn((short) 0);
|
||||
nci.setLastColumn((short) 9);
|
||||
nci.setXFIndex(TEST_IDX);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 0);
|
||||
assertEquals(TEST_IDX, xfindex);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 7);
|
||||
assertEquals(TEST_IDX, xfindex);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 9);
|
||||
assertEquals(TEST_IDX, xfindex);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 10);
|
||||
assertEquals(DEFAULT_IDX, xfindex);
|
||||
}
|
||||
catch(Exception e){e.printStackTrace();fail(e.getMessage());}
|
||||
// ten column ColumnInfoRecord starting at index 0
|
||||
nci.setFirstColumn((short) 0);
|
||||
nci.setLastColumn((short) 9);
|
||||
nci.setXFIndex(TEST_IDX);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 0);
|
||||
assertEquals(TEST_IDX, xfindex);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 7);
|
||||
assertEquals(TEST_IDX, xfindex);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 9);
|
||||
assertEquals(TEST_IDX, xfindex);
|
||||
xfindex = sheet.getXFIndexForColAt((short) 10);
|
||||
assertEquals(DEFAULT_IDX, xfindex);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -19,125 +19,18 @@ package org.apache.poi.hssf.model;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.apache.poi.hssf.record.ColumnInfoRecord;
|
||||
import org.apache.poi.hssf.record.MergeCellsRecord;
|
||||
import org.apache.poi.hssf.record.PageBreakRecord;
|
||||
import org.apache.poi.hssf.record.RowRecord;
|
||||
import org.apache.poi.hssf.record.StringRecord;
|
||||
|
||||
/**
|
||||
* @author Tony Poppleton
|
||||
*/
|
||||
public class TestSheetAdditional extends TestCase
|
||||
{
|
||||
/**
|
||||
* Constructor for SheetTest.
|
||||
* @param arg0
|
||||
*/
|
||||
public TestSheetAdditional(String arg0)
|
||||
{
|
||||
super(arg0);
|
||||
}
|
||||
public final class TestSheetAdditional extends TestCase {
|
||||
|
||||
public void testAddMergedRegion()
|
||||
{
|
||||
Sheet sheet = Sheet.createSheet();
|
||||
int regionsToAdd = 4096;
|
||||
int startRecords = sheet.getRecords().size();
|
||||
|
||||
//simple test that adds a load of regions
|
||||
for (int n = 0; n < regionsToAdd; n++)
|
||||
{
|
||||
int index = sheet.addMergedRegion(0, (short) 0, 1, (short) 1);
|
||||
assertTrue("Merged region index expected to be " + n + " got " + index, index == n);
|
||||
}
|
||||
|
||||
//test all the regions were indeed added
|
||||
assertTrue(sheet.getNumMergedRegions() == regionsToAdd);
|
||||
|
||||
//test that the regions were spread out over the appropriate number of records
|
||||
int recordsAdded = sheet.getRecords().size() - startRecords;
|
||||
int recordsExpected = regionsToAdd/1027;
|
||||
if ((regionsToAdd % 1027) != 0)
|
||||
recordsExpected++;
|
||||
assertTrue("The " + regionsToAdd + " merged regions should have been spread out over " + recordsExpected + " records, not " + recordsAdded, recordsAdded == recordsExpected);
|
||||
|
||||
// Check we can't add one with invalud date
|
||||
try {
|
||||
sheet.addMergedRegion(10, (short)10, 9, (short)12);
|
||||
fail();
|
||||
} catch(IllegalArgumentException e) {}
|
||||
try {
|
||||
sheet.addMergedRegion(10, (short)10, 12, (short)9);
|
||||
fail();
|
||||
} catch(IllegalArgumentException e) {}
|
||||
}
|
||||
|
||||
public void testRemoveMergedRegion()
|
||||
{
|
||||
Sheet sheet = Sheet.createSheet();
|
||||
int regionsToAdd = 4096;
|
||||
|
||||
for (int n = 0; n < regionsToAdd; n++)
|
||||
sheet.addMergedRegion(0, (short) 0, 1, (short) 1);
|
||||
|
||||
int records = sheet.getRecords().size();
|
||||
|
||||
//remove a third from the beginning
|
||||
for (int n = 0; n < regionsToAdd/3; n++)
|
||||
{
|
||||
sheet.removeMergedRegion(0);
|
||||
//assert they have been deleted
|
||||
assertTrue("Num of regions should be " + (regionsToAdd - n - 1) + " not " + sheet.getNumMergedRegions(), sheet.getNumMergedRegions() == regionsToAdd - n - 1);
|
||||
}
|
||||
|
||||
//assert any record removing was done
|
||||
int recordsRemoved = (regionsToAdd/3)/1027; //doesn't work for particular values of regionsToAdd
|
||||
assertTrue("Expected " + recordsRemoved + " record to be removed from the starting " + records + ". Currently there are " + sheet.getRecords().size() + " records", records - sheet.getRecords().size() == recordsRemoved);
|
||||
}
|
||||
|
||||
/**
|
||||
* Bug: 22922 (Reported by Xuemin Guan)
|
||||
* <p>
|
||||
* Remove mergedregion fails when a sheet loses records after an initial CreateSheet
|
||||
* fills up the records.
|
||||
*
|
||||
*/
|
||||
public void testMovingMergedRegion() {
|
||||
List records = new ArrayList();
|
||||
|
||||
MergeCellsRecord merged = new MergeCellsRecord();
|
||||
merged.addArea(0, (short)0, 1, (short)2);
|
||||
records.add(new RowRecord());
|
||||
records.add(new RowRecord());
|
||||
records.add(new RowRecord());
|
||||
records.add(merged);
|
||||
|
||||
Sheet sheet = Sheet.createSheet(records, 0);
|
||||
sheet.records.remove(0);
|
||||
|
||||
//stub object to throw off list INDEX operations
|
||||
sheet.removeMergedRegion(0);
|
||||
assertEquals("Should be no more merged regions", 0, sheet.getNumMergedRegions());
|
||||
}
|
||||
|
||||
public void testGetMergedRegionAt()
|
||||
{
|
||||
//TODO
|
||||
}
|
||||
|
||||
public void testGetNumMergedRegions()
|
||||
{
|
||||
//TODO
|
||||
}
|
||||
|
||||
public void DISBALEDtestGetCellWidth() throws Exception
|
||||
{
|
||||
public void testGetCellWidth() {
|
||||
Sheet sheet = Sheet.createSheet();
|
||||
ColumnInfoRecord nci = ( ColumnInfoRecord ) sheet.createColInfo();
|
||||
|
||||
@ -146,14 +39,8 @@ public class TestSheetAdditional extends TestCase
|
||||
nci.setLastColumn((short)10);
|
||||
nci.setColumnWidth((short)100);
|
||||
|
||||
Field f = null;
|
||||
f = Sheet.class.getDeclaredField("columnSizes");
|
||||
f.setAccessible(true);
|
||||
List columnSizes = new ArrayList();
|
||||
f.set(sheet,columnSizes);
|
||||
columnSizes.add(nci);
|
||||
sheet.records.add(1 + sheet.dimsloc, nci);
|
||||
sheet.dimsloc++;
|
||||
|
||||
sheet.columns.insertColumn(nci);
|
||||
|
||||
assertEquals((short)100,sheet.getColumnWidth((short)5));
|
||||
assertEquals((short)100,sheet.getColumnWidth((short)6));
|
||||
@ -172,151 +59,6 @@ public class TestSheetAdditional extends TestCase
|
||||
assertEquals((short)100,sheet.getColumnWidth((short)10));
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes sure all rows registered for this sheet are aggregated, they were being skipped
|
||||
*
|
||||
*/
|
||||
public void testRowAggregation() {
|
||||
List records = new ArrayList();
|
||||
RowRecord row = new RowRecord();
|
||||
row.setRowNumber(0);
|
||||
records.add(row);
|
||||
|
||||
row = new RowRecord();
|
||||
row.setRowNumber(1);
|
||||
records.add(row);
|
||||
|
||||
records.add(new StringRecord());
|
||||
|
||||
row = new RowRecord();
|
||||
row.setRowNumber(2);
|
||||
records.add(row);
|
||||
|
||||
|
||||
Sheet sheet = Sheet.createSheet(records, 0);
|
||||
assertNotNull("Row [2] was skipped", sheet.getRow(2));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Make sure page break functionality works (in memory)
|
||||
*
|
||||
*/
|
||||
public void testRowPageBreaks(){
|
||||
short colFrom = 0;
|
||||
short colTo = 255;
|
||||
|
||||
Sheet sheet = Sheet.createSheet();
|
||||
sheet.setRowBreak(0, colFrom, colTo);
|
||||
|
||||
assertTrue("no row break at 0", sheet.isRowBroken(0));
|
||||
assertEquals("1 row break available", 1, sheet.getNumRowBreaks());
|
||||
|
||||
sheet.setRowBreak(0, colFrom, colTo);
|
||||
sheet.setRowBreak(0, colFrom, colTo);
|
||||
|
||||
assertTrue("no row break at 0", sheet.isRowBroken(0));
|
||||
assertEquals("1 row break available", 1, sheet.getNumRowBreaks());
|
||||
|
||||
sheet.setRowBreak(10, colFrom, colTo);
|
||||
sheet.setRowBreak(11, colFrom, colTo);
|
||||
|
||||
assertTrue("no row break at 10", sheet.isRowBroken(10));
|
||||
assertTrue("no row break at 11", sheet.isRowBroken(11));
|
||||
assertEquals("3 row break available", 3, sheet.getNumRowBreaks());
|
||||
|
||||
|
||||
boolean is10 = false;
|
||||
boolean is0 = false;
|
||||
boolean is11 = false;
|
||||
|
||||
Iterator iterator = sheet.getRowBreaks();
|
||||
while (iterator.hasNext()) {
|
||||
PageBreakRecord.Break breakItem = (PageBreakRecord.Break)iterator.next();
|
||||
int main = (int)breakItem.main;
|
||||
if (main != 0 && main != 10 && main != 11) fail("Invalid page break");
|
||||
if (main == 0) is0 = true;
|
||||
if (main == 10) is10= true;
|
||||
if (main == 11) is11 = true;
|
||||
}
|
||||
|
||||
assertTrue("one of the breaks didnt make it", is0 && is10 && is11);
|
||||
|
||||
sheet.removeRowBreak(11);
|
||||
assertFalse("row should be removed", sheet.isRowBroken(11));
|
||||
|
||||
sheet.removeRowBreak(0);
|
||||
assertFalse("row should be removed", sheet.isRowBroken(0));
|
||||
|
||||
sheet.removeRowBreak(10);
|
||||
assertFalse("row should be removed", sheet.isRowBroken(10));
|
||||
|
||||
assertEquals("no more breaks", 0, sheet.getNumRowBreaks());
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Make sure column pag breaks works properly (in-memory)
|
||||
*
|
||||
*/
|
||||
public void testColPageBreaks(){
|
||||
short rowFrom = 0;
|
||||
short rowTo = (short)65535;
|
||||
|
||||
Sheet sheet = Sheet.createSheet();
|
||||
sheet.setColumnBreak((short)0, rowFrom, rowTo);
|
||||
|
||||
assertTrue("no col break at 0", sheet.isColumnBroken((short)0));
|
||||
assertEquals("1 col break available", 1, sheet.getNumColumnBreaks());
|
||||
|
||||
sheet.setColumnBreak((short)0, rowFrom, rowTo);
|
||||
|
||||
assertTrue("no col break at 0", sheet.isColumnBroken((short)0));
|
||||
assertEquals("1 col break available", 1, sheet.getNumColumnBreaks());
|
||||
|
||||
sheet.setColumnBreak((short)1, rowFrom, rowTo);
|
||||
sheet.setColumnBreak((short)10, rowFrom, rowTo);
|
||||
sheet.setColumnBreak((short)15, rowFrom, rowTo);
|
||||
|
||||
assertTrue("no col break at 1", sheet.isColumnBroken((short)1));
|
||||
assertTrue("no col break at 10", sheet.isColumnBroken((short)10));
|
||||
assertTrue("no col break at 15", sheet.isColumnBroken((short)15));
|
||||
assertEquals("4 col break available", 4, sheet.getNumColumnBreaks());
|
||||
|
||||
boolean is10 = false;
|
||||
boolean is0 = false;
|
||||
boolean is1 = false;
|
||||
boolean is15 = false;
|
||||
|
||||
Iterator iterator = sheet.getColumnBreaks();
|
||||
while (iterator.hasNext()) {
|
||||
PageBreakRecord.Break breakItem = (PageBreakRecord.Break)iterator.next();
|
||||
int main = (int)breakItem.main;
|
||||
if (main != 0 && main != 1 && main != 10 && main != 15) fail("Invalid page break");
|
||||
if (main == 0) is0 = true;
|
||||
if (main == 1) is1 = true;
|
||||
if (main == 10) is10= true;
|
||||
if (main == 15) is15 = true;
|
||||
}
|
||||
|
||||
assertTrue("one of the breaks didnt make it", is0 && is1 && is10 && is15);
|
||||
|
||||
sheet.removeColumnBreak((short)15);
|
||||
assertFalse("column break should not be there", sheet.isColumnBroken((short)15));
|
||||
|
||||
sheet.removeColumnBreak((short)0);
|
||||
assertFalse("column break should not be there", sheet.isColumnBroken((short)0));
|
||||
|
||||
sheet.removeColumnBreak((short)1);
|
||||
assertFalse("column break should not be there", sheet.isColumnBroken((short)1));
|
||||
|
||||
sheet.removeColumnBreak((short)10);
|
||||
assertFalse("column break should not be there", sheet.isColumnBroken((short)10));
|
||||
|
||||
assertEquals("no more breaks", 0, sheet.getNumColumnBreaks());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,4 +1,3 @@
|
||||
|
||||
/* ====================================================================
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
@ -15,34 +14,28 @@
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
==================================================================== */
|
||||
|
||||
|
||||
package org.apache.poi.hssf.record.aggregates;
|
||||
|
||||
import org.apache.poi.hssf.record.*;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
public class TestRowRecordsAggregate extends junit.framework.TestCase {
|
||||
public TestRowRecordsAggregate(String name) {
|
||||
super (name);
|
||||
}
|
||||
import org.apache.poi.hssf.record.RowRecord;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public final class TestRowRecordsAggregate extends TestCase {
|
||||
|
||||
public void testRowGet() {
|
||||
RowRecordsAggregate rra = new RowRecordsAggregate();
|
||||
RowRecord rr = new RowRecord();
|
||||
rr.setRowNumber(( short ) 4);
|
||||
RowRecord rr = new RowRecord(4);
|
||||
rra.insertRow(rr);
|
||||
RowRecord rr2 = new RowRecord(); rr2.setRowNumber((short) 1);
|
||||
rra.insertRow(rr2);
|
||||
rra.insertRow(new RowRecord(1));
|
||||
|
||||
RowRecord rr1 = rra.getRow(4);
|
||||
|
||||
assertTrue("Row Record should not be null", rr1!=null);
|
||||
assertTrue("Row number is 1",rr1.getRowNumber() == 4);
|
||||
assertNotNull(rr1);
|
||||
assertEquals("Row number is 1", 4, rr1.getRowNumber());
|
||||
assertTrue("Row record retrieved is identical ", rr1 == rr);
|
||||
}
|
||||
|
||||
public static void main(String [] args) {
|
||||
System.out
|
||||
.println("Testing org.apache.poi.hssf.record.aggregates.RowRecordAggregate");
|
||||
junit.textui.TestRunner.run(TestRowRecordsAggregate.class);
|
||||
}
|
||||
}
|
||||
|
@ -143,8 +143,9 @@ public final class TestHSSFRow extends TestCase {
|
||||
try {
|
||||
sheet.createRow(-1);
|
||||
fail("IndexOutOfBoundsException should have been thrown");
|
||||
} catch (IndexOutOfBoundsException ex) {
|
||||
} catch (IllegalArgumentException e) {
|
||||
// expected during successful test
|
||||
assertEquals("Invalid row number (-1) outside allowable range (0..65535)", e.getMessage());
|
||||
}
|
||||
|
||||
//Test high row bound
|
||||
@ -153,8 +154,9 @@ public final class TestHSSFRow extends TestCase {
|
||||
try {
|
||||
sheet.createRow(65536);
|
||||
fail("IndexOutOfBoundsException should have been thrown");
|
||||
} catch (IndexOutOfBoundsException ex) {
|
||||
} catch (IllegalArgumentException e) {
|
||||
// expected during successful test
|
||||
assertEquals("Invalid row number (65536) outside allowable range (0..65535)", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -23,6 +23,7 @@ import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
|
||||
import junit.framework.AssertionFailedError;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.apache.poi.hssf.HSSFTestDataSamples;
|
||||
@ -193,17 +194,29 @@ public final class TestHSSFSheet extends TestCase {
|
||||
public void testCloneSheet() {
|
||||
HSSFWorkbook workbook = new HSSFWorkbook();
|
||||
HSSFSheet sheet = workbook.createSheet("Test Clone");
|
||||
HSSFRow row = sheet.createRow((short) 0);
|
||||
HSSFRow row = sheet.createRow(0);
|
||||
HSSFCell cell = row.createCell((short) 0);
|
||||
cell.setCellValue("clone_test");
|
||||
HSSFSheet cloned = workbook.cloneSheet(0);
|
||||
|
||||
HSSFCell cell2 = row.createCell((short) 1);
|
||||
cell.setCellValue(new HSSFRichTextString("clone_test"));
|
||||
cell2.setCellFormula("sin(1)");
|
||||
|
||||
HSSFSheet clonedSheet = workbook.cloneSheet(0);
|
||||
HSSFRow clonedRow = clonedSheet.getRow(0);
|
||||
|
||||
//Check for a good clone
|
||||
assertEquals(cloned.getRow((short)0).getCell((short)0).getStringCellValue(), "clone_test");
|
||||
assertEquals(clonedRow.getCell(0).getRichStringCellValue().getString(), "clone_test");
|
||||
|
||||
//Check that the cells are not somehow linked
|
||||
cell.setCellValue("Difference Check");
|
||||
assertEquals(cloned.getRow((short)0).getCell((short)0).getStringCellValue(), "clone_test");
|
||||
cell.setCellValue(new HSSFRichTextString("Difference Check"));
|
||||
cell2.setCellFormula("cos(2)");
|
||||
if ("Difference Check".equals(clonedRow.getCell(0).getRichStringCellValue().getString())) {
|
||||
fail("string cell not properly cloned");
|
||||
}
|
||||
if ("COS(2)".equals(clonedRow.getCell(1).getCellFormula())) {
|
||||
fail("formula cell not properly cloned");
|
||||
}
|
||||
assertEquals(clonedRow.getCell(0).getRichStringCellValue().getString(), "clone_test");
|
||||
assertEquals(clonedRow.getCell(1).getCellFormula(), "SIN(1)");
|
||||
}
|
||||
|
||||
/** tests that the sheet name for multiple clones of the same sheet is unique
|
||||
@ -214,7 +227,7 @@ public final class TestHSSFSheet extends TestCase {
|
||||
HSSFSheet sheet = workbook.createSheet("Test Clone");
|
||||
HSSFRow row = sheet.createRow((short) 0);
|
||||
HSSFCell cell = row.createCell((short) 0);
|
||||
cell.setCellValue("clone_test");
|
||||
cell.setCellValue(new HSSFRichTextString("clone_test"));
|
||||
//Clone the sheet multiple times
|
||||
workbook.cloneSheet(0);
|
||||
workbook.cloneSheet(0);
|
||||
@ -517,11 +530,11 @@ public final class TestHSSFSheet extends TestCase {
|
||||
HSSFSheet sheet = wb.createSheet();
|
||||
HSSFRow row = sheet.createRow(0);
|
||||
HSSFCell cell = row.createCell((short)0);
|
||||
cell.setCellValue("first row, first cell");
|
||||
cell.setCellValue(new HSSFRichTextString("first row, first cell"));
|
||||
|
||||
row = sheet.createRow(1);
|
||||
cell = row.createCell((short)1);
|
||||
cell.setCellValue("second row, second cell");
|
||||
cell.setCellValue(new HSSFRichTextString("second row, second cell"));
|
||||
|
||||
Region region = new Region(1, (short)0, 1, (short)1);
|
||||
sheet.addMergedRegion(region);
|
||||
@ -643,28 +656,28 @@ public final class TestHSSFSheet extends TestCase {
|
||||
|
||||
/** cell with formula becomes null on cloning a sheet*/
|
||||
public void test35084() {
|
||||
|
||||
HSSFWorkbook wb = new HSSFWorkbook();
|
||||
HSSFSheet s =wb.createSheet("Sheet1");
|
||||
HSSFRow r = s.createRow(0);
|
||||
r.createCell((short)0).setCellValue(1);
|
||||
r.createCell((short)1).setCellFormula("A1*2");
|
||||
HSSFSheet s1 = wb.cloneSheet(0);
|
||||
r=s1.getRow(0);
|
||||
assertEquals("double" ,r.getCell((short)0).getNumericCellValue(),(double)1,0); //sanity check
|
||||
assertNotNull(r.getCell((short)1));
|
||||
assertEquals("formula", r.getCell((short)1).getCellFormula(), "A1*2");
|
||||
}
|
||||
|
||||
HSSFWorkbook wb = new HSSFWorkbook();
|
||||
HSSFSheet s = wb.createSheet("Sheet1");
|
||||
HSSFRow r = s.createRow(0);
|
||||
r.createCell((short) 0).setCellValue(1);
|
||||
r.createCell((short) 1).setCellFormula("A1*2");
|
||||
HSSFSheet s1 = wb.cloneSheet(0);
|
||||
r = s1.getRow(0);
|
||||
assertEquals("double", r.getCell((short) 0).getNumericCellValue(), 1, 0); // sanity check
|
||||
assertNotNull(r.getCell((short) 1));
|
||||
assertEquals("formula", r.getCell((short) 1).getCellFormula(), "A1*2");
|
||||
}
|
||||
|
||||
/** test that new default column styles get applied */
|
||||
public void testDefaultColumnStyle() {
|
||||
HSSFWorkbook wb = new HSSFWorkbook();
|
||||
HSSFCellStyle style = wb.createCellStyle();
|
||||
HSSFSheet s = wb.createSheet();
|
||||
s.setDefaultColumnStyle((short)0, style);
|
||||
HSSFRow r = s.createRow(0);
|
||||
HSSFCell c = r.createCell((short)0);
|
||||
assertEquals("style should match", style.getIndex(), c.getCellStyle().getIndex());
|
||||
HSSFWorkbook wb = new HSSFWorkbook();
|
||||
HSSFCellStyle style = wb.createCellStyle();
|
||||
HSSFSheet s = wb.createSheet();
|
||||
s.setDefaultColumnStyle((short) 0, style);
|
||||
HSSFRow r = s.createRow(0);
|
||||
HSSFCell c = r.createCell((short) 0);
|
||||
assertEquals("style should match", style.getIndex(), c.getCellStyle().getIndex());
|
||||
}
|
||||
|
||||
|
||||
@ -814,11 +827,6 @@ public final class TestHSSFSheet extends TestCase {
|
||||
assertTrue(wb3.getSheetAt(3).getForceFormulaRecalculation());
|
||||
}
|
||||
|
||||
|
||||
public static void main(java.lang.String[] args) {
|
||||
junit.textui.TestRunner.run(TestHSSFSheet.class);
|
||||
}
|
||||
|
||||
public void testColumnWidth() throws Exception {
|
||||
//check we can correctly read column widths from a reference workbook
|
||||
HSSFWorkbook wb = openSample("colwidth.xls");
|
||||
@ -870,11 +878,33 @@ public final class TestHSSFSheet extends TestCase {
|
||||
assertEquals(256*10, sh.getColumnWidth((short)0));
|
||||
assertEquals(256*10, sh.getColumnWidth((short)1));
|
||||
assertEquals(256*10, sh.getColumnWidth((short)2));
|
||||
//columns D-F have custom wodth
|
||||
//columns D-F have custom width
|
||||
for (char i = 'D'; i <= 'F'; i++) {
|
||||
short w = (short)(256*12);
|
||||
assertEquals(w, sh.getColumnWidth((short)i));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Some utilities write Excel files without the ROW records.
|
||||
* Excel, ooo, and google docs are OK with this.
|
||||
* Now POI is too.
|
||||
*/
|
||||
public void testMissingRowRecords_bug41187() {
|
||||
HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("ex41187-19267.xls");
|
||||
|
||||
HSSFSheet sheet = wb.getSheetAt(0);
|
||||
HSSFRow row = sheet.getRow(0);
|
||||
if(row == null) {
|
||||
throw new AssertionFailedError("Identified bug 41187 a");
|
||||
}
|
||||
if (row.getHeight() == 0) {
|
||||
throw new AssertionFailedError("Identified bug 41187 b");
|
||||
}
|
||||
assertEquals("Hi Excel!", row.getCell(0).getRichStringCellValue().getString());
|
||||
// check row height for 'default' flag
|
||||
assertEquals((short)0x8000, row.getHeight());
|
||||
|
||||
HSSFTestDataSamples.writeOutAndReadBack(wb);
|
||||
}
|
||||
}
|
||||
|
@ -147,9 +147,10 @@ public final class TestHSSFWorkbook extends TestCase {
|
||||
// Single chart, two sheets
|
||||
b = openSample("44010-SingleChart.xls");
|
||||
assertEquals(2, b.getNumberOfSheets());
|
||||
assertEquals("Graph2", b.getSheetName(1));
|
||||
s = b.getSheetAt(1);
|
||||
assertEquals(0, s.getFirstRowNum());
|
||||
assertEquals(0, s.getLastRowNum());
|
||||
assertEquals(8, s.getLastRowNum());
|
||||
|
||||
// Has chart on 1st sheet??
|
||||
// FIXME
|
||||
@ -166,7 +167,7 @@ public final class TestHSSFWorkbook extends TestCase {
|
||||
assertEquals(2, b.getNumberOfSheets());
|
||||
s = b.getSheetAt(1);
|
||||
assertEquals(0, s.getFirstRowNum());
|
||||
assertEquals(0, s.getLastRowNum());
|
||||
assertEquals(8, s.getLastRowNum());
|
||||
|
||||
|
||||
// Two charts, three sheets
|
||||
@ -175,10 +176,10 @@ public final class TestHSSFWorkbook extends TestCase {
|
||||
|
||||
s = b.getSheetAt(1);
|
||||
assertEquals(0, s.getFirstRowNum());
|
||||
assertEquals(0, s.getLastRowNum());
|
||||
assertEquals(8, s.getLastRowNum());
|
||||
s = b.getSheetAt(2);
|
||||
assertEquals(0, s.getFirstRowNum());
|
||||
assertEquals(0, s.getLastRowNum());
|
||||
assertEquals(8, s.getLastRowNum());
|
||||
|
||||
// Has chart on 1st sheet??
|
||||
// FIXME
|
||||
@ -197,13 +198,13 @@ public final class TestHSSFWorkbook extends TestCase {
|
||||
|
||||
s = b.getSheetAt(1);
|
||||
assertEquals(0, s.getFirstRowNum());
|
||||
assertEquals(0, s.getLastRowNum());
|
||||
assertEquals(8, s.getLastRowNum());
|
||||
s = b.getSheetAt(2);
|
||||
assertEquals(0, s.getFirstRowNum());
|
||||
assertEquals(0, s.getLastRowNum());
|
||||
assertEquals(8, s.getLastRowNum());
|
||||
}
|
||||
|
||||
private static HSSFWorkbook writeRead(HSSFWorkbook b) {
|
||||
return HSSFTestDataSamples.writeOutAndReadBack(b);
|
||||
return HSSFTestDataSamples.writeOutAndReadBack(b);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user