You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
4.0 KiB
C#
141 lines
4.0 KiB
C#
9 months ago
|
namespace com.azkoss.excellite
|
||
|
{
|
||
|
using System;
|
||
|
using System.Collections;
|
||
|
|
||
|
///<summary>
|
||
|
///Enumerator used for iterating cells in a <see cref="com.azkoss.excellite.CellRange">CellRange</see>.
|
||
|
///</summary>
|
||
|
public class CellRangeEnumerator : IEnumerator
|
||
|
{
|
||
|
// Methods
|
||
|
internal CellRangeEnumerator(CellRange parent, bool onlyAllocated)
|
||
|
{
|
||
|
this.parent = parent;
|
||
|
this.onlyAllocated = onlyAllocated;
|
||
|
this.rowCollection = this.parent.Parent.Rows;
|
||
|
if (this.onlyAllocated)
|
||
|
{
|
||
|
this.rowLimit = Math.Min((int) (this.rowCollection.Count - 1), this.parent.LastRowIndex);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this.rowLimit = this.parent.LastRowIndex;
|
||
|
}
|
||
|
this.Reset();
|
||
|
}
|
||
|
|
||
|
///<summary>
|
||
|
///Advances the enumerator to the next element of the cell range.
|
||
|
///</summary>
|
||
|
///<returns>
|
||
|
///<b>true</b> if the enumerator was successfully advanced to the next element; <b>false</b> if
|
||
|
///the enumerator has passed the end of the cell range.
|
||
|
///</returns>
|
||
|
public bool MoveNext()
|
||
|
{
|
||
|
while (this.currentRow <= this.rowLimit)
|
||
|
{
|
||
|
int num1;
|
||
|
if (this.onlyAllocated)
|
||
|
{
|
||
|
num1 = Math.Min((int) (this.rowCollection[this.currentRow].AllocatedCells.Count - 1), this.parent.LastColumnIndex);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
num1 = this.parent.LastColumnIndex;
|
||
|
}
|
||
|
this.currentColumn++;
|
||
|
if (this.currentColumn <= num1)
|
||
|
{
|
||
|
return true;
|
||
|
}
|
||
|
this.currentColumn = this.parent.FirstColumnIndex - 1;
|
||
|
this.currentRow++;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
///<summary>
|
||
|
///Sets the enumerator to its initial position, which is one column before
|
||
|
///the first cell in the cell range.
|
||
|
///</summary>
|
||
|
public void Reset()
|
||
|
{
|
||
|
this.currentRow = this.parent.FirstRowIndex;
|
||
|
this.currentColumn = this.parent.FirstColumnIndex - 1;
|
||
|
}
|
||
|
|
||
|
|
||
|
// Properties
|
||
|
///<summary>
|
||
|
///Gets the current element in the cell range.
|
||
|
///</summary>
|
||
|
public object Current
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.CurrentCell;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
///<summary>
|
||
|
///Gets the current <see cref="com.azkoss.excellite.ExcelCell">ExcelCell</see> in the cell range.
|
||
|
///</summary>
|
||
|
public ExcelCell CurrentCell
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
if (this.parent.IsRowColumnOutOfRange(this.currentRow, this.currentColumn))
|
||
|
{
|
||
|
throw new InvalidOperationException("Enumerator is not pointing to valid cell. Use Reset() and/or MoveNext() methods.");
|
||
|
}
|
||
|
return this.rowCollection[this.currentRow].AllocatedCells[this.currentColumn];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
///<summary>
|
||
|
///Current absolute column index in the cell range.
|
||
|
///</summary>
|
||
|
public int CurrentColumn
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.currentColumn;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
///<summary>
|
||
|
///Current absolute row index in the cell range.
|
||
|
///</summary>
|
||
|
public int CurrentRow
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.currentRow;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
///<summary>
|
||
|
///Parent <see cref="com.azkoss.excellite.CellRange">CellRange</see>.
|
||
|
///</summary>
|
||
|
public CellRange Parent
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.parent;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
// Fields
|
||
|
private int currentColumn;
|
||
|
private int currentRow;
|
||
|
private bool onlyAllocated;
|
||
|
private readonly CellRange parent;
|
||
|
private ExcelRowCollection rowCollection;
|
||
|
private int rowLimit;
|
||
|
}
|
||
|
}
|
||
|
|