イテレータの使用方法と使用場所

イテレータの使い方

Cells イテレータ

セルの反復子にアクセスするにはさまざまな方法があり、アプリケーションの要件に基づいてこれらの方法のいずれかを使用できます。セルの反復子を返すメソッドは次のとおりです。

  1. Cells.iterator
  2. Row.iterator
  3. Range.iterator

上記のメソッドはすべて、初期化されたセルのコレクションをトラバースできるイテレータを返します。

次のコード例は、セル コレクションの Iterator クラスの実装を示しています。

// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-Java
String dataDir = Utils.getDataDir(CellsIterator.class);
// Load a file in an instance of Workbook
Workbook book = new Workbook(dataDir + "sample.xlsx");
// Get the iterator from Cells collection
Iterator cellIterator = book.getWorksheets().get(0).getCells().iterator();
// Traverse cells in the collection
while (cellIterator.hasNext()) {
Cell cell = (Cell) cellIterator.next();
;
System.out.println(cell.getName() + " " + cell.getValue());
}
// Get iterator from an object of Row
Iterator rowIterator = book.getWorksheets().get(0).getCells().getRows().get(0).iterator();
// Traverse cells in the given row
while (rowIterator.hasNext()) {
Cell cell = (Cell) rowIterator.next();
System.out.println(cell.getName() + " " + cell.getValue());
}
// Get iterator from an object of Range
Iterator rangeIterator = book.getWorksheets().get(0).getCells().createRange("A1:B10").iterator();
// Traverse cells in the range
while (rangeIterator.hasNext()) {
Cell cell = (Cell) rangeIterator.next();
System.out.println(cell.getName() + " " + cell.getValue());
}
行反復子

Rows Iterator は、RowCollection.iterator メソッドの使用中にアクセスできます。次のコード例は、RowCollection クラスの Iterator の実装を示しています。

// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-Java
String dataDir = Utils.getDataDir(RowsIterator.class);
// Load a file in an instance of Workbook
Workbook book = new Workbook(dataDir + "sample.xlsx");
// Get the iterator for RowCollection
Iterator rowsIterator = book.getWorksheets().get(0).getCells().getRows().iterator();
// Traverse rows in the collection
while (rowsIterator.hasNext()) {
Row row = (Row) rowsIterator.next();
System.out.println(row.getIndex());
}
列イテレータ

ColumnCollection.iterator メソッドの使用中に、Columns Iterator にアクセスできます。次のコード例は、ColumnCollection クラスの Iterator の実装を示しています。

イテレータを使用する場所

イテレータを使用する利点を説明するために、リアルタイムの例を見てみましょう。

シナリオ

アプリケーションの要件は、特定のワークシート内のすべてのセルをトラバースしてそれらの値を読み取ることです。この目標を実現するには、いくつかの方法があります。いくつかを以下に示します。

表示範囲の使用
// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-Java
String dataDir = Utils.getDataDir(UsingDisplayRange.class);
// Load a file in an instance of Workbook
Workbook book = new Workbook(dataDir + "sample.xlsx");
// Get Cells collection of first worksheet
Cells cells = book.getWorksheets().get(0).getCells();
// Get the MaxDisplayRange
Range displayRange = cells.getMaxDisplayRange();
// Loop over all cells in the MaxDisplayRange
for (int row = displayRange.getFirstRow(); row < displayRange.getRowCount(); row++) {
for (int col = displayRange.getFirstColumn(); col < displayRange.getColumnCount(); col++) {
// Read the Cell value
System.out.println(displayRange.get(row, col).getStringValue());
}
}
MaxDataRow と MaxDataColumn の使用

上記のアプローチの両方が多かれ少なかれ類似したロジックを使用していることがわかります。コレクション内のすべてのセルをループして、セルの値を読み取ります。これは、以下で説明するように、いくつかの理由で問題になる可能性があります。

  1. MaxRow、MaxDataRow、MaxColumn、MaxDataColumn、MaxDisplayRange などの API は、対応する統計を収集するために余分な時間を必要とします。データ マトリックス (行 x 列) が大きい場合、これらの API を使用すると、パフォーマンスが低下する可能性があります。
  2. ほとんどの場合、特定の範囲内のすべてのセルがインスタンス化されるわけではありません。このような状況では、マトリックス内のすべてのセルをチェックすることは、初期化されたセルのみをチェックする場合に比べて効率的ではありません。
  3. Cells.get(rowIndex, columnIndex) としてループ内のセルにアクセスすると、範囲内のすべてのセル オブジェクトがインスタンス化され、最終的に OutOfMemoryError が発生する可能性があります。
結論

上記の事実に基づいて、イテレータを使用する必要があるシナリオを次に示します。

  1. セル コレクションの読み取り専用アクセスが必要です。要件は、セルのみを検査することです。
  2. 多数のセルが横断されます。
  3. 初期化されたセル/行/列のみがトラバースされます。