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>
|
||||
|
@ -1,4 +1,3 @@
|
||||
|
||||
/* ====================================================================
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
@ -16,7 +15,6 @@
|
||||
limitations under the License.
|
||||
==================================================================== */
|
||||
|
||||
|
||||
package org.apache.poi.hssf.model;
|
||||
|
||||
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
|
||||
* @version 1.0-pre
|
||||
*/
|
||||
|
||||
public class Sheet implements Model
|
||||
{
|
||||
public final class Sheet implements Model {
|
||||
public static final short LeftMargin = 0;
|
||||
public static final short RightMargin = 1;
|
||||
public static final short TopMargin = 2;
|
||||
@ -97,7 +93,7 @@ public class Sheet implements Model
|
||||
protected ObjectProtectRecord objprotect = null;
|
||||
protected ScenarioProtectRecord scenprotect = 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 */
|
||||
protected boolean uncalced = false;
|
||||
@ -108,7 +104,7 @@ public class Sheet implements Model
|
||||
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)
|
||||
*/
|
||||
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
|
||||
if(rowTo < rowFrom) {
|
||||
throw new IllegalArgumentException("The row to ("+rowTo+") must be >= the row from ("+rowFrom+")");
|
||||
if (rowTo < rowFrom) {
|
||||
throw new IllegalArgumentException("The 'to' row (" + rowTo
|
||||
+ ") must not be less than the 'from' row (" + rowFrom + ")");
|
||||
}
|
||||
if(colTo < colFrom) {
|
||||
throw new IllegalArgumentException("The col to ("+colTo+") must be >= the col from ("+colFrom+")");
|
||||
if (colTo < colFrom) {
|
||||
throw new IllegalArgumentException("The 'to' col (" + colTo
|
||||
+ ") must not be less than the 'from' col (" + colFrom + ")");
|
||||
}
|
||||
|
||||
if (merged == null || merged.getNumAreas() == 1027)
|
||||
@ -711,8 +706,6 @@ public class Sheet implements Model
|
||||
*
|
||||
* @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,
|
||||
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
|
||||
* 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.
|
||||
* 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
|
||||
@ -930,8 +923,6 @@ public class Sheet implements Model
|
||||
* @return LabelSSTRecord newly created containing your SST Index, row,col.
|
||||
* @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)
|
||||
{
|
||||
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
|
||||
*/
|
||||
|
||||
//public NumberRecord createNumber(short row, short col, double value)
|
||||
public NumberRecord createNumber(int row, short col, double value)
|
||||
{
|
||||
log.logFormatted(POILogger.DEBUG, "create number row,col,value %,%,%",
|
||||
@ -968,7 +957,6 @@ public class Sheet implements Model
|
||||
});
|
||||
NumberRecord rec = new NumberRecord();
|
||||
|
||||
//rec.setRow(( short ) row);
|
||||
rec.setRow(row);
|
||||
rec.setColumn(col);
|
||||
rec.setValue(value);
|
||||
@ -982,18 +970,14 @@ public class Sheet implements Model
|
||||
* @param row - the row 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)
|
||||
{
|
||||
//log.logFormatted(POILogger.DEBUG, "create blank row,col %,%", new short[]
|
||||
log.logFormatted(POILogger.DEBUG, "create blank row,col %,%", new int[]
|
||||
{
|
||||
row, col
|
||||
});
|
||||
BlankRecord rec = new BlankRecord();
|
||||
|
||||
//rec.setRow(( short ) row);
|
||||
rec.setRow(row);
|
||||
rec.setColumn(col);
|
||||
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
|
||||
* @return bogus/useless formula record
|
||||
*/
|
||||
|
||||
//public FormulaRecord createFormula(short row, short col, String formula)
|
||||
public FormulaRecord createFormula(int row, short col, String formula)
|
||||
{
|
||||
log.logFormatted(POILogger.DEBUG, "create formula row,col,formula %,%,%",
|
||||
//new short[]
|
||||
new int[]
|
||||
{
|
||||
row, col
|
||||
@ -1052,8 +1033,6 @@ public class Sheet implements Model
|
||||
* @param row the row to add the cell value to
|
||||
* @param col the cell value record itself.
|
||||
*/
|
||||
|
||||
//public void addValueRecord(short row, CellValueRecordInterface col)
|
||||
public void addValueRecord(int row, CellValueRecordInterface col)
|
||||
{
|
||||
checkCells();
|
||||
@ -1075,29 +1054,6 @@ public class Sheet implements Model
|
||||
d.setFirstCol(col.getColumn());
|
||||
}
|
||||
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.
|
||||
* @see org.apache.poi.hssf.record.CellValueRecordInterface
|
||||
*/
|
||||
|
||||
//public void removeValueRecord(short row, CellValueRecordInterface col)
|
||||
public void removeValueRecord(int row, CellValueRecordInterface col)
|
||||
{
|
||||
checkCells();
|
||||
@ -1118,27 +1072,6 @@ public class Sheet implements Model
|
||||
new int[]{row, dimsloc} );
|
||||
loc = dimsloc;
|
||||
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
|
||||
cells.removeCell(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);
|
||||
|
||||
/*
|
||||
* 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 ))
|
||||
log.log(POILogger.DEBUG, "exit addRow");
|
||||
}
|
||||
@ -1268,33 +1150,9 @@ public class Sheet implements Model
|
||||
public void removeRow(RowRecord row)
|
||||
{
|
||||
checkRows();
|
||||
// IndexRecord index = null;
|
||||
|
||||
setLoc(getDimsLoc());
|
||||
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 ( 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
|
||||
* (starting at LOC) will be returned.
|
||||
@ -1413,20 +1213,6 @@ public class Sheet implements Model
|
||||
return null;
|
||||
}
|
||||
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)
|
||||
*
|
||||
*/
|
||||
|
||||
//public RowRecord getRow(short rownum)
|
||||
public RowRecord getRow(int rownum)
|
||||
{
|
||||
public RowRecord getRow(int rownum) {
|
||||
if (log.check( POILogger.DEBUG ))
|
||||
log.log(POILogger.DEBUG, "getNextRow loc= " + loc);
|
||||
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.setType(( short ) 0x010);
|
||||
|
||||
// retval.setBuild((short)0x10d3);
|
||||
retval.setBuild(( short ) 0x0dbb);
|
||||
retval.setBuildYear(( short ) 1996);
|
||||
retval.setHistoryBitMask(0xc1);
|
||||
@ -1807,7 +1568,7 @@ public class Sheet implements Model
|
||||
* @see org.apache.poi.hssf.record.ColumnInfoRecord
|
||||
* @return record containing a ColumnInfoRecord
|
||||
*/
|
||||
|
||||
// TODO change return type to ColumnInfoRecord
|
||||
protected Record createColInfo()
|
||||
{
|
||||
return ColumnInfoRecordsAggregate.createColInfo();
|
||||
@ -3040,7 +2801,7 @@ public class Sheet implements Model
|
||||
* @param scenarios are unprotected (false = unprotect)
|
||||
*/
|
||||
public void unprotectSheet( boolean sheet, boolean objects, boolean scenarios ) {
|
||||
int protIdx = -1;
|
||||
|
||||
if (!sheet) {
|
||||
ProtectRecord prec = getProtect();
|
||||
prec.setProtect(sheet);
|
||||
@ -3064,179 +2825,6 @@ public class Sheet implements Model
|
||||
(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)
|
||||
{
|
||||
@ -3291,126 +2879,4 @@ public class Sheet implements Model
|
||||
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;
|
||||
// }
|
||||
// }
|
||||
|
||||
}
|
||||
|
@ -1,4 +1,3 @@
|
||||
|
||||
/* ====================================================================
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
@ -16,7 +15,6 @@
|
||||
limitations under the License.
|
||||
==================================================================== */
|
||||
|
||||
|
||||
package org.apache.poi.hssf.record;
|
||||
|
||||
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)
|
||||
* @version 2.0-pre
|
||||
*/
|
||||
|
||||
public class RowRecord
|
||||
extends Record
|
||||
implements Comparable
|
||||
{
|
||||
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 short field_2_first_col;
|
||||
private short field_3_last_col; // plus 1
|
||||
@ -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,13 +35,11 @@ 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 */
|
||||
|
||||
@ -74,15 +72,13 @@ public class RowRecordsAggregate
|
||||
records.remove(row);
|
||||
}
|
||||
|
||||
public RowRecord getRow(int rownum)
|
||||
{
|
||||
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
|
||||
@ -16,7 +15,6 @@
|
||||
limitations under the License.
|
||||
==================================================================== */
|
||||
|
||||
|
||||
package org.apache.poi.hssf.model;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
@ -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,7 +200,7 @@ 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 == 10) is10= 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,7 +257,7 @@ 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;
|
||||
@ -286,7 +287,6 @@ 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;
|
||||
@ -351,7 +351,5 @@ public class TestSheet extends TestCase
|
||||
xfindex = sheet.getXFIndexForColAt((short) 10);
|
||||
assertEquals(DEFAULT_IDX, xfindex);
|
||||
}
|
||||
catch(Exception e){e.printStackTrace();fail(e.getMessage());}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
@ -18,31 +17,25 @@
|
||||
|
||||
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);
|
||||
@ -645,15 +658,15 @@ public final class TestHSSFSheet extends TestCase {
|
||||
public void test35084() {
|
||||
|
||||
HSSFWorkbook wb = new HSSFWorkbook();
|
||||
HSSFSheet s =wb.createSheet("Sheet1");
|
||||
HSSFSheet s = wb.createSheet("Sheet1");
|
||||
HSSFRow r = s.createRow(0);
|
||||
r.createCell((short)0).setCellValue(1);
|
||||
r.createCell((short)1).setCellFormula("A1*2");
|
||||
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");
|
||||
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 */
|
||||
@ -661,9 +674,9 @@ public final class TestHSSFSheet extends TestCase {
|
||||
HSSFWorkbook wb = new HSSFWorkbook();
|
||||
HSSFCellStyle style = wb.createCellStyle();
|
||||
HSSFSheet s = wb.createSheet();
|
||||
s.setDefaultColumnStyle((short)0, style);
|
||||
s.setDefaultColumnStyle((short) 0, style);
|
||||
HSSFRow r = s.createRow(0);
|
||||
HSSFCell c = r.createCell((short)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,10 +198,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());
|
||||
}
|
||||
|
||||
private static HSSFWorkbook writeRead(HSSFWorkbook b) {
|
||||
|
Loading…
Reference in New Issue
Block a user