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:
Josh Micich 2008-05-11 08:15:39 +00:00
parent 0277016ab5
commit c1a11a8b7c
16 changed files with 644 additions and 1389 deletions

View File

@ -37,6 +37,7 @@
<!-- Don't forget to update status.xml too! --> <!-- Don't forget to update status.xml too! -->
<release version="3.1-beta2" date="2008-05-??"> <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">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">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> <action dev="POI-DEVELOPERS" type="fix">42564 - fixed ArrayPtg to use ConstantValueParser. Fixed a few other ArrayPtg encoding issues.</action>

View File

@ -34,6 +34,7 @@
<!-- Don't forget to update changes.xml too! --> <!-- Don't forget to update changes.xml too! -->
<changes> <changes>
<release version="3.1-beta2" date="2008-05-??"> <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">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">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> <action dev="POI-DEVELOPERS" type="fix">42564 - fixed ArrayPtg to use ConstantValueParser. Fixed a few other ArrayPtg encoding issues.</action>

View File

@ -1,4 +1,3 @@
/* ==================================================================== /* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with contributor license agreements. See the NOTICE file distributed with
@ -16,7 +15,6 @@
limitations under the License. limitations under the License.
==================================================================== */ ==================================================================== */
package org.apache.poi.hssf.model; package org.apache.poi.hssf.model;
import org.apache.poi.hssf.record.*; import org.apache.poi.hssf.record.*;
@ -57,9 +55,7 @@ import java.util.List; // normally I don't do this, buy we literally mean ALL
* @see org.apache.poi.hssf.usermodel.HSSFSheet * @see org.apache.poi.hssf.usermodel.HSSFSheet
* @version 1.0-pre * @version 1.0-pre
*/ */
public final class Sheet implements Model {
public class Sheet implements Model
{
public static final short LeftMargin = 0; public static final short LeftMargin = 0;
public static final short RightMargin = 1; public static final short RightMargin = 1;
public static final short TopMargin = 2; public static final short TopMargin = 2;
@ -97,7 +93,7 @@ public class Sheet implements Model
protected ObjectProtectRecord objprotect = null; protected ObjectProtectRecord objprotect = null;
protected ScenarioProtectRecord scenprotect = null; protected ScenarioProtectRecord scenprotect = null;
protected PasswordRecord password = null; protected PasswordRecord password = null;
protected List condFormatting = new ArrayList();; protected List condFormatting = new ArrayList();
/** Add an UncalcedRecord if not true indicating formulas have not been calculated */ /** Add an UncalcedRecord if not true indicating formulas have not been calculated */
protected boolean uncalced = false; protected boolean uncalced = false;
@ -108,7 +104,7 @@ public class Sheet implements Model
public static final byte PANE_UPPER_LEFT = (byte)3; public static final byte PANE_UPPER_LEFT = (byte)3;
/** /**
* Creates new Sheet with no intialization --useless at this point * Creates new Sheet with no initialization --useless at this point
* @see #createSheet(List,int,int) * @see #createSheet(List,int,int)
*/ */
public Sheet() public Sheet()
@ -511,16 +507,15 @@ public class Sheet implements Model
} }
} }
//public int addMergedRegion(short rowFrom, short colFrom, short rowTo, public int addMergedRegion(int rowFrom, short colFrom, int rowTo, short colTo) {
public int addMergedRegion(int rowFrom, short colFrom, int rowTo,
short colTo)
{
// Validate input // Validate input
if (rowTo < rowFrom) { if (rowTo < rowFrom) {
throw new IllegalArgumentException("The row to ("+rowTo+") must be >= the row from ("+rowFrom+")"); throw new IllegalArgumentException("The 'to' row (" + rowTo
+ ") must not be less than the 'from' row (" + rowFrom + ")");
} }
if (colTo < colFrom) { if (colTo < colFrom) {
throw new IllegalArgumentException("The col to ("+colTo+") must be >= the col from ("+colFrom+")"); throw new IllegalArgumentException("The 'to' col (" + colTo
+ ") must not be less than the 'from' col (" + colFrom + ")");
} }
if (merged == null || merged.getNumAreas() == 1027) if (merged == null || merged.getNumAreas() == 1027)
@ -711,8 +706,6 @@ public class Sheet implements Model
* *
* @see org.apache.poi.hssf.record.DimensionsRecord * @see org.apache.poi.hssf.record.DimensionsRecord
*/ */
//public void setDimensions(short firstrow, short firstcol, short lastrow,
public void setDimensions(int firstrow, short firstcol, int lastrow, public void setDimensions(int firstrow, short firstcol, int lastrow,
short lastcol) short lastcol)
{ {
@ -735,7 +728,7 @@ public class Sheet implements Model
/** /**
* set the locator for where we should look for the next value record. The * set the locator for where we should look for the next value record. The
* algorythm will actually start here and find the correct location so you * algorithm will actually start here and find the correct location so you
* can set this to 0 and watch performance go down the tubes but it will work. * can set this to 0 and watch performance go down the tubes but it will work.
* After a value is set this is automatically advanced. Its also set by the * After a value is set this is automatically advanced. Its also set by the
* create method. So you probably shouldn't mess with this unless you have * create method. So you probably shouldn't mess with this unless you have
@ -930,8 +923,6 @@ public class Sheet implements Model
* @return LabelSSTRecord newly created containing your SST Index, row,col. * @return LabelSSTRecord newly created containing your SST Index, row,col.
* @see org.apache.poi.hssf.record.SSTRecord * @see org.apache.poi.hssf.record.SSTRecord
*/ */
//public LabelSSTRecord createLabelSST(short row, short col, int index)
public LabelSSTRecord createLabelSST(int row, short col, int index) public LabelSSTRecord createLabelSST(int row, short col, int index)
{ {
log.logFormatted(POILogger.DEBUG, "create labelsst row,col,index %,%,%", log.logFormatted(POILogger.DEBUG, "create labelsst row,col,index %,%,%",
@ -957,8 +948,6 @@ public class Sheet implements Model
* *
* @return NumberRecord for that row, col containing that value as added to the sheet * @return NumberRecord for that row, col containing that value as added to the sheet
*/ */
//public NumberRecord createNumber(short row, short col, double value)
public NumberRecord createNumber(int row, short col, double value) public NumberRecord createNumber(int row, short col, double value)
{ {
log.logFormatted(POILogger.DEBUG, "create number row,col,value %,%,%", log.logFormatted(POILogger.DEBUG, "create number row,col,value %,%,%",
@ -968,7 +957,6 @@ public class Sheet implements Model
}); });
NumberRecord rec = new NumberRecord(); NumberRecord rec = new NumberRecord();
//rec.setRow(( short ) row);
rec.setRow(row); rec.setRow(row);
rec.setColumn(col); rec.setColumn(col);
rec.setValue(value); rec.setValue(value);
@ -982,18 +970,14 @@ public class Sheet implements Model
* @param row - the row the BlankRecord is a member of * @param row - the row the BlankRecord is a member of
* @param col - the column the BlankRecord is a member of * @param col - the column the BlankRecord is a member of
*/ */
//public BlankRecord createBlank(short row, short col)
public BlankRecord createBlank(int row, short col) public BlankRecord createBlank(int row, short col)
{ {
//log.logFormatted(POILogger.DEBUG, "create blank row,col %,%", new short[]
log.logFormatted(POILogger.DEBUG, "create blank row,col %,%", new int[] log.logFormatted(POILogger.DEBUG, "create blank row,col %,%", new int[]
{ {
row, col row, col
}); });
BlankRecord rec = new BlankRecord(); BlankRecord rec = new BlankRecord();
//rec.setRow(( short ) row);
rec.setRow(row); rec.setRow(row);
rec.setColumn(col); rec.setColumn(col);
rec.setXFIndex(( short ) 0x0f); rec.setXFIndex(( short ) 0x0f);
@ -1009,12 +993,9 @@ public class Sheet implements Model
* @param formula - a String representing the formula. To be parsed to PTGs * @param formula - a String representing the formula. To be parsed to PTGs
* @return bogus/useless formula record * @return bogus/useless formula record
*/ */
//public FormulaRecord createFormula(short row, short col, String formula)
public FormulaRecord createFormula(int row, short col, String formula) public FormulaRecord createFormula(int row, short col, String formula)
{ {
log.logFormatted(POILogger.DEBUG, "create formula row,col,formula %,%,%", log.logFormatted(POILogger.DEBUG, "create formula row,col,formula %,%,%",
//new short[]
new int[] new int[]
{ {
row, col row, col
@ -1052,8 +1033,6 @@ public class Sheet implements Model
* @param row the row to add the cell value to * @param row the row to add the cell value to
* @param col the cell value record itself. * @param col the cell value record itself.
*/ */
//public void addValueRecord(short row, CellValueRecordInterface col)
public void addValueRecord(int row, CellValueRecordInterface col) public void addValueRecord(int row, CellValueRecordInterface col)
{ {
checkCells(); checkCells();
@ -1075,29 +1054,6 @@ public class Sheet implements Model
d.setFirstCol(col.getColumn()); d.setFirstCol(col.getColumn());
} }
cells.insertCell(col); cells.insertCell(col);
/*
* for (int k = loc; k < records.size(); k++)
* {
* Record rec = ( Record ) records.get(k);
*
* if (rec.getSid() == RowRecord.sid)
* {
* RowRecord rowrec = ( RowRecord ) rec;
*
* if (rowrec.getRowNumber() == col.getRow())
* {
* records.add(k + 1, col);
* loc = k;
* if (rowrec.getLastCol() <= col.getColumn())
* {
* rowrec.setLastCol((( short ) (col.getColumn() + 1)));
* }
* break;
* }
* }
* }
*/
} }
/** /**
@ -1109,8 +1065,6 @@ public class Sheet implements Model
* @param col - a record supporting the CellValueRecordInterface. * @param col - a record supporting the CellValueRecordInterface.
* @see org.apache.poi.hssf.record.CellValueRecordInterface * @see org.apache.poi.hssf.record.CellValueRecordInterface
*/ */
//public void removeValueRecord(short row, CellValueRecordInterface col)
public void removeValueRecord(int row, CellValueRecordInterface col) public void removeValueRecord(int row, CellValueRecordInterface col)
{ {
checkCells(); checkCells();
@ -1118,27 +1072,6 @@ public class Sheet implements Model
new int[]{row, dimsloc} ); new int[]{row, dimsloc} );
loc = dimsloc; loc = dimsloc;
cells.removeCell(col); cells.removeCell(col);
/*
* for (int k = loc; k < records.size(); k++)
* {
* Record rec = ( Record ) records.get(k);
*
* // checkDimsLoc(rec,k);
* if (rec.isValue())
* {
* CellValueRecordInterface cell =
* ( CellValueRecordInterface ) rec;
*
* if ((cell.getRow() == col.getRow())
* && (cell.getColumn() == col.getColumn()))
* {
* records.remove(k);
* break;
* }
* }
* }
*/
} }
/** /**
@ -1164,22 +1097,6 @@ public class Sheet implements Model
//double the memory //double the memory
cells.removeCell(newval); cells.removeCell(newval);
cells.insertCell(newval); cells.insertCell(newval);
/*
* CellValueRecordInterface oldval = getNextValueRecord();
*
* while (oldval != null)
* {
* if (oldval.isEqual(newval))
* {
* records.set(( short ) (getLoc() - 1), newval);
* return;
* }
* oldval = getNextValueRecord();
* }
* addValueRecord(newval.getRow(), newval);
* setLoc(dimsloc);
*/
} }
/** /**
@ -1218,41 +1135,6 @@ public class Sheet implements Model
rows.insertRow(row); rows.insertRow(row);
/*
* for (int k = loc; k < records.size(); k++)
* {
* Record rec = ( Record ) records.get(k);
*
* if (rec.getSid() == IndexRecord.sid)
* {
* index = ( IndexRecord ) rec;
* }
* if (rec.getSid() == RowRecord.sid)
* {
* RowRecord rowrec = ( RowRecord ) rec;
*
* if (rowrec.getRowNumber() > row.getRowNumber())
* {
* records.add(k, row);
* loc = k;
* break;
* }
* }
* if (rec.getSid() == WindowTwoRecord.sid)
* {
* records.add(k, row);
* loc = k;
* break;
* }
* }
* if (index != null)
* {
* if (index.getLastRowAdd1() <= row.getRowNumber())
* {
* index.setLastRowAdd1(row.getRowNumber() + 1);
* }
* }
*/
if (log.check( POILogger.DEBUG )) if (log.check( POILogger.DEBUG ))
log.log(POILogger.DEBUG, "exit addRow"); log.log(POILogger.DEBUG, "exit addRow");
} }
@ -1268,33 +1150,9 @@ public class Sheet implements Model
public void removeRow(RowRecord row) public void removeRow(RowRecord row)
{ {
checkRows(); checkRows();
// IndexRecord index = null;
setLoc(getDimsLoc()); setLoc(getDimsLoc());
rows.removeRow(row); rows.removeRow(row);
/*
* for (int k = loc; k < records.size(); k++)
* {
* Record rec = ( Record ) records.get(k);
*
* // checkDimsLoc(rec,k);
* if (rec.getSid() == RowRecord.sid)
* {
* RowRecord rowrec = ( RowRecord ) rec;
*
* if (rowrec.getRowNumber() == row.getRowNumber())
* {
* records.remove(k);
* break;
* }
* }
* if (rec.getSid() == WindowTwoRecord.sid)
* {
* break;
* }
* }
*/
} }
/** /**
@ -1325,66 +1183,8 @@ public class Sheet implements Model
return null; return null;
} }
return ( CellValueRecordInterface ) valueRecIterator.next(); return ( CellValueRecordInterface ) valueRecIterator.next();
/*
* if (this.getLoc() < records.size())
* {
* for (int k = getLoc(); k < records.size(); k++)
* {
* Record rec = ( Record ) records.get(k);
*
* this.setLoc(k + 1);
* if (rec instanceof CellValueRecordInterface)
* {
* return ( CellValueRecordInterface ) rec;
* }
* }
* }
* return null;
*/
} }
/**
* get the NEXT RowRecord or CellValueRecord(from LOC). The first record that
* is a Row record or CellValueRecord(starting at LOC) will be returned.
* <P>
* This method is "loc" sensitive. Meaning you need to set LOC to where you
* want it to start searching. If you don't know do this: setLoc(getDimsLoc).
* When adding several rows you can just start at the last one by leaving loc
* at what this sets it to. For this method, set loc to dimsloc to start with.
* subsequent calls will return rows in (physical) sequence or NULL when you get to the end.
*
* @return RowRecord representing the next row record or CellValueRecordInterface
* representing the next cellvalue or NULL if there are no more
* @see #setLoc(int)
*
*/
/* public Record getNextRowOrValue()
{
POILogger.DEBUG((new StringBuffer("getNextRow loc= ")).append(loc)
.toString());
if (this.getLoc() < records.size())
{
for (int k = this.getLoc(); k < records.size(); k++)
{
Record rec = ( Record ) records.get(k);
this.setLoc(k + 1);
if (rec.getSid() == RowRecord.sid)
{
return rec;
}
else if (rec.isValue())
{
return rec;
}
}
}
return null;
}
*/
/** /**
* get the NEXT RowRecord (from LOC). The first record that is a Row record * get the NEXT RowRecord (from LOC). The first record that is a Row record
* (starting at LOC) will be returned. * (starting at LOC) will be returned.
@ -1413,20 +1213,6 @@ public class Sheet implements Model
return null; return null;
} }
return ( RowRecord ) rowRecIterator.next(); return ( RowRecord ) rowRecIterator.next();
/* if (this.getLoc() < records.size())
{
for (int k = this.getLoc(); k < records.size(); k++)
{
Record rec = ( Record ) records.get(k);
this.setLoc(k + 1);
if (rec.getSid() == RowRecord.sid)
{
return ( RowRecord ) rec;
}
}
}*/
} }
/** /**
@ -1445,34 +1231,10 @@ public class Sheet implements Model
* @see #setLoc(int) * @see #setLoc(int)
* *
*/ */
public RowRecord getRow(int rownum) {
//public RowRecord getRow(short rownum)
public RowRecord getRow(int rownum)
{
if (log.check( POILogger.DEBUG )) if (log.check( POILogger.DEBUG ))
log.log(POILogger.DEBUG, "getNextRow loc= " + loc); log.log(POILogger.DEBUG, "getNextRow loc= " + loc);
return rows.getRow(rownum); return rows.getRow(rownum);
/*
* if (this.getLoc() < records.size())
* {
* for (int k = this.getLoc(); k < records.size(); k++)
* {
* Record rec = ( Record ) records.get(k);
*
* this.setLoc(k + 1);
* if (rec.getSid() == RowRecord.sid)
* {
* if ((( RowRecord ) rec).getRowNumber() == rownum)
* {
* return ( RowRecord ) rec;
* }
* }
* }
* }
*/
// return null;
} }
/** /**
@ -1489,7 +1251,6 @@ public class Sheet implements Model
retval.setVersion(( short ) 0x600); retval.setVersion(( short ) 0x600);
retval.setType(( short ) 0x010); retval.setType(( short ) 0x010);
// retval.setBuild((short)0x10d3);
retval.setBuild(( short ) 0x0dbb); retval.setBuild(( short ) 0x0dbb);
retval.setBuildYear(( short ) 1996); retval.setBuildYear(( short ) 1996);
retval.setHistoryBitMask(0xc1); retval.setHistoryBitMask(0xc1);
@ -1807,7 +1568,7 @@ public class Sheet implements Model
* @see org.apache.poi.hssf.record.ColumnInfoRecord * @see org.apache.poi.hssf.record.ColumnInfoRecord
* @return record containing a ColumnInfoRecord * @return record containing a ColumnInfoRecord
*/ */
// TODO change return type to ColumnInfoRecord
protected Record createColInfo() protected Record createColInfo()
{ {
return ColumnInfoRecordsAggregate.createColInfo(); return ColumnInfoRecordsAggregate.createColInfo();
@ -3040,7 +2801,7 @@ public class Sheet implements Model
* @param scenarios are unprotected (false = unprotect) * @param scenarios are unprotected (false = unprotect)
*/ */
public void unprotectSheet( boolean sheet, boolean objects, boolean scenarios ) { public void unprotectSheet( boolean sheet, boolean objects, boolean scenarios ) {
int protIdx = -1;
if (!sheet) { if (!sheet) {
ProtectRecord prec = getProtect(); ProtectRecord prec = getProtect();
prec.setProtect(sheet); prec.setProtect(sheet);
@ -3064,179 +2825,6 @@ public class Sheet implements Model
(scenprotect != null && scenprotect.getProtect())}; (scenprotect != null && scenprotect.getProtect())};
} }
// private void collapseColumn( short columnNumber )
// {
// int idx = findColumnIdx( columnNumber, 0 );
// if (idx == -1)
// return;
//
// // Find the start of the group.
// ColumnInfoRecord columnInfo = (ColumnInfoRecord) columnSizes.get( findStartOfColumnOutlineGroup( idx ) );
//
// // Hide all the columns until the end of the group
// columnInfo = writeHidden( columnInfo, idx, true );
//
// // Write collapse field
// setColumn( (short) ( columnInfo.getLastColumn() + 1 ), null, null, null, Boolean.TRUE);
// }
// private void expandColumn( short columnNumber )
// {
// int idx = findColumnIdx( columnNumber, 0 );
// if (idx == -1)
// return;
//
// // If it is already exapanded do nothing.
// if (!isColumnGroupCollapsed(idx))
// return;
//
// // Find the start of the group.
// int startIdx = findStartOfColumnOutlineGroup( idx );
// ColumnInfoRecord columnInfo = getColInfo( startIdx );
//
// // Find the end of the group.
// int endIdx = findEndOfColumnOutlineGroup( idx );
// ColumnInfoRecord endColumnInfo = getColInfo( endIdx );
//
// // expand:
// // colapsed 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
// if (!isColumnGroupHiddenByParent( idx ))
// {
// for (int i = startIdx; i <= endIdx; i++)
// {
// if (columnInfo.getOutlineLevel() == getColInfo(i).getOutlineLevel())
// getColInfo(i).setHidden( false );
// }
// }
//
// // Write collapse field
// setColumn( (short) ( columnInfo.getLastColumn() + 1 ), null, null, null, Boolean.FALSE);
// }
// private boolean isColumnGroupCollapsed( int idx )
// {
// int endOfOutlineGroupIdx = findEndOfColumnOutlineGroup( idx );
// if (endOfOutlineGroupIdx >= columnSizes.size())
// return false;
// if (getColInfo(endOfOutlineGroupIdx).getLastColumn() + 1 != getColInfo(endOfOutlineGroupIdx + 1).getFirstColumn())
// return false;
// else
// return getColInfo(endOfOutlineGroupIdx+1).getCollapsed();
// }
// private boolean isColumnGroupHiddenByParent( int idx )
// {
// // Look out outline details of end
// int endLevel;
// boolean endHidden;
// int endOfOutlineGroupIdx = findEndOfColumnOutlineGroup( idx );
// if (endOfOutlineGroupIdx >= columnSizes.size())
// {
// endLevel = 0;
// endHidden = false;
// }
// else if (getColInfo(endOfOutlineGroupIdx).getLastColumn() + 1 != getColInfo(endOfOutlineGroupIdx + 1).getFirstColumn())
// {
// endLevel = 0;
// endHidden = false;
// }
// else
// {
// endLevel = getColInfo( endOfOutlineGroupIdx + 1).getOutlineLevel();
// endHidden = getColInfo( endOfOutlineGroupIdx + 1).getHidden();
// }
//
// // Look out outline details of start
// int startLevel;
// boolean startHidden;
// int startOfOutlineGroupIdx = findStartOfColumnOutlineGroup( idx );
// if (startOfOutlineGroupIdx <= 0)
// {
// startLevel = 0;
// startHidden = false;
// }
// else if (getColInfo(startOfOutlineGroupIdx).getFirstColumn() - 1 != getColInfo(startOfOutlineGroupIdx - 1).getLastColumn())
// {
// startLevel = 0;
// startHidden = false;
// }
// else
// {
// startLevel = getColInfo( startOfOutlineGroupIdx - 1).getOutlineLevel();
// startHidden = getColInfo( startOfOutlineGroupIdx - 1 ).getHidden();
// }
//
// if (endLevel > startLevel)
// {
// return endHidden;
// }
// else
// {
// return startHidden;
// }
// }
// private ColumnInfoRecord getColInfo(int idx)
// {
// return columns.getColInfo( idx );
// }
// private int findStartOfColumnOutlineGroup(int idx)
// {
// // Find the start of the group.
// ColumnInfoRecord columnInfo = (ColumnInfoRecord) columnSizes.get( idx );
// int level = columnInfo.getOutlineLevel();
// while (idx != 0)
// {
// ColumnInfoRecord prevColumnInfo = (ColumnInfoRecord) columnSizes.get( idx - 1 );
// if (columnInfo.getFirstColumn() - 1 == prevColumnInfo.getLastColumn())
// {
// if (prevColumnInfo.getOutlineLevel() < level)
// {
// break;
// }
// idx--;
// columnInfo = prevColumnInfo;
// }
// else
// {
// break;
// }
// }
//
// return idx;
// }
// private int findEndOfColumnOutlineGroup(int idx)
// {
// // Find the end of the group.
// ColumnInfoRecord columnInfo = (ColumnInfoRecord) columnSizes.get( idx );
// int level = columnInfo.getOutlineLevel();
// while (idx < columnSizes.size() - 1)
// {
// ColumnInfoRecord nextColumnInfo = (ColumnInfoRecord) columnSizes.get( idx + 1 );
// if (columnInfo.getLastColumn() + 1 == nextColumnInfo.getFirstColumn())
// {
// if (nextColumnInfo.getOutlineLevel() < level)
// {
// break;
// }
// idx++;
// columnInfo = nextColumnInfo;
// }
// else
// {
// break;
// }
// }
//
// return idx;
// }
public void groupRowRange(int fromRow, int toRow, boolean indent) public void groupRowRange(int fromRow, int toRow, boolean indent)
{ {
@ -3291,126 +2879,4 @@ public class Sheet implements Model
rows.expandRow( row ); rows.expandRow( row );
} }
} }
// private void collapseRow( int rowNumber )
// {
//
// // Find the start of the group.
// int startRow = rows.findStartOfRowOutlineGroup( rowNumber );
// RowRecord rowRecord = (RowRecord) rows.getRow( startRow );
//
// // Hide all the columns until the end of the group
// int lastRow = rows.writeHidden( rowRecord, startRow, true );
//
// // Write collapse field
// if (getRow(lastRow + 1) != null)
// {
// getRow(lastRow + 1).setColapsed( true );
// }
// else
// {
// RowRecord row = createRow( lastRow + 1);
// row.setColapsed( true );
// rows.insertRow( row );
// }
// }
// private int findStartOfRowOutlineGroup(int row)
// {
// // Find the start of the group.
// RowRecord rowRecord = rows.getRow( row );
// int level = rowRecord.getOutlineLevel();
// int currentRow = row;
// while (rows.getRow( currentRow ) != null)
// {
// rowRecord = rows.getRow( currentRow );
// if (rowRecord.getOutlineLevel() < level)
// return currentRow + 1;
// currentRow--;
// }
//
// return currentRow + 1;
// }
// private int writeHidden( RowRecord rowRecord, int row, boolean hidden )
// {
// int level = rowRecord.getOutlineLevel();
// while (rowRecord != null && rows.getRow(row).getOutlineLevel() >= level)
// {
// rowRecord.setZeroHeight( hidden );
// row++;
// rowRecord = rows.getRow( row );
// }
// return row - 1;
// }
// private int findEndOfRowOutlineGroup( int row )
// {
// int level = getRow( row ).getOutlineLevel();
// int currentRow;
// for (currentRow = row; currentRow < rows.getLastRowNum(); currentRow++)
// {
// if (getRow(currentRow) == null || getRow(currentRow).getOutlineLevel() < level)
// {
// break;
// }
// }
//
// return currentRow-1;
// }
// private boolean isRowGroupCollapsed( int row )
// {
// int collapseRow = rows.findEndOfRowOutlineGroup( row ) + 1;
//
// if (getRow(collapseRow) == null)
// return false;
// else
// return getRow( collapseRow ).getColapsed();
// }
// private boolean isRowGroupHiddenByParent( int row )
// {
// // Look out outline details of end
// int endLevel;
// boolean endHidden;
// int endOfOutlineGroupIdx = rows.findEndOfRowOutlineGroup( row );
// if (getRow( endOfOutlineGroupIdx + 1 ) == null)
// {
// endLevel = 0;
// endHidden = false;
// }
// else
// {
// endLevel = getRow( endOfOutlineGroupIdx + 1).getOutlineLevel();
// endHidden = getRow( endOfOutlineGroupIdx + 1).getZeroHeight();
// }
//
// // Look out outline details of start
// int startLevel;
// boolean startHidden;
// int startOfOutlineGroupIdx = rows.findStartOfRowOutlineGroup( row );
// if (startOfOutlineGroupIdx - 1 < 0 || getRow(startOfOutlineGroupIdx - 1) == null)
// {
// startLevel = 0;
// startHidden = false;
// }
// else
// {
// startLevel = getRow( startOfOutlineGroupIdx - 1).getOutlineLevel();
// startHidden = getRow( startOfOutlineGroupIdx - 1 ).getZeroHeight();
// }
//
// if (endLevel > startLevel)
// {
// return endHidden;
// }
// else
// {
// return startHidden;
// }
// }
} }

View File

@ -1,4 +1,3 @@
/* ==================================================================== /* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with contributor license agreements. See the NOTICE file distributed with
@ -16,7 +15,6 @@
limitations under the License. limitations under the License.
==================================================================== */ ==================================================================== */
package org.apache.poi.hssf.record; package org.apache.poi.hssf.record;
import org.apache.poi.util.BitField; import org.apache.poi.util.BitField;
@ -31,19 +29,17 @@ import org.apache.poi.util.LittleEndian;
* @author Jason Height (jheight at chariot dot net dot au) * @author Jason Height (jheight at chariot dot net dot au)
* @version 2.0-pre * @version 2.0-pre
*/ */
public final class RowRecord extends Record implements Comparable {
public class RowRecord
extends Record
implements Comparable
{
public final static short sid = 0x208; 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. * max number of rows.
*/ */
public final static int MAX_ROW_NUMBER = 65535; 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_2_first_col;
private short field_3_last_col; // plus 1 private short field_3_last_col; // plus 1
@ -52,7 +48,8 @@ public class RowRecord
// for generated sheets. // for generated sheets.
private short field_6_reserved; 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); private static final BitField outlineLevel = BitFieldFactory.getInstance(0x07);
// bit 3 reserved // bit 3 reserved
@ -62,8 +59,17 @@ public class RowRecord
private static final BitField formatted = BitFieldFactory.getInstance(0x80); private static final BitField formatted = BitFieldFactory.getInstance(0x80);
private short field_8_xf_index; // only if isFormatted 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) protected void fillFields(RecordInputStream in)
{ {
//field_1_row_number = LittleEndian.getShort(data, 0 + offset);
field_1_row_number = in.readUShort(); field_1_row_number = in.readUShort();
field_2_first_col = in.readShort(); field_2_first_col = in.readShort();
field_3_last_col = in.readShort(); field_3_last_col = in.readShort();
@ -156,7 +161,7 @@ public class RowRecord
public void setOptionFlags(short options) public void setOptionFlags(short options)
{ {
field_7_option_flags = options; field_7_option_flags = options | OPTION_BITS_ALWAYS_SET;
} }
// option bitfields // option bitfields
@ -169,20 +174,18 @@ public class RowRecord
public void setOutlineLevel(short ol) public void setOutlineLevel(short ol)
{ {
field_7_option_flags = field_7_option_flags = outlineLevel.setValue(field_7_option_flags, ol);
outlineLevel.setShortValue(field_7_option_flags, ol);
} }
/** /**
* set whether or not to colapse this row * set whether or not to collapse this row
* @param c - colapse or not * @param c - collapse or not
* @see #setOptionFlags(short) * @see #setOptionFlags(short)
*/ */
public void setColapsed(boolean c) public void setColapsed(boolean c)
{ {
field_7_option_flags = colapsed.setShortBoolean(field_7_option_flags, field_7_option_flags = colapsed.setBoolean(field_7_option_flags, c);
c);
} }
/** /**
@ -193,8 +196,7 @@ public class RowRecord
public void setZeroHeight(boolean z) public void setZeroHeight(boolean z)
{ {
field_7_option_flags = field_7_option_flags = zeroHeight.setBoolean(field_7_option_flags, z);
zeroHeight.setShortBoolean(field_7_option_flags, z);
} }
/** /**
@ -205,8 +207,7 @@ public class RowRecord
public void setBadFontHeight(boolean f) public void setBadFontHeight(boolean f)
{ {
field_7_option_flags = field_7_option_flags = badFontHeight.setBoolean(field_7_option_flags, f);
badFontHeight.setShortBoolean(field_7_option_flags, f);
} }
/** /**
@ -217,8 +218,7 @@ public class RowRecord
public void setFormatted(boolean f) public void setFormatted(boolean f)
{ {
field_7_option_flags = formatted.setShortBoolean(field_7_option_flags, field_7_option_flags = formatted.setBoolean(field_7_option_flags, f);
f);
} }
// end bitfields // end bitfields
@ -293,7 +293,7 @@ public class RowRecord
public short getOptionFlags() public short getOptionFlags()
{ {
return field_7_option_flags; return (short)field_7_option_flags;
} }
// option bitfields // option bitfields
@ -306,7 +306,7 @@ public class RowRecord
public short getOutlineLevel() 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, 0 + offset, sid);
LittleEndian.putShort(data, 2 + offset, ( short ) 16); LittleEndian.putShort(data, 2 + offset, ( short ) 16);
//LittleEndian.putShort(data, 4 + offset, getRowNumber());
LittleEndian.putShort(data, 4 + offset, ( short ) getRowNumber()); LittleEndian.putShort(data, 4 + offset, ( short ) getRowNumber());
LittleEndian.putShort(data, 6 + offset, getFirstCol() == -1 ? (short)0 : getFirstCol()); LittleEndian.putShort(data, 6 + offset, getFirstCol() == -1 ? (short)0 : getFirstCol());
LittleEndian.putShort(data, 8 + offset, getLastCol() == -1 ? (short)0 : getLastCol()); 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, 14 + offset, field_6_reserved);
LittleEndian.putShort(data, 16 + offset, getOptionFlags()); LittleEndian.putShort(data, 16 + offset, getOptionFlags());
// LittleEndian.putShort(data,18,getOutlineLevel());
LittleEndian.putShort(data, 18 + offset, getXFIndex()); LittleEndian.putShort(data, 18 + offset, getXFIndex());
return getRecordSize(); return getRecordSize();
} }
@ -469,8 +467,7 @@ public class RowRecord
} }
public Object clone() { public Object clone() {
RowRecord rec = new RowRecord(); RowRecord rec = new RowRecord(field_1_row_number);
rec.field_1_row_number = field_1_row_number;
rec.field_2_first_col = field_2_first_col; rec.field_2_first_col = field_2_first_col;
rec.field_3_last_col = field_3_last_col; rec.field_3_last_col = field_3_last_col;
rec.field_4_height = field_4_height; rec.field_4_height = field_4_height;

View File

@ -35,13 +35,11 @@ import java.util.TreeMap;
* @author Jason Height (jheight at chariot dot net dot au) * @author Jason Height (jheight at chariot dot net dot au)
*/ */
public class RowRecordsAggregate public final class RowRecordsAggregate extends Record {
extends Record private int firstrow = -1;
{ private int lastrow = -1;
int firstrow = -1; private Map records = null; // TODO - use a proper key in this map
int lastrow = -1; private int size = 0;
Map records = null;
int size = 0;
/** Creates a new instance of ValueRecordsAggregate */ /** Creates a new instance of ValueRecordsAggregate */
@ -74,15 +72,13 @@ public class RowRecordsAggregate
records.remove(row); records.remove(row);
} }
public RowRecord getRow(int rownum) public RowRecord getRow(int rownum) {
{
// Row must be between 0 and 65535 // Row must be between 0 and 65535
if(rownum < 0 || rownum > 65535) { if(rownum < 0 || rownum > 65535) {
throw new IllegalArgumentException("The row number must be between 0 and 65535"); throw new IllegalArgumentException("The row number must be between 0 and 65535");
} }
RowRecord row = new RowRecord(); RowRecord row = new RowRecord(rownum);
row.setRowNumber(rownum);
return ( RowRecord ) records.get(row); return ( RowRecord ) records.get(row);
} }
@ -333,7 +329,7 @@ public class RowRecordsAggregate
// Find the start of the group. // Find the start of the group.
int startRow = findStartOfRowOutlineGroup( rowNumber ); int startRow = findStartOfRowOutlineGroup( rowNumber );
RowRecord rowRecord = (RowRecord) getRow( startRow ); RowRecord rowRecord = getRow( startRow );
// Hide all the columns until the end of the group // Hide all the columns until the end of the group
int lastRow = writeHidden( rowRecord, startRow, true ); int lastRow = writeHidden( rowRecord, startRow, true );
@ -358,17 +354,8 @@ public class RowRecordsAggregate
* @return RowRecord created for the passed in row number * @return RowRecord created for the passed in row number
* @see org.apache.poi.hssf.record.RowRecord * @see org.apache.poi.hssf.record.RowRecord
*/ */
public static RowRecord createRow(int row) public static RowRecord createRow(int rowNumber) {
{ return new RowRecord(rowNumber);
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 boolean isRowGroupCollapsed( int row ) public boolean isRowGroupCollapsed( int row )
@ -399,12 +386,12 @@ public class RowRecordsAggregate
int endIdx = findEndOfRowOutlineGroup( idx ); int endIdx = findEndOfRowOutlineGroup( idx );
// expand: // expand:
// colapsed bit must be unset // collapsed bit must be unset
// hidden bit gets unset _if_ surrounding groups are expanded you can determine // 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 // 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 // to look at the start and the end of the current group to determine which
// is the enclosing group // 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 ) ) if ( !isRowGroupHiddenByParent( idx ) )
{ {
for ( int i = startIdx; i <= endIdx; i++ ) for ( int i = startIdx; i <= endIdx; i++ )

View File

@ -21,7 +21,6 @@ import java.util.Iterator;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
import org.apache.poi.hssf.model.Sheet; 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.CellValueRecordInterface;
import org.apache.poi.hssf.record.RowRecord; import org.apache.poi.hssf.record.RowRecord;
@ -37,11 +36,9 @@ public final class HSSFRow implements Comparable {
// used for collections // used for collections
public final static int INITIAL_CAPACITY = 5; public final static int INITIAL_CAPACITY = 5;
//private short rowNum;
private int rowNum; private int rowNum;
private HSSFCell[] cells=new HSSFCell[INITIAL_CAPACITY]; private HSSFCell[] cells=new HSSFCell[INITIAL_CAPACITY];
// private short firstcell = -1;
// private short lastcell = -1;
/** /**
* reference to low level representation * reference to low level representation
@ -61,7 +58,8 @@ public final class HSSFRow implements Comparable {
private Sheet sheet; 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) * @param rowNum the row number of this row (0 based)
* @see org.apache.poi.hssf.usermodel.HSSFSheet#createRow(int) * @see org.apache.poi.hssf.usermodel.HSSFSheet#createRow(int)
*/ */
HSSFRow(HSSFWorkbook book, Sheet sheet, int rowNum)
//protected HSSFRow(Workbook book, Sheet sheet, short rowNum)
protected HSSFRow(HSSFWorkbook book, Sheet sheet, int rowNum)
{ {
this.rowNum = rowNum; this.rowNum = rowNum;
this.book = book; this.book = book;
this.sheet = sheet; this.sheet = sheet;
row = new RowRecord(); row = new RowRecord(rowNum);
row.setOptionFlags( (short)0x100 ); // seems necessary for outlining to work.
row.setHeight((short) 0xff);
row.setLastCol((short) -1);
row.setFirstCol((short) -1);
setRowNum(rowNum); setRowNum(rowNum);
} }
@ -98,8 +90,7 @@ public final class HSSFRow implements Comparable {
* @param record the low level api object this row should represent * @param record the low level api object this row should represent
* @see org.apache.poi.hssf.usermodel.HSSFSheet#createRow(int) * @see org.apache.poi.hssf.usermodel.HSSFSheet#createRow(int)
*/ */
HSSFRow(HSSFWorkbook book, Sheet sheet, RowRecord record)
protected HSSFRow(HSSFWorkbook book, Sheet sheet, RowRecord record)
{ {
this.book = book; this.book = book;
this.sheet = sheet; this.sheet = sheet;
@ -200,12 +191,11 @@ public final class HSSFRow implements Comparable {
* @param rowNum the row number (0-based) * @param rowNum the row number (0-based)
* @throws IndexOutOfBoundsException if the row number is not within the range 0-65535. * @throws IndexOutOfBoundsException if the row number is not within the range 0-65535.
*/ */
public void setRowNum(int rowNum) {
//public void setRowNum(short rowNum) if ((rowNum < 0) || (rowNum > RowRecord.MAX_ROW_NUMBER)) {
public void setRowNum(int rowNum) throw new IllegalArgumentException("Invalid row number (" + rowNum
{ + ") outside allowable range (0.." + RowRecord.MAX_ROW_NUMBER + ")");
if ((rowNum < 0) || (rowNum > RowRecord.MAX_ROW_NUMBER)) }
throw new IndexOutOfBoundsException("Row number must be between 0 and "+RowRecord.MAX_ROW_NUMBER+", was <"+rowNum+">");
this.rowNum = rowNum; this.rowNum = rowNum;
if (row != null) if (row != null)
{ {
@ -217,8 +207,6 @@ public final class HSSFRow implements Comparable {
* get row number this row represents * get row number this row represents
* @return the row number (0 based) * @return the row number (0 based)
*/ */
//public short getRowNum()
public int getRowNum() public int getRowNum()
{ {
return rowNum; return rowNum;

View File

@ -136,6 +136,7 @@ public final class HSSFSheet {
{ {
int sloc = sheet.getLoc(); int sloc = sheet.getLoc();
RowRecord row = sheet.getNextRow(); RowRecord row = sheet.getNextRow();
boolean rowRecordsAlreadyPresent = row!=null;
while (row != null) while (row != null)
{ {
@ -160,6 +161,18 @@ public final class HSSFSheet {
if ( ( lastrow == null ) || ( lastrow.getRowNum() != cval.getRow() ) ) if ( ( lastrow == null ) || ( lastrow.getRowNum() != cval.getRow() ) )
{ {
hrow = getRow( 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 ) if ( hrow != null )
{ {

View File

@ -22,9 +22,7 @@ import junit.framework.TestSuite;
import org.apache.poi.hssf.eventmodel.TestEventRecordFactory; import org.apache.poi.hssf.eventmodel.TestEventRecordFactory;
import org.apache.poi.hssf.eventmodel.TestModelFactory; import org.apache.poi.hssf.eventmodel.TestModelFactory;
import org.apache.poi.hssf.model.TestDrawingManager; import org.apache.poi.hssf.model.AllModelTests;
import org.apache.poi.hssf.model.TestFormulaParser;
import org.apache.poi.hssf.model.TestSheet;
import org.apache.poi.hssf.record.AllRecordTests; import org.apache.poi.hssf.record.AllRecordTests;
import org.apache.poi.hssf.usermodel.AllUserModelTests; import org.apache.poi.hssf.usermodel.AllUserModelTests;
import org.apache.poi.hssf.util.TestAreaReference; 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"); TestSuite suite = new TestSuite("Tests for org.apache.poi.hssf");
// $JUnit-BEGIN$ // $JUnit-BEGIN$
suite.addTest(AllModelTests.suite());
suite.addTest(AllUserModelTests.suite()); suite.addTest(AllUserModelTests.suite());
suite.addTest(AllRecordTests.suite()); suite.addTest(AllRecordTests.suite());
suite.addTest(new TestSuite(TestFormulaParser.class));
suite.addTest(new TestSuite(TestAreaReference.class)); suite.addTest(new TestSuite(TestAreaReference.class));
suite.addTest(new TestSuite(TestCellReference.class)); suite.addTest(new TestSuite(TestCellReference.class));
suite.addTest(new TestSuite(TestRangeAddress.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(TestSheetReferences.class));
suite.addTest(new TestSuite(TestEventRecordFactory.class)); suite.addTest(new TestSuite(TestEventRecordFactory.class));
suite.addTest(new TestSuite(TestModelFactory.class)); suite.addTest(new TestSuite(TestModelFactory.class));
suite.addTest(new TestSuite(TestDrawingManager.class));
suite.addTest(new TestSuite(TestSheet.class));
// $JUnit-END$ // $JUnit-END$
return suite; return suite;
} }

View 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;
}
}

View File

@ -1,4 +1,3 @@
/* ==================================================================== /* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with contributor license agreements. See the NOTICE file distributed with
@ -16,7 +15,6 @@
limitations under the License. limitations under the License.
==================================================================== */ ==================================================================== */
package org.apache.poi.hssf.model; package org.apache.poi.hssf.model;
import junit.framework.TestCase; import junit.framework.TestCase;
@ -34,8 +32,7 @@ import java.util.List;
* *
* @author Glen Stampoultzis (glens at apache.org) * @author Glen Stampoultzis (glens at apache.org)
*/ */
public class TestSheet extends TestCase public final class TestSheet extends TestCase {
{
public void testCreateSheet() throws Exception public void testCreateSheet() throws Exception
{ {
// Check we're adding row and cell aggregates // Check we're adding row and cell aggregates
@ -76,6 +73,21 @@ public class TestSheet extends TestCase
if ((regionsToAdd % 1027) != 0) if ((regionsToAdd % 1027) != 0)
recordsExpected++; recordsExpected++;
assertTrue("The " + regionsToAdd + " merged regions should have been spread out over " + recordsExpected + " records, not " + recordsAdded, recordsAdded == 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() public void testRemoveMergedRegion()
@ -113,9 +125,9 @@ public class TestSheet extends TestCase
MergeCellsRecord merged = new MergeCellsRecord(); MergeCellsRecord merged = new MergeCellsRecord();
merged.addArea(0, (short)0, 1, (short)2); merged.addArea(0, (short)0, 1, (short)2);
records.add(new RowRecord()); records.add(new RowRecord(0));
records.add(new RowRecord()); records.add(new RowRecord(1));
records.add(new RowRecord()); records.add(new RowRecord(2));
records.add(merged); records.add(merged);
Sheet sheet = Sheet.createSheet(records, 0); Sheet sheet = Sheet.createSheet(records, 0);
@ -142,20 +154,11 @@ public class TestSheet extends TestCase
*/ */
public void testRowAggregation() { public void testRowAggregation() {
List records = new ArrayList(); 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()); records.add(new StringRecord());
records.add(new RowRecord(2));
row = new RowRecord();
row.setRowNumber(2);
records.add(row);
Sheet sheet = Sheet.createSheet(records, 0); Sheet sheet = Sheet.createSheet(records, 0);
assertNotNull("Row [2] was skipped", sheet.getRow(2)); assertNotNull("Row [2] was skipped", sheet.getRow(2));
@ -197,7 +200,7 @@ public class TestSheet extends TestCase
Iterator iterator = sheet.getRowBreaks(); Iterator iterator = sheet.getRowBreaks();
while (iterator.hasNext()) { while (iterator.hasNext()) {
PageBreakRecord.Break breakItem = (PageBreakRecord.Break)iterator.next(); 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 && 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 == 10) is10= true;
@ -216,8 +219,6 @@ public class TestSheet extends TestCase
assertFalse("row should be removed", sheet.isRowBroken(10)); assertFalse("row should be removed", sheet.isRowBroken(10));
assertEquals("no more breaks", 0, sheet.getNumRowBreaks()); assertEquals("no more breaks", 0, sheet.getNumRowBreaks());
} }
/** /**
@ -256,7 +257,7 @@ public class TestSheet extends TestCase
Iterator iterator = sheet.getColumnBreaks(); Iterator iterator = sheet.getColumnBreaks();
while (iterator.hasNext()) { while (iterator.hasNext()) {
PageBreakRecord.Break breakItem = (PageBreakRecord.Break)iterator.next(); 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 && main != 1 && main != 10 && main != 15) fail("Invalid page break");
if (main == 0) is0 = true; if (main == 0) is0 = true;
if (main == 1) is1 = true; if (main == 1) is1 = true;
@ -286,7 +287,6 @@ public class TestSheet extends TestCase
* works as designed. * works as designed.
*/ */
public void testXFIndexForColumn() { public void testXFIndexForColumn() {
try{
final short TEST_IDX = 10; final short TEST_IDX = 10;
final short DEFAULT_IDX = 0xF; // 15 final short DEFAULT_IDX = 0xF; // 15
short xfindex = Short.MIN_VALUE; short xfindex = Short.MIN_VALUE;
@ -351,7 +351,5 @@ public class TestSheet extends TestCase
xfindex = sheet.getXFIndexForColAt((short) 10); xfindex = sheet.getXFIndexForColAt((short) 10);
assertEquals(DEFAULT_IDX, xfindex); assertEquals(DEFAULT_IDX, xfindex);
} }
catch(Exception e){e.printStackTrace();fail(e.getMessage());}
} }
}

View File

@ -19,125 +19,18 @@ package org.apache.poi.hssf.model;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import java.util.List;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.apache.poi.hssf.record.ColumnInfoRecord; 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 * @author Tony Poppleton
*/ */
public class TestSheetAdditional extends TestCase public final class TestSheetAdditional extends TestCase {
{
/**
* Constructor for SheetTest.
* @param arg0
*/
public TestSheetAdditional(String arg0)
{
super(arg0);
}
public void testAddMergedRegion() public void testGetCellWidth() {
{
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
{
Sheet sheet = Sheet.createSheet(); Sheet sheet = Sheet.createSheet();
ColumnInfoRecord nci = ( ColumnInfoRecord ) sheet.createColInfo(); ColumnInfoRecord nci = ( ColumnInfoRecord ) sheet.createColInfo();
@ -146,14 +39,8 @@ public class TestSheetAdditional extends TestCase
nci.setLastColumn((short)10); nci.setLastColumn((short)10);
nci.setColumnWidth((short)100); nci.setColumnWidth((short)100);
Field f = null;
f = Sheet.class.getDeclaredField("columnSizes"); sheet.columns.insertColumn(nci);
f.setAccessible(true);
List columnSizes = new ArrayList();
f.set(sheet,columnSizes);
columnSizes.add(nci);
sheet.records.add(1 + sheet.dimsloc, nci);
sheet.dimsloc++;
assertEquals((short)100,sheet.getColumnWidth((short)5)); assertEquals((short)100,sheet.getColumnWidth((short)5));
assertEquals((short)100,sheet.getColumnWidth((short)6)); assertEquals((short)100,sheet.getColumnWidth((short)6));
@ -172,151 +59,6 @@ public class TestSheetAdditional extends TestCase
assertEquals((short)100,sheet.getColumnWidth((short)10)); 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());
}
} }

View File

@ -1,4 +1,3 @@
/* ==================================================================== /* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with contributor license agreements. See the NOTICE file distributed with
@ -18,31 +17,25 @@
package org.apache.poi.hssf.record.aggregates; package org.apache.poi.hssf.record.aggregates;
import org.apache.poi.hssf.record.*; import junit.framework.TestCase;
public class TestRowRecordsAggregate extends junit.framework.TestCase { import org.apache.poi.hssf.record.RowRecord;
public TestRowRecordsAggregate(String name) {
super (name); /**
} *
*/
public final class TestRowRecordsAggregate extends TestCase {
public void testRowGet() { public void testRowGet() {
RowRecordsAggregate rra = new RowRecordsAggregate(); RowRecordsAggregate rra = new RowRecordsAggregate();
RowRecord rr = new RowRecord(); RowRecord rr = new RowRecord(4);
rr.setRowNumber(( short ) 4);
rra.insertRow(rr); rra.insertRow(rr);
RowRecord rr2 = new RowRecord(); rr2.setRowNumber((short) 1); rra.insertRow(new RowRecord(1));
rra.insertRow(rr2);
RowRecord rr1 = rra.getRow(4); RowRecord rr1 = rra.getRow(4);
assertTrue("Row Record should not be null", rr1!=null); assertNotNull(rr1);
assertTrue("Row number is 1",rr1.getRowNumber() == 4); assertEquals("Row number is 1", 4, rr1.getRowNumber());
assertTrue("Row record retrieved is identical ", rr1 == rr); 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);
}
} }

View File

@ -143,8 +143,9 @@ public final class TestHSSFRow extends TestCase {
try { try {
sheet.createRow(-1); sheet.createRow(-1);
fail("IndexOutOfBoundsException should have been thrown"); fail("IndexOutOfBoundsException should have been thrown");
} catch (IndexOutOfBoundsException ex) { } catch (IllegalArgumentException e) {
// expected during successful test // expected during successful test
assertEquals("Invalid row number (-1) outside allowable range (0..65535)", e.getMessage());
} }
//Test high row bound //Test high row bound
@ -153,8 +154,9 @@ public final class TestHSSFRow extends TestCase {
try { try {
sheet.createRow(65536); sheet.createRow(65536);
fail("IndexOutOfBoundsException should have been thrown"); fail("IndexOutOfBoundsException should have been thrown");
} catch (IndexOutOfBoundsException ex) { } catch (IllegalArgumentException e) {
// expected during successful test // expected during successful test
assertEquals("Invalid row number (65536) outside allowable range (0..65535)", e.getMessage());
} }
} }

View File

@ -23,6 +23,7 @@ import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import junit.framework.AssertionFailedError;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.apache.poi.hssf.HSSFTestDataSamples; import org.apache.poi.hssf.HSSFTestDataSamples;
@ -193,17 +194,29 @@ public final class TestHSSFSheet extends TestCase {
public void testCloneSheet() { public void testCloneSheet() {
HSSFWorkbook workbook = new HSSFWorkbook(); HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("Test Clone"); HSSFSheet sheet = workbook.createSheet("Test Clone");
HSSFRow row = sheet.createRow((short) 0); HSSFRow row = sheet.createRow(0);
HSSFCell cell = row.createCell((short) 0); HSSFCell cell = row.createCell((short) 0);
cell.setCellValue("clone_test"); HSSFCell cell2 = row.createCell((short) 1);
HSSFSheet cloned = workbook.cloneSheet(0); 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 //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 //Check that the cells are not somehow linked
cell.setCellValue("Difference Check"); cell.setCellValue(new HSSFRichTextString("Difference Check"));
assertEquals(cloned.getRow((short)0).getCell((short)0).getStringCellValue(), "clone_test"); 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 /** 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"); HSSFSheet sheet = workbook.createSheet("Test Clone");
HSSFRow row = sheet.createRow((short) 0); HSSFRow row = sheet.createRow((short) 0);
HSSFCell cell = row.createCell((short) 0); HSSFCell cell = row.createCell((short) 0);
cell.setCellValue("clone_test"); cell.setCellValue(new HSSFRichTextString("clone_test"));
//Clone the sheet multiple times //Clone the sheet multiple times
workbook.cloneSheet(0); workbook.cloneSheet(0);
workbook.cloneSheet(0); workbook.cloneSheet(0);
@ -517,11 +530,11 @@ public final class TestHSSFSheet extends TestCase {
HSSFSheet sheet = wb.createSheet(); HSSFSheet sheet = wb.createSheet();
HSSFRow row = sheet.createRow(0); HSSFRow row = sheet.createRow(0);
HSSFCell cell = row.createCell((short)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); row = sheet.createRow(1);
cell = row.createCell((short)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); Region region = new Region(1, (short)0, 1, (short)1);
sheet.addMergedRegion(region); sheet.addMergedRegion(region);
@ -651,7 +664,7 @@ public final class TestHSSFSheet extends TestCase {
r.createCell((short) 1).setCellFormula("A1*2"); r.createCell((short) 1).setCellFormula("A1*2");
HSSFSheet s1 = wb.cloneSheet(0); HSSFSheet s1 = wb.cloneSheet(0);
r = s1.getRow(0); r = s1.getRow(0);
assertEquals("double" ,r.getCell((short)0).getNumericCellValue(),(double)1,0); //sanity check assertEquals("double", r.getCell((short) 0).getNumericCellValue(), 1, 0); // sanity check
assertNotNull(r.getCell((short) 1)); assertNotNull(r.getCell((short) 1));
assertEquals("formula", r.getCell((short) 1).getCellFormula(), "A1*2"); assertEquals("formula", r.getCell((short) 1).getCellFormula(), "A1*2");
} }
@ -814,11 +827,6 @@ public final class TestHSSFSheet extends TestCase {
assertTrue(wb3.getSheetAt(3).getForceFormulaRecalculation()); assertTrue(wb3.getSheetAt(3).getForceFormulaRecalculation());
} }
public static void main(java.lang.String[] args) {
junit.textui.TestRunner.run(TestHSSFSheet.class);
}
public void testColumnWidth() throws Exception { public void testColumnWidth() throws Exception {
//check we can correctly read column widths from a reference workbook //check we can correctly read column widths from a reference workbook
HSSFWorkbook wb = openSample("colwidth.xls"); 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)0));
assertEquals(256*10, sh.getColumnWidth((short)1)); assertEquals(256*10, sh.getColumnWidth((short)1));
assertEquals(256*10, sh.getColumnWidth((short)2)); 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++) { for (char i = 'D'; i <= 'F'; i++) {
short w = (short)(256*12); short w = (short)(256*12);
assertEquals(w, sh.getColumnWidth((short)i)); 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);
} }
} }

View File

@ -147,9 +147,10 @@ public final class TestHSSFWorkbook extends TestCase {
// Single chart, two sheets // Single chart, two sheets
b = openSample("44010-SingleChart.xls"); b = openSample("44010-SingleChart.xls");
assertEquals(2, b.getNumberOfSheets()); assertEquals(2, b.getNumberOfSheets());
assertEquals("Graph2", b.getSheetName(1));
s = b.getSheetAt(1); s = b.getSheetAt(1);
assertEquals(0, s.getFirstRowNum()); assertEquals(0, s.getFirstRowNum());
assertEquals(0, s.getLastRowNum()); assertEquals(8, s.getLastRowNum());
// Has chart on 1st sheet?? // Has chart on 1st sheet??
// FIXME // FIXME
@ -166,7 +167,7 @@ public final class TestHSSFWorkbook extends TestCase {
assertEquals(2, b.getNumberOfSheets()); assertEquals(2, b.getNumberOfSheets());
s = b.getSheetAt(1); s = b.getSheetAt(1);
assertEquals(0, s.getFirstRowNum()); assertEquals(0, s.getFirstRowNum());
assertEquals(0, s.getLastRowNum()); assertEquals(8, s.getLastRowNum());
// Two charts, three sheets // Two charts, three sheets
@ -175,10 +176,10 @@ public final class TestHSSFWorkbook extends TestCase {
s = b.getSheetAt(1); s = b.getSheetAt(1);
assertEquals(0, s.getFirstRowNum()); assertEquals(0, s.getFirstRowNum());
assertEquals(0, s.getLastRowNum()); assertEquals(8, s.getLastRowNum());
s = b.getSheetAt(2); s = b.getSheetAt(2);
assertEquals(0, s.getFirstRowNum()); assertEquals(0, s.getFirstRowNum());
assertEquals(0, s.getLastRowNum()); assertEquals(8, s.getLastRowNum());
// Has chart on 1st sheet?? // Has chart on 1st sheet??
// FIXME // FIXME
@ -197,10 +198,10 @@ public final class TestHSSFWorkbook extends TestCase {
s = b.getSheetAt(1); s = b.getSheetAt(1);
assertEquals(0, s.getFirstRowNum()); assertEquals(0, s.getFirstRowNum());
assertEquals(0, s.getLastRowNum()); assertEquals(8, s.getLastRowNum());
s = b.getSheetAt(2); s = b.getSheetAt(2);
assertEquals(0, s.getFirstRowNum()); assertEquals(0, s.getFirstRowNum());
assertEquals(0, s.getLastRowNum()); assertEquals(8, s.getLastRowNum());
} }
private static HSSFWorkbook writeRead(HSSFWorkbook b) { private static HSSFWorkbook writeRead(HSSFWorkbook b) {