Wie und wo man Iteratoren verwendet

Verwendung von Iteratoren

Cells Iterator

Es gibt verschiedene Möglichkeiten, auf den Iterator der Zellen zuzugreifen, und je nach Anwendungsanforderungen kann jede dieser Methoden verwendet werden. Hier sind die Methoden, die den Iterator der Zellen zurückgeben.

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

Alle oben genannten Methoden geben den Iterator zurück, der es ermöglicht, die Sammlung von Zellen, die initialisiert wurden, zu durchlaufen.

Das folgende Codebeispiel veranschaulicht die Implementierung der Iterator-Klasse für eine Cells-Auflistung.

// 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());
}
Zeilen-Iterator

Auf den Rows-Iterator kann zugegriffen werden, während die RowCollection.iterator-Methode verwendet wird. Das folgende Codebeispiel veranschaulicht die Implementierung der Iterator for RowCollection-Klasse.

// 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());
}
Spalten-Iterator

Auf den Columns-Iterator kann mit der ColumnCollection.iterator-Methode zugegriffen werden. Das folgende Codebeispiel veranschaulicht die Implementierung der Iterator for ColumnCollection-Klasse.

// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-Java
String dataDir = Utils.getDataDir(ColumnsIterator.class);
// Load a file in an instance of Workbook
Workbook book = new Workbook(dataDir + "sample.xlsx");
// Get the iterator for ColumnsCollection
Iterator colsIterator = book.getWorksheets().get(0).getCells().getColumns().iterator();
// Traverse columns in the collection
while (colsIterator.hasNext()) {
Column col = (Column) colsIterator.next();
System.out.println(col.getIndex());
}

Wo man Iteratoren verwendet

Um die Vorteile der Verwendung von Iteratoren zu erörtern, nehmen wir ein Echtzeitbeispiel.

Szenario

Eine Anwendungsanforderung besteht darin, alle Zellen in einem bestimmten Arbeitsblatt zu durchlaufen, um ihre Werte zu lesen. Es könnte mehrere Möglichkeiten geben, dieses Ziel umzusetzen. Einige werden unten demonstriert.

Anzeigebereich verwenden
// 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());
}
}
Verwenden von MaxDataRow & MaxDataColumn
// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-Java
String dataDir = Utils.getDataDir(UsingMaxDataRowAndMaxDataColumn.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();
// Loop over all cells
for (int row = 0; row < cells.getMaxDataRow(); row++) {
for (int col = 0; col < cells.getMaxDataColumn(); col++) {
// Read the Cell value
System.out.println(cells.get(row, col).getStringValue());
}
}

Wie Sie feststellen können, verwenden beide oben genannten Ansätze eine mehr oder weniger ähnliche Logik, das heißt; Schleife über alle Zellen in der Sammlung, um die Zellenwerte zu lesen. Dies könnte aus einer Reihe von Gründen problematisch sein, wie unten diskutiert wird.

  1. Die APIs wie MaxRow, MaxDataRow, MaxColumn, MaxDataColumn und MaxDisplayRange benötigen zusätzliche Zeit, um die entsprechenden Statistiken zu sammeln. Falls die Datenmatrix (Zeilen x Spalten) groß ist, kann die Verwendung dieser APIs zu Leistungseinbußen führen.
  2. In den meisten Fällen werden nicht alle Zellen in einem bestimmten Bereich instanziiert. In solchen Situationen ist es nicht so effizient, jede Zelle in der Matrix zu prüfen, als nur die initialisierten Zellen zu prüfen.
  3. Der Zugriff auf eine Zelle in einer Schleife als Cells.get(rowIndex, columnIndex) bewirkt, dass alle Zellobjekte in einem Bereich instanziiert werden, was schließlich zu OutOfMemoryError führen kann.
Fazit

Basierend auf den oben genannten Fakten sind im Folgenden die möglichen Szenarien aufgeführt, in denen Iteratoren verwendet werden sollten.

  1. Nur-Lese-Zugriff auf die Zellsammlung ist erforderlich, das heißt; Voraussetzung ist, dass nur die Zellen inspiziert werden.
  2. Eine große Anzahl von Zellen muss durchquert werden.
  3. Es sollen nur initialisierte Zellen/Zeilen/Spalten durchlaufen werden.