Wie und wo Iteratoren verwenden

Wie man Iteratoren verwendet

Cells-Iterator

Es gibt verschiedene Möglichkeiten, auf den Zellen-Iterator zuzugreifen, und man kann je nach den Anforderungen der Anwendung eine dieser Methoden verwenden. Hier sind die Methoden, die den Zellen-Iterator 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 zu durchlaufen, die initialisiert wurden.

Das folgende Codebeispiel demonstriert die Implementierung der Iterator-Klasse für eine Zellensammlung.

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

Der Reihen-Iterator kann beim Verwenden der RowCollection.iterator-Methode aufgerufen werden. Das folgende Codebeispiel demonstriert die Implementierung des Iterators für die 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

Der Spalten-Iterator kann beim Verwenden der ColumnCollection.iterator-Methode aufgerufen werden. Das folgende Codebeispiel demonstriert die Implementierung des Iterators für die 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 Iteratoren verwendet werden sollen

Um die Vorteile der Verwendung von Iteratoren zu diskutieren, betrachten wir ein reales Beispiel.

Szenario

Eine Anwendungsanforderung besteht darin, alle Zellen in einem gegebenen Arbeitsblatt zu durchlaufen, um ihre Werte zu lesen. Es könnte mehrere Möglichkeiten geben, dieses Ziel zu erreichen. Einige sind unten dargestellt.

Die 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 beobachten können, verwenden beide oben genannten Ansätze mehr oder weniger ähnliche Logik, nämlich; Schleife über alle Zellen in der Sammlung, um die Zellwerte zu lesen. Dies könnte aus verschiedenen Gründen problematisch sein, wie unten diskutiert.

  1. Die APIs wie MaxRow, MaxDataRow, MaxColumn, MaxDataColumn & MaxDisplayRange benötigen zusätzliche Zeit, um die entsprechenden Statistiken zu sammeln. Wenn die Datenmatrix (Zeilen x Spalten) groß ist, könnte die Verwendung dieser APIs eine Leistungsstrafe verhängen.
  2. In den meisten Fällen sind nicht alle Zellen in einem bestimmten Bereich instanziiert. In solchen Situationen ist es nicht so effizient, jede Zelle in der Matrix zu überprüfen, im Vergleich dazu nur die initialisierten Zellen zu überprüfen.
  3. Der Zugriff auf eine Zelle in einer Schleife wie Cells.get(rowIndex, columnIndex) führt dazu, dass alle Zellenobjekte in einem Bereich instanziiert werden, was letztendlich zu einem OutOfMemoryError führen kann.
Fazit

Basierend auf den oben genannten Fakten sind folgende mögliche Szenarien, in denen Iteratoren verwendet werden sollten.

  1. Schreibgeschützter Zugriff auf die Zellsammlung ist erforderlich, d.h. es ist nur erforderlich, die Zellen zu inspizieren.
  2. Eine große Anzahl von Zellen muss durchlaufen werden.
  3. Es sollen nur initialisierte Zellen/Zeilen/Spalten durchlaufen werden.