Beginnings of the performance-branch merge.

PR:
Obtained from:
Submitted by:
Reviewed by:
CVS: ----------------------------------------------------------------------
CVS: PR:
CVS:   If this change addresses a PR in the problem report tracking
CVS:   database, then enter the PR number(s) here.
CVS: Obtained from:
CVS:   If this change has been taken from another system, such as NCSA,
CVS:   then name the system in this line, otherwise delete it.
CVS: Submitted by:
CVS:   If this code has been contributed to Apache by someone else; i.e.,
CVS:   they sent us a patch or a new module, then include their name/email
CVS:   address here. If this is your work then delete this line.
CVS: Reviewed by:
CVS:   If we are doing pre-commit code reviews and someone else has
CVS:   reviewed your changes, include their name(s) here.
CVS:   If you have not had it reviewed then delete this line.


git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@353222 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Andrew C. Oliver 2003-07-19 02:48:17 +00:00
parent cd3ac5e91f
commit bdea32fe42
9 changed files with 920 additions and 380 deletions

View File

@ -2,9 +2,13 @@
<classpath>
<classpathentry kind="src" path="src/testcases"/>
<classpathentry kind="src" path="src/java"/>
<classpathentry kind="src" path="src/examples/src"/>
<classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
<classpathentry kind="lib" path="tools/cents/junit.cent/lib/junit-3.7.jar"/>
<classpathentry kind="lib" path="lib/core/commons-logging-1.0.jar"/>
<classpathentry kind="var" path="JRE_LIB" sourcepath="JRE_SRC"/>
<classpathentry kind="lib" path="/Users/andrewoliver/projects/jboss/test/apache-ant-1.5.3-1/lib/ant.jar"/>
<classpathentry kind="lib" path="/Users/andrewoliver/projects/jboss/test/apache-ant-1.5.3-1/lib/junit.jar"/>
<classpathentry kind="lib" path="/Users/andrewoliver/projects/jboss/test/apache-ant-1.5.3-1/lib/commons-logging.jar"/>
<classpathentry kind="lib" path="/Users/andrewoliver/projects/jboss/test/apache-ant-1.5.3-1/lib/xerces-2.3.0.jar"/>
<classpathentry kind="lib" path="/Users/andrewoliver/projects/jboss/test/apache-ant-1.5.3-1/lib/xercesImpl.jar"/>
<classpathentry kind="lib" path="/Users/andrewoliver/projects/jboss/test/apache-ant-1.5.3-1/lib/xml-apis.jar"/>
<classpathentry kind="lib" path="/Users/andrewoliver/projects/jakarta/poimerge/jakarta-poi/lib/xalan-2.2.0.jar"/>
<classpathentry kind="output" path="build"/>
</classpath>

View File

