mirror of https://github.com/apache/poi.git
[github-206] Improve perfomance of SXSSF cell evaluation. Thanks to This closes #206
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1884288 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
da146d3399
commit
c0ecc83ee4
|
@ -49,6 +49,7 @@ public class SXSSFRow implements Row, Comparable<SXSSFRow>
|
|||
// use Boolean to have a tri-state for on/off/undefined
|
||||
private Boolean _hidden = UNDEFINED;
|
||||
private Boolean _collapsed = UNDEFINED;
|
||||
private int _rowNum;
|
||||
|
||||
public SXSSFRow(SXSSFSheet sheet)
|
||||
{
|
||||
|
@ -59,6 +60,7 @@ public class SXSSFRow implements Row, Comparable<SXSSFRow>
|
|||
{
|
||||
return new CellIterator();
|
||||
}
|
||||
|
||||
public boolean hasCustomHeight()
|
||||
{
|
||||
return _height!=-1;
|
||||
|
@ -195,7 +197,8 @@ public class SXSSFRow implements Row, Comparable<SXSSFRow>
|
|||
@Override
|
||||
public void setRowNum(int rowNum)
|
||||
{
|
||||
_sheet.changeRowNum(this,rowNum);
|
||||
this._rowNum = rowNum;
|
||||
_sheet.changeRowNum(this, rowNum);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -206,7 +209,7 @@ public class SXSSFRow implements Row, Comparable<SXSSFRow>
|
|||
@Override
|
||||
public int getRowNum()
|
||||
{
|
||||
return _sheet.getRowNum(this);
|
||||
return _rowNum;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -393,15 +396,15 @@ public class SXSSFRow implements Row, Comparable<SXSSFRow>
|
|||
*/
|
||||
@Override
|
||||
public CellStyle getRowStyle() {
|
||||
if(!isFormatted()) {
|
||||
return null;
|
||||
}
|
||||
if(!isFormatted()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return getSheet().getWorkbook().getCellStyleAt(_style);
|
||||
return getSheet().getWorkbook().getCellStyleAt(_style);
|
||||
}
|
||||
|
||||
@Internal
|
||||
/*package*/ int getRowStyleIndex() {
|
||||
/*package*/ int getRowStyleIndex() {
|
||||
return _style;
|
||||
}
|
||||
|
||||
|
@ -411,11 +414,11 @@ public class SXSSFRow implements Row, Comparable<SXSSFRow>
|
|||
*/
|
||||
@Override
|
||||
public void setRowStyle(CellStyle style) {
|
||||
if(style == null) {
|
||||
_style = -1;
|
||||
} else {
|
||||
_style = style.getIndex();
|
||||
}
|
||||
if(style == null) {
|
||||
_style = -1;
|
||||
} else {
|
||||
_style = style.getIndex();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -437,8 +440,13 @@ public class SXSSFRow implements Row, Comparable<SXSSFRow>
|
|||
{
|
||||
return _sheet;
|
||||
}
|
||||
|
||||
//end of interface implementation
|
||||
|
||||
void setRowNumWithoutUpdatingSheet(int rowNum)
|
||||
{
|
||||
this._rowNum = rowNum;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an iterator over the cells from [0, getLastCellNum()).
|
||||
|
@ -543,7 +551,7 @@ public class SXSSFRow implements Row, Comparable<SXSSFRow>
|
|||
SXSSFRow other = (SXSSFRow) obj;
|
||||
|
||||
return (this.getRowNum() == other.getRowNum()) &&
|
||||
(this.getSheet() == other.getSheet());
|
||||
(this.getSheet() == other.getSheet());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -563,4 +571,3 @@ public class SXSSFRow implements Row, Comparable<SXSSFRow>
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -146,6 +146,7 @@ public class SXSSFSheet implements Sheet
|
|||
}
|
||||
|
||||
SXSSFRow newRow = new SXSSFRow(this);
|
||||
newRow.setRowNumWithoutUpdatingSheet(rownum);
|
||||
_rows.put(rownum, newRow);
|
||||
allFlushed = false;
|
||||
if(_randomAccessWindowSize >= 0 && _rows.size() > _randomAccessWindowSize) {
|
||||
|
@ -1293,8 +1294,8 @@ public class SXSSFSheet implements Sheet
|
|||
*
|
||||
* <p>
|
||||
* groupRows requires all rows in the group to be in the current window.
|
||||
* This is not always practical. Instead use setRowOutlineLevel to
|
||||
* explicitly set the group level. Level 1 is the top level group,
|
||||
* This is not always practical. Instead use setRowOutlineLevel to
|
||||
* explicitly set the group level. Level 1 is the top level group,
|
||||
* followed by 2, etc. It is up to the user to ensure that level 2
|
||||
* groups are correctly nested under level 1, etc.
|
||||
* </p>
|
||||
|
@ -1588,7 +1589,7 @@ public class SXSSFSheet implements Sheet
|
|||
// to recalculate the best-fit width for the flushed rows. This is an
|
||||
// inherent limitation of SXSSF. If having correct auto-sizing is
|
||||
// critical, the flushed rows would need to be re-read by the read-only
|
||||
// XSSF eventmodel (SAX) or the memory-heavy XSSF usermodel (DOM).
|
||||
// XSSF eventmodel (SAX) or the memory-heavy XSSF usermodel (DOM).
|
||||
final int flushedWidth;
|
||||
try {
|
||||
// get the best fit width of rows already flushed to disk
|
||||
|
@ -1885,22 +1886,17 @@ public class SXSSFSheet implements Sheet
|
|||
lastFlushedRowNumber = rowIndex;
|
||||
}
|
||||
}
|
||||
|
||||
public void changeRowNum(SXSSFRow row, int newRowNum)
|
||||
{
|
||||
|
||||
removeRow(row);
|
||||
_rows.put(newRowNum,row);
|
||||
row.setRowNumWithoutUpdatingSheet(newRowNum);
|
||||
_rows.put(newRowNum, row);
|
||||
}
|
||||
|
||||
public int getRowNum(SXSSFRow row)
|
||||
{
|
||||
for (Map.Entry<Integer, SXSSFRow> entry : _rows.entrySet()) {
|
||||
if (entry.getValue() == row) {
|
||||
return entry.getKey().intValue();
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
return row.getRowNum();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue