Hur och var man ska använda iteratorer

Hur man använder Iteratorer

Cells Iterator

Det finns olika sätt att komma åt cellernas iterator, och man kan använda någon av dessa metoder baserat på applikationskraven. Här är metoderna som returnerar cellernas iterator.

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

Alla ovan nämnda metoder returnerar en iterator som tillåter att traversera samlingen av celler som har initierats.

Följande kodexempel demonstrerar implementeringen av Iterator-klassen för en cellers samling.

// 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

Rows Iterator kan kommas åt när man använder RowCollection.iterator-metoden. Följande kodexempel demonstrerar implementeringen av Iteratorklassen för RowCollection-klassen.

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

Columns Iterator kan kommas åt när man använder ColumnCollection.iterator-metoden. Följande kodexempel demonstrerar implementeringen av Iteratorklassen för ColumnCollection-klassen.

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

Var man ska använda Iteratorer

För att diskutera fördelarna med att använda iteratorer, låt oss ta ett verkligt exempel.

Scenario

Ett applikationskrav är att traversera alla celler i en given arbetsbok för att läsa deras värden. Det kan finnas flera sätt att implementera detta mål. Några demonstreras nedan.

Användning av Display Range
// 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());
}
}
Användning av 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());
}
}

Som du kan se, använder båda ovan nämnda tillvägagångssätt mer eller mindre liknande logik, det vill säga; loopa över alla celler i samlingen för att läsa cellvärdena. Detta kan vara problematiskt av flera skäl som diskuteras nedan.

  1. API:er som MaxRow, MaxDataRow, MaxColumn, MaxDataColumn & MaxDisplayRange kräver extra tid för att samla in motsvarande statistik. Om datamatrisen (rader x kolumner) är stor kan användningen av dessa API:er innebära prestandastraff.
  2. I de flesta fall är inte alla celler i en given omfattning instansierade. I sådana situationer är det inte så effektivt att kontrollera varje cell i matrisen jämfört med att bara kontrollera de initierade cellerna.
  3. Åtkomst av en cell i en loop som Cells.get(rowIndex, columnIndex) kommer att orsaka att alla cellobjekt i en omfattning instansieras, vilket eventuellt kan orsaka OutOfMemoryError.
Slutsats

Baserat på ovan nämnda fakta, följande är de möjliga scenarier där iteratorer bör användas.

  1. Endast läsåtkomst av cellkollektionen krävs, det vill säga; kravet är att bara inspektera cellerna.
  2. Ett stort antal celler ska traverseras.
  3. Endast initialiserade celler/rader/kolumner ska traverseras.