@ -234,16 +234,18 @@ public class Sheet implements Model
}
else if ( rec.getSid() == RowRecord.sid )
{
RowRecord row = (RowRecord)rec;
if (!isfirstrow) rec = null; //only add the aggregate once
if ( isfirstrow )
{
retval.rows = new RowRecordsAggregate();
rec = retval.rows;
rec = retval.rows;
retval.rows.construct( k, recs );
isfirstrow = false;
}
retval.rows.insertRow(row);
else
{
rec = null;
}
}
else if ( rec.getSid() == PrintGridlinesRecord.sid )
{
@ -261,10 +263,6 @@ public class Sheet implements Model
{
retval.printSetup = (PrintSetupRecord) rec;
}
else if ( rec.getSid() == SelectionRecord.sid )
{
retval.selection = (SelectionRecord) rec;
}
if (rec != null)
{
@ -527,6 +525,11 @@ public class Sheet implements Model
return numMergedRegions;
}
public CellValueRecordInterface getValueRecord (int row, short col) {
return cells.getCell(row, col);
}
/**
* This is basically a kludge to deal with the now obsolete Label records. If
* you have to read in a sheet that contains Label records, be aware that the rest
@ -1134,6 +1137,7 @@ public class Sheet implements Model
setLoc(getDimsLoc());
rows.removeRow(row);
cells.removeRow(row.getRowNumber());
/*
* for (int k = loc; k < records.size(); k++)
@ -1310,6 +1314,9 @@ public class Sheet implements Model
public RowRecord getRow(int rownum)
{
log.log(log.DEBUG, "getNextRow loc= " + loc);
if (rows == null) {
return null;
}
return rows.getRow(rownum);
/*
@ -1334,6 +1341,15 @@ public class Sheet implements Model
// return null;
}
public Iterator rowRecordIterator() {
return rows.getIterator();
}
public Iterator rowCellIterator(int row) {
return this.cells.getRowCellIterator(row);
}
/**
* Not currently used method to calculate and add dbcell records
*
@ -1412,6 +1428,15 @@ public class Sheet implements Model
}
}
public int getFirstRow() {
return rows.getFirstRowNum();
}
public int getLastRow() {
return rows.getLastRowNum();
}
/** not currently used */
private DBCellRecord createDBCell(int offset, IntList rowoffsets,
@ -1868,7 +1893,7 @@ public class Sheet implements Model
for (k = 0; k < columnSizes.size(); k++)
{
ci = ( ColumnInfoRecord ) columnSizes.get(k);
if ((ci.getFirstColumn() <= column)
if ((ci.getFirstColumn() >= column)
&& (column <= ci.getLastColumn()))
{
break;
@ -1907,7 +1932,7 @@ public class Sheet implements Model
for (k = 0; k < columnSizes.size(); k++)
{
ci = ( ColumnInfoRecord ) columnSizes.get(k);
if ((ci.getFirstColumn() <= column)
if ((ci.getFirstColumn() >= column)
&& (column <= ci.getLastColumn()))
{
break;
@ -2136,6 +2161,32 @@ public class Sheet implements Model
return new EOFRecord();
}
public void setLastColForRow(int row, short col) {
this.getRow(row).setLastCol(col);
}
public void setFirstColForRow(int row, short col) {
this.getRow(row).setFirstCol(col);
}
public short getLastColForRow(int row) {
return this.getRow(row).getLastCol();
}
public short getFirstColForRow(int row) {
return this.getRow(row).getFirstCol();
}
public void setCellValue(int row, short col, double val) {
this.cells.setValue(row, col, val);
}
public void setCellStyle(int row, short col, short xf) {
this.cells.setStyle(row, col, xf);
}
/**
* get the location of the DimensionsRecord (which is the last record before the value section)
* @return location in the array of records of the DimensionsRecord
@ -2168,6 +2219,7 @@ public class Sheet implements Model
{
retval += (( Record ) records.get(k)).getRecordSize();
}
return retval;
}
@ -2203,6 +2255,11 @@ public class Sheet implements Model
return null;
}
public int getPhysicalNumberOfRows() {
return rows.getPhysicalNumberOfRows();
}
/**
* Sets the SCL record or creates it in the correct place if it does not
* already exist.

View File

@ -342,6 +342,14 @@ public class FormulaRecord
return field_8_parsed_expr;
}
/**
* sets the stack with a list
*/
public void setParsedExpression(List ptgs) {
field_8_parsed_expr = new Stack();
field_8_parsed_expr.addAll(ptgs);
}
/**
* called by constructor, should throw runtime exception in the event of a
* record passed with a differing ID.

View File

@ -2,7 +2,7 @@
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2003 The Apache Software Foundation. All rights
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -75,10 +75,12 @@ public class RowRecordsAggregate
{
int firstrow = -1;
int lastrow = -1;
boolean firstdirty = false;
boolean lastdirty = false;
Map records = null;
int size = 0;
/** Creates a new instance of ValueRecordsAggregate */
/** Creates a new instance of RowRecordsAggregate */
public RowRecordsAggregate()
{
@ -107,6 +109,12 @@ public class RowRecordsAggregate
size -= row.getRecordSize();
// Integer integer = new Integer(row.getRowNumber());
if (lastrow == row.getRowNumber()) {
lastdirty = true;
}
if (firstrow == row.getRowNumber()) {
firstdirty = true;
}
records.remove(row);
}
@ -127,17 +135,20 @@ public class RowRecordsAggregate
public int getFirstRowNum()
{
if (firstdirty) {
firstrow = findFirstRow();
}
return firstrow;
}
public int getLastRowNum()
{
if (lastdirty) {
lastrow = findLastRow();
}
return lastrow;
}
/*
* No need to go through all the records as we're just collecting RowRecords
public int construct(int offset, List records)
{
int k = 0;
@ -157,7 +168,7 @@ public class RowRecordsAggregate
}
return k;
}
*/
/**
* called by the class that is responsible for writing this sucker.
* Subclasses should implement this so that their data is passed back in a
@ -222,7 +233,43 @@ public class RowRecordsAggregate
{
return records.values().iterator();
}
/**
* used internally to refresh the "last row" when the last row is removed.
*/
private int findLastRow()
{
int rownum = lastrow-1;
RowRecord r = getRow(rownum);
while (r == null && rownum >= 0)
{
r = this.getRow(--rownum);
}
return rownum;
}
/**
* used internally to refresh the "first row" when the first row is removed.
*/
private int findFirstRow()
{
int rownum = firstrow+1;
RowRecord r = getRow(rownum);
while (r == null && rownum <= getLastRowNum())
{
r = getRow(++rownum);
}
if (rownum > getLastRowNum())
return -1;
return rownum;
}
/** Performs a deep clone of the record*/
public Object clone() {
RowRecordsAggregate rec = new RowRecordsAggregate();

View File

@ -2,7 +2,7 @@
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2003 The Apache Software Foundation. All rights
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -55,17 +55,22 @@
package org.apache.poi.hssf.record.aggregates;
import org.apache.poi.hssf.usermodel.HSSFCell; //kludge shouldn't refer to this
import org.apache.poi.hssf.record.*;
import org.apache.poi.hssf.record.formula.Ptg;
import org.apache.poi.util.DoubleList;
import org.apache.poi.util.IntList;
import java.util.Iterator;
import java.util.List;
import java.util.TreeMap;
import java.util.ArrayList;
/**
*
* Aggregate value records together. Things are easier to handle that way.
*
* @author andy
* @author Andrew C. Oliver
* @author Glen Stampoultzis (glens at apache.org)
* @author Jason Height (jheight at chariot dot net dot au)
*/
@ -76,63 +81,72 @@ public class ValueRecordsAggregate
public final static short sid = -1000;
int firstcell = -1;
int lastcell = -1;
TreeMap records = null;
// int size = 0;
//TreeMap records = null;
/** Creates a new instance of ValueRecordsAggregate */
private final static int DEFAULT_ROWS=10000;
private final static int DEFAULT_COLS=256;
List celltype = null;
List xfs = null;
List numericcells = null;
List formulaptgs = null;
List stringvals = null;
IntList populatedRows = null;
int physCells; //physical number of cells
public CellValueRecordInterface getCell(int row, short col) {
return constructRecord(row, col);
public ValueRecordsAggregate()
{
records = new TreeMap();
}
public void insertCell(CellValueRecordInterface cell)
{
/* if (records.get(cell) == null)
{
size += (( Record ) cell).getRecordSize();
public int getRecordSize() {
//throw new RuntimeException("Not Implemented getRecordSize");
int size = 0;
Iterator irecs = getIterator();
while (irecs.hasNext()) {
size += (( Record ) irecs.next()).getRecordSize();
}
else
return size;
// return size;
}
public int serialize(int offset, byte [] data)
{
//throw new RuntimeException("Not Implemented serialize");
int pos = offset;
Iterator irecs = getIterator();
while (irecs.hasNext()) {
pos += (( Record ) irecs.next()).serialize(pos,data);
}
/* Iterator itr = records.values().iterator();
int pos = offset;
while (itr.hasNext())
{
size += (( Record ) cell).getRecordSize()
- (( Record ) records.get(cell)).getRecordSize();
pos += (( Record ) itr.next()).serialize(pos, data);
}*/
// XYLocator xy = new XYLocator(cell.getRow(), cell.getColumn());
Object o = records.put(cell, cell);
if ((cell.getColumn() < firstcell) || (firstcell == -1))
{
firstcell = cell.getColumn();
}
if ((cell.getColumn() > lastcell) || (lastcell == -1))
{
lastcell = cell.getColumn();
}
return pos - offset;
}
public void removeCell(CellValueRecordInterface cell)
{
// size -= (( Record ) cell).getRecordSize();
// XYLocator xy = new XYLocator(cell.getRow(), cell.getColumn());
records.remove(cell);
public ValueRecordsAggregate() {
celltype = new ArrayList(DEFAULT_ROWS);
xfs = new ArrayList(DEFAULT_ROWS);
numericcells = new ArrayList(DEFAULT_ROWS);
formulaptgs = new ArrayList(DEFAULT_ROWS);
stringvals = new ArrayList(DEFAULT_ROWS);
populatedRows = new IntList(DEFAULT_ROWS);
physCells = 0;
}
public int getPhysicalNumberOfCells()
{
return records.size();
public Iterator getIterator() {
return new VRAIterator(this);
}
public int getFirstCellNum()
{
return firstcell;
}
public int getLastCellNum()
{
return lastcell;
}
public int construct(int offset, List records)
{
@ -157,11 +171,6 @@ public class ValueRecordsAggregate
{
lastFormulaAggregate.setStringRecord((StringRecord)rec);
}
else if (rec instanceof SharedFormulaRecord)
{
//these follow the first formula in a group
lastFormulaAggregate.setSharedFormulaRecord((SharedFormulaRecord)rec);
}
else if (rec.isValue())
{
insertCell(( CellValueRecordInterface ) rec);
@ -170,140 +179,449 @@ public class ValueRecordsAggregate
return k;
}
/**
* called by the class that is responsible for writing this sucker.
* Subclasses should implement this so that their data is passed back in a
* byte array.
*
* @param offset to begin writing at
* @param data byte array containing instance data
* @return number of bytes written
*/
public int getPhysicalNumberOfCells() {
return physCells;
}
public int serialize(int offset, byte [] data)
public int getPhysicalNumberOfCellsInRow(int row) {
int count = -1;
int col = -1;
boolean firsttime = true;
while (col > 0 || count == -1) {
col = findNextPopulatedCell(row,col);
count++;
}
return count;
}
public void setValue(int row, short cell, double val) {
((DoubleList)numericcells.get(row)).set(cell, val);
}
public void setStyle(int row, short cell, short xf) {
((IntList)xfs.get(row)).set(cell, xf);
}
public Iterator getRowCellIterator(int row) {
return new VRAIterator(this, row);
}
public void removeRow(int row) {
Iterator iterator = this.getRowCellIterator(row);
while(iterator.hasNext()) {
iterator.next();
iterator.remove();
}
}
public void removeCell(CellValueRecordInterface cell) {
int rownum = cell.getRow();
int colnum = cell.getColumn();
int xf = cell.getXFIndex();
int type = determineType(cell);
if (rownum < celltype.size() && colnum < ((IntList)celltype.get(rownum)).size()) {
IntList ctRow = (IntList)celltype.get(rownum);
if (ctRow.size()-1 == colnum) {
ctRow.remove(colnum);
if (ctRow.size() == 0 && celltype.size()-1 == rownum) {
celltype.remove(rownum);
int remp = populatedRows.indexOf(rownum);
System.err.println("remp == "+remp);
populatedRows.removeValue(rownum);
}
} else {
ctRow.set(colnum,-1);
}
physCells--;
} else {
//this cell doesn't exist...
throw new RuntimeException("Tried to remove a cell that does not exist r,c="+rownum+","+colnum);
}
}
public void insertCell(CellValueRecordInterface cell) {
int rownum = cell.getRow();
int colnum = cell.getColumn();
int xf = cell.getXFIndex();
int type = determineType(cell);
if (celltype.size() < rownum+1) {
populatedRows.add(rownum); //this means we must never have had this row inserted
}
ensureRows(rownum);
IntList ctRow = (IntList)celltype.get(rownum);
IntList xfRow = (IntList)xfs.get(rownum);
adjustIntList(ctRow, colnum+1);
adjustIntList(xfRow, colnum+1);
ctRow.set(colnum, type);
xfRow.set(colnum, xf);
insertCell(cell, type);
}
CellValueRecordInterface constructRecord(int row, int col) {
if (celltype.size() < row || ((IntList)celltype.get(row)).size() < col) {
throw new ArrayIndexOutOfBoundsException("constructRecord called with row = "+row+
"and col ="+col+" but there are only "+celltype.size()+" rows and "+
((IntList)celltype.get(row)).size()+" cols!!");
}
CellValueRecordInterface retval = null;
int type = ((IntList)celltype.get(row)).get(col);
switch (type) {
case HSSFCell.CELL_TYPE_NUMERIC:
NumberRecord nrecord = new NumberRecord();
nrecord.setColumn((short)col);
nrecord.setRow(row);
nrecord.setValue(((DoubleList)numericcells.get(row)).get(col));
nrecord.setXFIndex((short)((IntList)xfs.get(row)).get(col));
retval = nrecord;
break;
case HSSFCell.CELL_TYPE_STRING:
LabelSSTRecord srecord = new LabelSSTRecord();
srecord.setColumn((short)col);
srecord.setRow(row);
srecord.setSSTIndex((int)((DoubleList)numericcells.get(row)).get(col));
srecord.setXFIndex((short)((IntList)xfs.get(row)).get(col));
retval=srecord;
break;
case HSSFCell.CELL_TYPE_BLANK:
BlankRecord brecord = new BlankRecord();
brecord.setColumn((short)col);
brecord.setRow(row);
brecord.setXFIndex((short)((IntList)xfs.get(row)).get(col));
retval=brecord;
break;
case HSSFCell.CELL_TYPE_FORMULA:
FormulaRecord fr = new FormulaRecord();
fr.setColumn((short)col);
fr.setOptions((short)2);
fr.setRow(row);
fr.setXFIndex((short)((IntList)xfs.get(row)).get(col));
StringRecord st = null;
String strval = (String)((List)stringvals.get(row)).get(col);
List expressionlist = (List)((List)formulaptgs.get(row)).get(col);
fr.setParsedExpression(expressionlist);
fr.setExpressionLength(calculatePtgSize(expressionlist));
if (strval != null) {
st = new StringRecord();
st.setString(strval);
}
FormulaRecordAggregate frarecord = new FormulaRecordAggregate(fr,st);
retval= frarecord;
break;
default:
throw new RuntimeException("UnImplemented Celltype "+type);
}
return retval;
}
private short calculatePtgSize(List expressionlist) {
short retval = 0;
Iterator iter = expressionlist.iterator();
while (iter.hasNext()) {
retval += (short)((Ptg)iter.next()).getSize();
}
return retval;
}
private void insertCell(CellValueRecordInterface cell, int type) {
int rownum = cell.getRow();
int colnum = cell.getColumn();
DoubleList nmRow = (DoubleList)numericcells.get(rownum);
switch (type) {
case HSSFCell.CELL_TYPE_NUMERIC:
NumberRecord nrecord = (NumberRecord)cell;
adjustDoubleList(nmRow, colnum+1);
nmRow.set(colnum,nrecord.getValue());
physCells++;
break;
case HSSFCell.CELL_TYPE_STRING:
LabelSSTRecord srecord = (LabelSSTRecord)cell;
adjustDoubleList(nmRow, colnum+1);
nmRow.set(colnum,srecord.getSSTIndex());
physCells++;
break;
case HSSFCell.CELL_TYPE_FORMULA:
List ptRow = (List)formulaptgs.get(rownum);
List stRow = (List)stringvals.get(rownum);
FormulaRecordAggregate frarecord = (FormulaRecordAggregate)cell;
adjustDoubleList(nmRow, colnum+1);
adjustObjectList(ptRow, colnum+1);
adjustStringList(stRow, colnum+1);
nmRow.set(colnum,frarecord.getFormulaRecord().getValue());
ptRow.set(colnum,frarecord.getFormulaRecord().getParsedExpression());
StringRecord str = frarecord.getStringRecord();
if (str != null) {
stRow.set(colnum,str.getString());
} else {
stRow.set(colnum,null);
}
physCells++;
break;
case HSSFCell.CELL_TYPE_BLANK:
//BlankRecord brecord = (BlankRecord)cell;
physCells++;
break;
default:
throw new RuntimeException("UnImplemented Celltype "+cell.toString());
}
}
private int determineType(CellValueRecordInterface cval)
{
Iterator itr = records.values().iterator();
int pos = offset;
Record record = ( Record ) cval;
int sid = record.getSid();
int retval = 0;
while (itr.hasNext())
switch (sid)
{
pos += (( Record ) itr.next()).serialize(pos, data);
case NumberRecord.sid :
retval = HSSFCell.CELL_TYPE_NUMERIC;
break;
case BlankRecord.sid :
retval = HSSFCell.CELL_TYPE_BLANK;
break;
case LabelSSTRecord.sid :
retval = HSSFCell.CELL_TYPE_STRING;
break;
case FormulaRecordAggregate.sid :
retval = HSSFCell.CELL_TYPE_FORMULA;
break;
case BoolErrRecord.sid :
BoolErrRecord boolErrRecord = ( BoolErrRecord ) record;
retval = (boolErrRecord.isBoolean())
? HSSFCell.CELL_TYPE_BOOLEAN
: HSSFCell.CELL_TYPE_ERROR;
break;
}
return pos - offset;
}
/**
* called by the constructor, should set class level fields. Should throw
* runtime exception for bad/icomplete data.
*
* @param data raw data
* @param size size of data
* @param offset of the record's data (provided a big array of the file)
*/
protected void fillFields(byte [] data, short size, int offset)
{
return retval;
}
/**
* called by constructor, should throw runtime exception in the event of a
* record passed with a differing ID.
*
* @param id alleged id for this record
*/
private void ensureRows(int rownum) {
adjustRows(celltype, rownum+1, IntList.class);
adjustRows(xfs, rownum+1, IntList.class);
adjustRows(numericcells, rownum+1, DoubleList.class);
adjustRows(formulaptgs, rownum+1, ArrayList.class);
adjustRows(stringvals, rownum+1, ArrayList.class);
protected void validateSid(short id)
{
}
/**
* return the non static version of the id for this record.
*/
public short getSid()
{
return sid;
}
public int getRecordSize() {
int size = 0;
Iterator irecs = records.values().iterator();
while (irecs.hasNext()) {
size += (( Record ) irecs.next()).getRecordSize();
private void adjustRows(List list, int size, Class theclass) {
while (list.size() < size) {
try {
list.add(theclass.newInstance());
} catch (Exception e) {
throw new RuntimeException("Could Not Instantiate Row in adjustRows");
}
}
return size;
// return size;
}
public Iterator getIterator()
{
return records.values().iterator();
private void adjustIntList(IntList list, int size) {
while (list.size() < size) {
list.add(-1);
}
}
/** Performs a deep clone of the record*/
public Object clone() {
ValueRecordsAggregate rec = new ValueRecordsAggregate();
for (Iterator valIter = getIterator(); valIter.hasNext();) {
CellValueRecordInterface val = (CellValueRecordInterface)((CellValueRecordInterface)valIter.next()).clone();
rec.insertCell(val);
}
return rec;
private void adjustDoubleList(DoubleList list, int size) {
while (list.size() < size) {
list.add(-1);
}
}
private void adjustObjectList(List list, int size) {
while (list.size() < size) {
list.add(new ArrayList());
}
}
private void adjustStringList(List list, int size) {
while (list.size() < size) {
list.add(new String());
}
}
protected int findNextPopulatedCell(int row, int col) {
IntList ctRow = (IntList) celltype.get(row);
int retval = -1;
if (ctRow.size() > col+1) {
for (int k = col+1; k < ctRow.size() +1; k++) {
if (k != ctRow.size()) {
int val = ctRow.get(k);
if (val != -1) {
retval = k;
break;
} // end if (val !=...
} //end if (k !=..
} //end for
} //end if (ctRow.size()...
return retval;
}
public short getSid() {
return sid;
}
public void fillFields(byte[] data, short size, int offset) {
}
protected void validateSid(short sid) {
}
}
/*
* class XYLocator implements Comparable {
* private int row = 0;
* private int col = 0;
* public XYLocator(int row, int col) {
* this.row = row;
* this.col = col;
* }
*
* public int getRow() {
* return row;
* }
*
* public int getCol() {
* return col;
* }
*
* public int compareTo(Object obj) {
* XYLocator loc = (XYLocator)obj;
*
* if (this.getRow() == loc.getRow() &&
* this.getCol() == loc.getCol() )
* return 0;
*
* if (this.getRow() < loc.getRow())
* return -1;
*
* if (this.getRow() > loc.getRow())
* return 1;
*
* if (this.getCol() < loc.getCol())
* return -1;
*
* if (this.getCol() > loc.getCol())
* return 1;
*
* return -1;
*
* }
*
* public boolean equals(Object obj) {
* if (!(obj instanceof XYLocator)) return false;
*
* XYLocator loc = (XYLocator)obj;
* if (this.getRow() == loc.getRow()
* &&
* this.getCol() == loc.getCol()
* ) return true;
* return false;
* }
*
*
* }
*/
class VRAIterator implements Iterator {
private boolean hasNext;
private ValueRecordsAggregate vra;
int popindex;
int row;
int rowlimit;
int col;
CellValueRecordInterface current = null;
CellValueRecordInterface next = null;
public VRAIterator(ValueRecordsAggregate vra) {
this.vra = vra;
this.rowlimit = -1;
popindex = 0;
if (vra.getPhysicalNumberOfCells() > 0) {
hasNext = true;
next = findNextCell(null);
}
}
public VRAIterator(ValueRecordsAggregate vra, int row) {
this(vra);
rowlimit = row;
this.row = row;
this.popindex = vra.populatedRows.indexOf(row);
}
public boolean hasNext() {
return hasNext;
}
public Object next() {
current = next;
next = findNextCell(current);
if (next == null) {
hasNext = false;
}
return current;
}
public void remove() {
vra.removeCell(current);
}
private CellValueRecordInterface findNextCell(CellValueRecordInterface current) {
IntList ctRow = null;
int rowNum = -1;
int colNum = -1;
int newCol = -1;
boolean wasntFirst = false;
if (current != null) {
wasntFirst = true;
rowNum = current.getRow();
colNum = current.getColumn();
ctRow = ((IntList)vra.celltype.get(rowNum));
}
//if popindex = row iwth no cells, fast forward till we get to one with size > 0
while ((ctRow == null || ctRow.size() == 0) && vra.populatedRows.size() > popindex) {
if (wasntFirst == true) {
throw new RuntimeException("CANT HAPPEN WASNTFIRST BUT WE'RE FASTFORWARDING!");
}
rowNum = vra.populatedRows.get(popindex);
ctRow = (IntList)vra.celltype.get(rowNum);
if (ctRow.size() == 0) {
if (rowlimit == -1) {
popindex++;
} else {
this.hasNext = false;
}
}
}
if (rowNum == -1) {
return null;
}
while (newCol == -1) {
newCol = findNextPopulatedCell(rowNum,colNum);
colNum = newCol;
if (colNum == -1) { //end of row, forward one row
popindex++;
if (popindex < vra.populatedRows.size() && rowlimit == -1) {
rowNum = vra.populatedRows.get(popindex);
} else {
return null;
}
}
}
return vra.constructRecord(rowNum,colNum);
}
private int findNextPopulatedCell(int row, int col) {
/*IntList ctRow = (IntList) vra.celltype.get(row);
int retval = -1;
if (ctRow.size() > col+1) {
for (int k = col+1; k < ctRow.size() +1; k++) {
if (k != ctRow.size()) {
int val = ctRow.get(k);
if (val != -1) {
retval = k;
break;
} // end if (val !=...
} //end if (k !=..
} //end for
} //end if (ctRow.size()...
return retval;*/
return vra.findNextPopulatedCell(row, col);
}
}

View File

@ -163,7 +163,7 @@ public class HSSFCell
private Sheet sheet;
//private short row;
private int row;
private CellValueRecordInterface record;
// private CellValueRecordInterface record;
/**
* Creates new Cell - Should only be called by HSSFRow. This creates a cell
@ -196,13 +196,25 @@ public class HSSFCell
this.book = book;
this.sheet = sheet;
BlankRecord rec = new BlankRecord();
rec.setRow(row);
rec.setColumn(cellNum);
rec.setXFIndex((short)0xf);
cellType = HSSFCell.CELL_TYPE_BLANK;
sheet.addValueRecord(row,(CellValueRecordInterface)rec);
// Relying on the fact that by default the cellType is set to 0 which
// is different to CELL_TYPE_BLANK hence the following method call correctly
// creates a new blank cell.
setCellType(CELL_TYPE_BLANK, false);
ExtendedFormatRecord xf = book.getExFormatAt(0xf);
//setCellType(CELL_TYPE_BLANK, false);
//ExtendedFormatRecord xf = book.getExFormatAt(0xf);
//setCellStyle(new HSSFCellStyle(( short ) 0xf, xf));
setCellStyle(new HSSFCellStyle(( short ) 0xf, xf));
}
/**
@ -236,7 +248,7 @@ public class HSSFCell
errorValue = ( byte ) 0;
this.book = book;
this.sheet = sheet;
switch (type)
/* switch (type)
{
case CELL_TYPE_NUMERIC :
@ -285,7 +297,7 @@ public class HSSFCell
}
ExtendedFormatRecord xf = book.getExFormatAt(0xf);
setCellStyle(new HSSFCellStyle(( short ) 0xf, xf));
setCellStyle(new HSSFCellStyle(( short ) 0xf, xf)); */
}
/**
@ -302,7 +314,7 @@ public class HSSFCell
CellValueRecordInterface cval)
{
cellNum = cval.getColumn();
record = cval;
//record = cval;
this.row = row;
cellType = determineType(cval);
cellStyle = null;
@ -394,8 +406,14 @@ public class HSSFCell
public void setCellNum(short num)
{
CellValueRecordInterface cval = sheet.getValueRecord(row, cellNum);
if (cval != null) {
sheet.removeValueRecord(this.row, cval);
}
cellNum = num;
record.setColumn(num);
sheet.addValueRecord(row, cval);
//record.setColumn(num);
}
/**
@ -457,16 +475,16 @@ public class HSSFCell
}
else
{
frec = ( FormulaRecordAggregate ) record;
frec = (FormulaRecordAggregate)sheet.getValueRecord(row, cellNum);
}
frec.setColumn(getCellNum());
if (setValue)
{
frec.getFormulaRecord().setValue(getNumericCellValue());
}
frec.setXFIndex(( short ) cellStyle.getIndex());
// frec.setXFIndex(( short ) cellStyle.getIndex());
frec.setRow(row);
record = frec;
sheet.replaceValueRecord(frec);
break;
case CELL_TYPE_NUMERIC :
@ -478,16 +496,16 @@ public class HSSFCell
}
else
{
nrec = ( NumberRecord ) record;
nrec = ( NumberRecord ) sheet.getValueRecord(row, cellNum);
}
nrec.setColumn(getCellNum());
if (setValue)
{
nrec.setValue(getNumericCellValue());
}
nrec.setXFIndex(( short ) cellStyle.getIndex());
nrec.setXFIndex(sheet.getValueRecord(row,cellNum).getXFIndex());
nrec.setRow(row);
record = nrec;
sheet.replaceValueRecord(nrec);
break;
case CELL_TYPE_STRING :
@ -499,11 +517,11 @@ public class HSSFCell
}
else
{
lrec = ( LabelSSTRecord ) record;
lrec = ( LabelSSTRecord ) sheet.getValueRecord(row, cellNum);
}
lrec.setColumn(getCellNum());
lrec.setRow(row);
lrec.setXFIndex(( short ) cellStyle.getIndex());
lrec.setXFIndex(sheet.getValueRecord(row,cellNum).getXFIndex());
if (setValue)
{
if ((getStringCellValue() != null)
@ -523,7 +541,7 @@ public class HSSFCell
lrec.setSSTIndex(sst);
}
}
record = lrec;
sheet.replaceValueRecord(lrec);
break;
case CELL_TYPE_BLANK :
@ -535,21 +553,21 @@ public class HSSFCell
}
else
{
brec = ( BlankRecord ) record;
brec = ( BlankRecord ) sheet.getValueRecord(row, cellNum);
}
brec.setColumn(getCellNum());
// During construction the cellStyle may be null for a Blank cell.
if (cellStyle != null)
{
brec.setXFIndex(( short ) cellStyle.getIndex());
brec.setXFIndex(sheet.getValueRecord(row,cellNum).getXFIndex());
}
else
{
brec.setXFIndex(( short ) 0);
}
brec.setRow(row);
record = brec;
sheet.replaceValueRecord(brec);
break;
case CELL_TYPE_BOOLEAN :
@ -561,7 +579,7 @@ public class HSSFCell
}
else
{
boolRec = ( BoolErrRecord ) record;
boolRec = ( BoolErrRecord ) sheet.getValueRecord(row, cellNum);
}
boolRec.setColumn(getCellNum());
if (setValue)
@ -570,7 +588,7 @@ public class HSSFCell
}
boolRec.setXFIndex(( short ) cellStyle.getIndex());
boolRec.setRow(row);
record = boolRec;
sheet.replaceValueRecord(boolRec);
break;
case CELL_TYPE_ERROR :
@ -582,7 +600,7 @@ public class HSSFCell
}
else
{
errRec = ( BoolErrRecord ) record;
errRec = ( BoolErrRecord ) sheet.getValueRecord(row, cellNum);
}
errRec.setColumn(getCellNum());
if (setValue)
@ -591,16 +609,17 @@ public class HSSFCell
}
errRec.setXFIndex(( short ) cellStyle.getIndex());
errRec.setRow(row);
record = errRec;
sheet.replaceValueRecord(errRec);
break;
}
if (cellType != this.cellType)
{
int loc = sheet.getLoc();
sheet.replaceValueRecord(record);
//sheet.replaceValueRecord(record);
sheet.setLoc(loc);
}
//sheet.setCellType(this.row, this.cellNum);
this.cellType = cellType;
}
@ -631,7 +650,7 @@ public class HSSFCell
{
setCellType(CELL_TYPE_NUMERIC, false);
}
(( NumberRecord ) record).setValue(value);
sheet.setCellValue(row, cellNum, value);
cellValue = value;
}
@ -693,7 +712,7 @@ public class HSSFCell
{
index = book.addSSTString(value, true);
}
(( LabelSSTRecord ) record).setSSTIndex(index);
sheet.setCellValue(row, cellNum, index);
stringValue = value;
}
}
@ -704,12 +723,12 @@ public class HSSFCell
setCellType(CELL_TYPE_BLANK,false);
} else {
setCellType(CELL_TYPE_FORMULA,false);
FormulaRecordAggregate rec = (FormulaRecordAggregate) record;
FormulaRecordAggregate rec = new FormulaRecordAggregate(new FormulaRecord(), null);
rec.getFormulaRecord().setOptions(( short ) 2);
rec.getFormulaRecord().setValue(0);
//only set to default if there is no extended format index already set
if (rec.getXFIndex() == (short)0) rec.setXFIndex(( short ) 0x0f);
rec.setRow(row);
rec.setColumn(cellNum);
rec.setXFIndex(( short ) 0x0f);
FormulaParser fp = new FormulaParser(formula+";",book);
fp.parse();
Ptg[] ptg = fp.getRPNPtg();
@ -720,6 +739,9 @@ public class HSSFCell
rec.getFormulaRecord().pushExpressionToken(ptg[ k ]);
}
rec.getFormulaRecord().setExpressionLength(( short ) size);
sheet.replaceValueRecord(rec);
//sheet.setCellFormula(row, cellNum, options, value
//Workbook.currentBook = null;
}
}
@ -727,7 +749,8 @@ public class HSSFCell
public String getCellFormula() {
//Workbook.currentBook=book;
SheetReferences refs = book.getSheetReferences();
String retval = FormulaParser.toFormulaString(refs, ((FormulaRecordAggregate)record).getFormulaRecord().getParsedExpression());
String retval = FormulaParser.toFormulaString(refs,
((FormulaRecordAggregate)sheet.getValueRecord(row,cellNum)).getFormulaRecord().getParsedExpression());
//Workbook.currentBook=null;
return retval;
}
@ -834,12 +857,12 @@ public class HSSFCell
public void setCellValue(boolean value)
{
if ((cellType != CELL_TYPE_BOOLEAN ) && ( cellType != CELL_TYPE_FORMULA))
/*if ((cellType != CELL_TYPE_BOOLEAN ) && ( cellType != CELL_TYPE_FORMULA))
{
setCellType(CELL_TYPE_BOOLEAN, false);
}
(( BoolErrRecord ) record).setValue(value);
booleanValue = value;
booleanValue = value; */
}
/**
@ -853,11 +876,11 @@ public class HSSFCell
public void setCellErrorValue(byte value)
{
if ((cellType != CELL_TYPE_ERROR) && (cellType != CELL_TYPE_FORMULA))
/*if ((cellType != CELL_TYPE_ERROR) && (cellType != CELL_TYPE_FORMULA))
{
setCellType(CELL_TYPE_ERROR, false);
}
(( BoolErrRecord ) record).setValue(value);
(( BoolErrRecord ) record).setValue(value);*/
errorValue = value;
}
@ -911,7 +934,8 @@ public class HSSFCell
public void setCellStyle(HSSFCellStyle style)
{
cellStyle = style;
record.setXFIndex(style.getIndex());
sheet.setCellStyle(row, cellNum, style.getIndex());
}
/**
@ -961,7 +985,7 @@ public class HSSFCell
protected CellValueRecordInterface getCellValueRecord()
{
return record;
return sheet.getValueRecord(row, cellNum);
}
/**
@ -976,6 +1000,7 @@ public class HSSFCell
throw new RuntimeException("You cannot reference columns with an index of less then 0.");
}
}
/**
* Sets this cell as the active cell for the worksheet
@ -985,4 +1010,5 @@ public class HSSFCell
this.sheet.setActiveCellRow(this.row);
this.sheet.setActiveCellCol(this.cellNum);
}
}

View File

@ -63,6 +63,7 @@ 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;
import org.apache.poi.hssf.record.aggregates.ValueRecordsAggregate;
import java.util.HashMap;
import java.util.Iterator;
@ -84,7 +85,7 @@ public class HSSFRow
public final static int INITIAL_CAPACITY = 5;
//private short rowNum;
private int rowNum;
private HashMap cells;
//private ValueRecordsAggregate cells;
// private short firstcell = -1;
// private short lastcell = -1;
@ -92,7 +93,7 @@ public class HSSFRow
* reference to low level representation
*/
private RowRecord row;
//private RowRecord row;
/**
* reference to containing low level Workbook
@ -123,16 +124,16 @@ public class HSSFRow
protected HSSFRow(Workbook book, Sheet sheet, int rowNum)
{
this.rowNum = rowNum;
cells = new HashMap(10); // new ArrayList(INITIAL_CAPACITY);
//cells = new HashMap(10); // new ArrayList(INITIAL_CAPACITY);
this.book = book;
this.sheet = sheet;
row = new RowRecord();
row.setHeight((short) 0xff);
row.setLastCol((short) -1);
row.setFirstCol((short) -1);
//row = new RowRecord();
//row.setHeight((short) 0xff);
//row.setLastCol((short) -1);
//row.setFirstCol((short) -1);
// row.setRowNumber(rowNum);
setRowNum(rowNum);
//setRowNum(rowNum);
}
/**
@ -148,10 +149,10 @@ public class HSSFRow
protected HSSFRow(Workbook book, Sheet sheet, RowRecord record)
{
//this.rowNum = rowNum;
cells = new HashMap(); // ArrayList(INITIAL_CAPACITY);
//cells = new HashMap(); // ArrayList(INITIAL_CAPACITY);
this.book = book;
this.sheet = sheet;
row = record;
//row = record;
// row.setHeight(record.getHeight());
// row.setRowNumber(rowNum);
@ -175,8 +176,8 @@ public class HSSFRow
{
HSSFCell cell = new HSSFCell(book, sheet, getRowNum(), column);
addCell(cell);
sheet.addValueRecord(getRowNum(), cell.getCellValueRecord());
//addCell(cell);
//sheet.addValueRecord(getRowNum(), cell.getCellValueRecord());
return cell;
}
@ -211,15 +212,15 @@ public class HSSFRow
CellValueRecordInterface cval = cell.getCellValueRecord();
sheet.removeValueRecord(getRowNum(), cval);
cells.remove(new Integer(cell.getCellNum()));
//cells.remove(new Integer(cell.getCellNum()));
if (cell.getCellNum() == row.getLastCol())
if (cell.getCellNum() == getLastCol(rowNum))
{
row.setLastCol(findLastCell(row.getLastCol()));
sheet.getRow(rowNum).setLastCol(findLastCell(sheet.getRow(rowNum).getLastCol()));
}
if (cell.getCellNum() == row.getFirstCol())
if (cell.getCellNum() == getFirstCol(rowNum))
{
row.setFirstCol(findFirstCell(row.getFirstCol()));
setFirstCol(findFirstCell(getFirstCol(rowNum)));
}
}
@ -236,7 +237,7 @@ public class HSSFRow
addCell(hcell);
// sheet.addValueRecord(getRowNum(),cell.getCellValueRecord());
sheet.addValueRecord(getRowNum(),cell);
return hcell;
}
@ -249,10 +250,10 @@ public class HSSFRow
public void setRowNum(int rowNum)
{
this.rowNum = rowNum;
if (row != null)
{
row.setRowNumber(rowNum); // used only for KEY comparison (HSSFRow)
}
//if (row != null)
//{
// row.setRowNumber(rowNum); // used only for KEY comparison (HSSFRow)
//}
}
/**
@ -272,26 +273,44 @@ public class HSSFRow
private void addCell(HSSFCell cell)
{
if (row.getFirstCol() == -1)
if (getFirstCol(rowNum) == -1)
{
row.setFirstCol(cell.getCellNum());
setFirstCol(cell.getCellNum());
}
if (row.getLastCol() == -1)
if (getLastCol(rowNum) == -1)
{
row.setLastCol(cell.getCellNum());
setLastCol(cell.getCellNum());
}
cells.put(new Integer(cell.getCellNum()), cell);
//cells.put(new Integer(cell.getCellNum()), cell);
sheet.addValueRecord(this.rowNum, cell.getCellValueRecord());
if (cell.getCellNum() < row.getFirstCol())
if (cell.getCellNum() < getFirstCol(rowNum))
{
row.setFirstCol(cell.getCellNum());
setFirstCol(cell.getCellNum());
}
if (cell.getCellNum() > row.getLastCol())
if (cell.getCellNum() > getLastCol(rowNum))
{
row.setLastCol(cell.getCellNum());
setLastCol(cell.getCellNum());
}
}
private void setLastCol(short cell) {
sheet.setLastColForRow(rowNum, cell);
}
private void setFirstCol(short cell) {
sheet.setFirstColForRow(rowNum, cell);
}
private short getLastCol(int row) {
return sheet.getLastColForRow(row);
}
private short getFirstCol(int row) {
return sheet.getFirstColForRow(row);
}
/**
* get the hssfcell representing a given column (logical cell) 0-based. If you
* ask for a cell that is not defined....you get a null.
@ -302,6 +321,11 @@ public class HSSFRow
public HSSFCell getCell(short cellnum)
{
HSSFCell retval = null;
CellValueRecordInterface cval = sheet.getValueRecord(rowNum, cellnum);
if (cval != null) {
retval = new HSSFCell(book, sheet, rowNum, cval);
}
/* for (int k = 0; k < cells.size(); k++)
{
@ -312,7 +336,7 @@ public class HSSFRow
return cell;
}
}*/
return (HSSFCell) cells.get(new Integer(cellnum));
return retval;
}
/**
@ -325,7 +349,7 @@ public class HSSFRow
if (getPhysicalNumberOfCells() == 0)
return -1;
else
return row.getFirstCol();
return getFirstCol(rowNum);
}
/**
@ -338,7 +362,7 @@ public class HSSFRow
if (getPhysicalNumberOfCells() == 0)
return -1;
else
return row.getLastCol();
return getLastCol(rowNum);
}
@ -350,11 +374,13 @@ public class HSSFRow
public int getPhysicalNumberOfCells()
{
if (cells == null)
{
return 0; // shouldn't be possible but it is due to missing API support for BLANK/MULBLANK
}
return cells.size();
// sheet.get
// if (cells == null)
// {
// return 0; // shouldn't be possible but it is due to missing API support for BLANK/MULBLANK
// }
// return cells.size();
return sheet.getPhysicalNumberOfRows();
}
/**
@ -367,8 +393,8 @@ public class HSSFRow
{
// row.setOptionFlags(
row.setBadFontHeight(true);
row.setHeight(height);
sheet.getRow(rowNum).setBadFontHeight(true);
sheet.getRow(rowNum).setHeight(height);
}
/**
@ -380,8 +406,8 @@ public class HSSFRow
{
// row.setOptionFlags(
row.setBadFontHeight(true);
row.setHeight((short) (height * 20));
sheet.getRow(rowNum).setBadFontHeight(true);
sheet.getRow(rowNum).setHeight((short) (height * 20));
}
/**
@ -391,7 +417,7 @@ public class HSSFRow
public short getHeight()
{
return row.getHeight();
return sheet.getRow(rowNum).getHeight();
}
/**
@ -401,7 +427,7 @@ public class HSSFRow
public float getHeightInPoints()
{
return (row.getHeight() / 20);
return (sheet.getRow(rowNum).getHeight() / 20);
}
/**
@ -413,7 +439,7 @@ public class HSSFRow
protected RowRecord getRowRecord()
{
return row;
return sheet.getRow(rowNum);
}
/**
@ -457,7 +483,7 @@ public class HSSFRow
public Iterator cellIterator()
{
return cells.values().iterator();
return new RowCellIterator(this.book, this.sheet, this.rowNum);
}
public int compareTo(Object obj)
@ -494,3 +520,36 @@ public class HSSFRow
return false;
}
}
class RowCellIterator implements Iterator {
Iterator cells;
Workbook book;
Sheet sheet;
int row;
public RowCellIterator(Workbook book, Sheet sheet, int row) {
this.sheet = sheet;
this.book = book;
this.row = row;
cells = this.sheet.rowCellIterator(row);
}
public boolean hasNext() {
return cells.hasNext();
}
public Object next() {
HSSFCell retval = null;
if (cells.hasNext()) {
retval = new HSSFCell(book, sheet, row, ((CellValueRecordInterface)cells.next()));
}
return retval;
}
public void remove() {
cells.remove();
}
}

View File

@ -62,13 +62,11 @@ package org.apache.poi.hssf.usermodel;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.TreeMap;
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.HCenterRecord;
import org.apache.poi.hssf.record.Record;
import org.apache.poi.hssf.record.RowRecord;
import org.apache.poi.hssf.record.SCLRecord;
import org.apache.poi.hssf.record.VCenterRecord;
@ -115,7 +113,9 @@ public class HSSFSheet
*/
private Sheet sheet;
private TreeMap rows;
// private TreeMap rows;
// private RowRecordsAggregate rows;
// private ValueRecordsAggregate vra;
private Workbook book;
private int firstrow;
private int lastrow;
@ -132,7 +132,7 @@ public class HSSFSheet
protected HSSFSheet(Workbook book)
{
sheet = Sheet.createSheet();
rows = new TreeMap(); // new ArrayList(INITIAL_CAPACITY);
//rows = new TreeMap(); // new ArrayList(INITIAL_CAPACITY);
this.book = book;
}
@ -148,7 +148,7 @@ public class HSSFSheet
protected HSSFSheet(Workbook book, Sheet sheet)
{
this.sheet = sheet;
rows = new TreeMap();
//rows = new TreeMap();
this.book = book;
setPropertiesFromSheet(sheet);
}
@ -164,7 +164,7 @@ public class HSSFSheet
private void setPropertiesFromSheet(Sheet sheet)
{
int sloc = sheet.getLoc();
/* int sloc = sheet.getLoc();
RowRecord row = sheet.getNextRow();
while (row != null)
@ -173,7 +173,9 @@ public class HSSFSheet
row = sheet.getNextRow();
}
sheet.setLoc(sloc);
sheet.setLoc(sloc);*/
/*
CellValueRecordInterface cval = sheet.getNextValueRecord();
long timestart = System.currentTimeMillis();
@ -204,8 +206,9 @@ public class HSSFSheet
cval = null;
}
}
log.log(DEBUG, "total sheet cell creation took ",
new Long(System.currentTimeMillis() - timestart));
*/
// log.log(DEBUG, "total sheet cell creation took ",
// new Long(System.currentTimeMillis() - timestart));
}
/**
@ -233,13 +236,13 @@ public class HSSFSheet
* @return HSSFRow high level representation
*/
private HSSFRow createRowFromRecord(RowRecord row)
/* private HSSFRow createRowFromRecord(RowRecord row)
{
HSSFRow hrow = new HSSFRow(book, sheet, row);
addRow(hrow, false);
return hrow;
}
}*/
/**
* Remove a row from this sheet. All cells contained in the row are removed as well
@ -250,35 +253,35 @@ public class HSSFSheet
public void removeRow(HSSFRow row)
{
sheet.setLoc(sheet.getDimsLoc());
if (rows.size() > 0)
{
rows.remove(row);
if (row.getRowNum() == getLastRowNum())
{
lastrow = findLastRow(lastrow);
}
if (row.getRowNum() == getFirstRowNum())
{
firstrow = findFirstRow(firstrow);
}
Iterator iter = row.cellIterator();
// if (rows.size() > 0)
// {
// rows.remove(row);
// if (row.getRowNum() == getLastRowNum())
// {
// lastrow = findLastRow(lastrow);
// }
// if (row.getRowNum() == getFirstRowNum())
// {
// firstrow = findFirstRow(firstrow);
// }
//Iterator iter = row.cellIterator();
while (iter.hasNext())
/* while (iter.hasNext())
{
HSSFCell cell = (HSSFCell) iter.next();
sheet.removeValueRecord(row.getRowNum(),
cell.getCellValueRecord());
}
}*/
sheet.removeRow(row.getRowRecord());
}
//}
}
/**
* used internally to refresh the "last row" when the last row is removed.
*/
private int findLastRow(int lastrow)
/* private int findLastRow(int lastrow)
{
int rownum = lastrow - 1;
HSSFRow r = getRow(rownum);
@ -288,13 +291,13 @@ public class HSSFSheet
r = getRow(--rownum);
}
return rownum;
}
}*/
/**
* used internally to refresh the "first row" when the first row is removed.
*/
private int findFirstRow(int firstrow)
/*private int findFirstRow(int firstrow)
{
int rownum = firstrow + 1;
HSSFRow r = getRow(rownum);
@ -308,7 +311,7 @@ public class HSSFSheet
return -1;
return rownum;
}
} */
/**
* add a row to the sheet
@ -318,19 +321,22 @@ public class HSSFSheet
private void addRow(HSSFRow row, boolean addLow)
{
rows.put(row, row);
if (addLow)
{
sheet.addRow(row.getRowRecord());
//rows.put(row, row);
if (addLow) {
RowRecord rec = sheet.getRow(row.getRowNum());
if (rec == null) {
rec = new RowRecord();
sheet.addRow(sheet.createRow(row.getRowNum()));
}
}
if (row.getRowNum() > getLastRowNum())
/* if (row.getRowNum() > getLastRowNum())
{
lastrow = row.getRowNum();
}
if (row.getRowNum() < getFirstRowNum())
{
firstrow = row.getRowNum();
}
}*/
}
/**
@ -342,11 +348,9 @@ public class HSSFSheet
public HSSFRow getRow(int rownum)
{
HSSFRow row = new HSSFRow();
HSSFRow retval = new HSSFRow(book, sheet, this.sheet.getRow(rownum));
//row.setRowNum((short) rownum);
row.setRowNum( rownum);
return (HSSFRow) rows.get(row);
return retval;
}
/**
@ -355,7 +359,7 @@ public class HSSFSheet
public int getPhysicalNumberOfRows()
{
return rows.size();
return sheet.getPhysicalNumberOfRows();
}
/**
@ -365,7 +369,7 @@ public class HSSFSheet
public int getFirstRowNum()
{
return firstrow;
return sheet.getFirstRow();
}
/**
@ -375,7 +379,7 @@ public class HSSFSheet
public int getLastRowNum()
{
return lastrow;
return sheet.getLastRow();
}
/**
@ -592,7 +596,7 @@ public class HSSFSheet
public Iterator rowIterator()
{
return rows.values().iterator();
return new SheetRowIterator(this, this.book);
}
/**
@ -813,66 +817,60 @@ public class HSSFSheet
* @param newPrintGridlines boolean to turn on or off the printing of
* gridlines
*/
public void setPrintGridlines( boolean newPrintGridlines )
{
getSheet().getPrintGridlines().setPrintGridlines( newPrintGridlines );
public void setPrintGridlines(boolean newPrintGridlines) {
getSheet().getPrintGridlines().setPrintGridlines(newPrintGridlines);
}
/**
* Gets the print setup object.
* @return The user model for the print setup object.
*/
public HSSFPrintSetup getPrintSetup()
{
return new HSSFPrintSetup( getSheet().getPrintSetup() );
public HSSFPrintSetup getPrintSetup() {
return new HSSFPrintSetup(getSheet().getPrintSetup());
}
/**
* Gets the user model for the document header.
* @return The Document header.
*/
public HSSFHeader getHeader()
{
return new HSSFHeader( getSheet().getHeader() );
public HSSFHeader getHeader() {
return new HSSFHeader(getSheet().getHeader());
}
/**
* Gets the user model for the document footer.
* @return The Document footer.
*/
public HSSFFooter getFooter()
{
return new HSSFFooter( getSheet().getFooter() );
}
public HSSFFooter getFooter() {
return new HSSFFooter(getSheet().getFooter());
}
/**
* Sets whether sheet is selected.
* @param sel Whether to select the sheet or deselect the sheet.
*/
public void setSelected( boolean sel )
{
getSheet().setSelected( sel );
}
/**
* Sets whether sheet is selected.
* @param sel Whether to select the sheet or deselect the sheet.
*/
public void setSelected(boolean sel) {
getSheet().setSelected(sel);
}
/**
* Gets the size of the margin in inches.
* @param margin which margin to get
* @return the size of the margin
*/
public double getMargin( short margin )
{
return getSheet().getMargin( margin );
}
/**
* Gets the size of the margin in inches.
* @param margin which margin to get
* @return the size of the margin
*/
public double getMargin(short margin) {
return getSheet().getMargin(margin);
}
/**
* Sets the size of the margin in inches.
* @param margin which margin to get
* @param size the size of the margin
*/
public void setMargin(short margin, double size) {
getSheet().setMargin(margin, size);
}
/**
* Sets the size of the margin in inches.
* @param margin which margin to get
* @param size the size of the margin
*/
public void setMargin( short margin, double size )
{
getSheet().setMargin( margin, size );
}
/**
* Sets the zoom magnication for the sheet. The zoom is expressed as a
@ -903,7 +901,7 @@ public class HSSFSheet
* @param endRow
* @param n
* @param isRow
*/
*/
protected void shiftMerged(int startRow, int endRow, int n, boolean isRow) {
List shiftedRegions = new ArrayList();
//move merged regions completely if they fall within the new region boundaries when they are shifted
@ -1087,3 +1085,33 @@ public class HSSFSheet
}
class SheetRowIterator implements Iterator {
Iterator rows;
Workbook book;
Sheet sheet;
public SheetRowIterator(HSSFSheet sheet, Workbook book) {
this.sheet = sheet.getSheet();
this.book = book;
rows = this.sheet.rowRecordIterator();
}
public boolean hasNext() {
return rows.hasNext();
}
public Object next() {
HSSFRow retval = null;
if (rows.hasNext()) {
retval = new HSSFRow(book, sheet, (RowRecord)rows.next());
}
return retval;
}
public void remove() {
rows.remove();
}
}

View File

@ -59,26 +59,11 @@
*/
package org.apache.poi.hssf.usermodel;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Stack;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.hssf.eventmodel.EventRecordFactory;
import org.apache.poi.hssf.model.Sheet;
import org.apache.poi.hssf.model.Workbook;
import org.apache.poi.hssf.record.BackupRecord;
import org.apache.poi.hssf.record.ExtendedFormatRecord;
import org.apache.poi.hssf.record.FontRecord;
import org.apache.poi.hssf.record.NameRecord;
import org.apache.poi.hssf.record.RecordFactory;
import org.apache.poi.hssf.record.SSTRecord;
import org.apache.poi.hssf.record.UnknownRecord;
import org.apache.poi.hssf.record.WindowTwoRecord;
import org.apache.poi.hssf.record.*;
import org.apache.poi.hssf.record.formula.Area3DPtg;
import org.apache.poi.hssf.record.formula.MemFuncPtg;
import org.apache.poi.hssf.record.formula.UnionPtg;
@ -88,9 +73,17 @@ import org.apache.poi.poifs.filesystem.DocumentEntry;
import org.apache.poi.poifs.filesystem.DocumentInputStream;
import org.apache.poi.poifs.filesystem.Entry;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Stack;
/**
* High level representation of a workbook. This is the first object most users
* will construct whether they are reading or writing a workbook. It is also the