2017-12-21 5 views
0

Bitte entschuldigen Sie, wenn ich nicht klar bin. Englisch ist nicht meine Muttersprache.Kann ich bei der Arbeit mit Apache POI mithilfe von Indizes eine Excel-Datei durchsuchen?

Ich versuche, einen Code zu schreiben, wo ich durch die erste Zeile einer Excel-Datei durchlaufen kann, bis ich die Spalte mit der Bezeichnung "Kommentare" finden. Ich möchte eine Aktion für den Text in dieser Spalte ausführen und dann das Ergebnis in einer neuen Spalte am Ende der Datei speichern. Kann ich die xlsx-Datei ähnlich wie bei Indizes durchqueren? Und wenn ja, wie kann ich mithilfe der Koordinaten dieser Zelle direkt zu einer Zelle springen?

public static void main(String[] args) throws IOException { 

    File myFile = new File("temp.xlsx"); 
    FileInputStream fis = null; 
    try { 
     fis = new FileInputStream(myFile); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    @SuppressWarnings("resource") 
    XSSFWorkbook myWorkBook = new XSSFWorkbook (fis); 
    XSSFSheet mySheet = myWorkBook.getSheetAt(0); 
    Iterator<Row> rowIterator = mySheet.iterator(); 


    Row row = rowIterator.next(); 
    Iterator<Cell> cellIterator = row.cellIterator(); 

    while (cellIterator.hasNext()) { 

     Cell cell = cellIterator.next(); 

     String comment = cell.toString(); 

     if (comment.equals("Comments")) 
     { 
      System.out.println("Hello"); 
     } 



    } 


} 

}

Antwort

1

Für die Frage „Wollte der zweiten Spalte der dritten Zeile gehen, ich Koordinaten wie (3, 2) verwenden könnte?“:

Ja, das ist möglich CellUtil verwenden. Vorteile gegenüber den Methoden in Sheet und sind, dass CellUtil Methoden in der Lage sind, die Zelle zu bekommen, wenn sie bereits existiert oder die Zelle zu erstellen, wenn sie nicht bereits existiert. Daher werden bestehende Zellen respektiert, anstatt sie einfach neu zu erstellen und sie so zu überschreiben.

Beispiel:

import java.io.FileOutputStream; 

import org.apache.poi.ss.usermodel.*; 
import org.apache.poi.xssf.usermodel.*; 

import org.apache.poi.ss.util.CellUtil; 

import java.util.concurrent.ThreadLocalRandom; 

public class CreateExcelCellsByIndex { 

public static void main(String[] args) throws Exception { 

    Workbook workbook = new XSSFWorkbook(); 
    Sheet sheet = workbook.createSheet(); 

    //put content in R3C2: 
    Cell cell = CellUtil.getCell(CellUtil.getRow(3-1, sheet), 2-1); //-1 because apache poi's row and cell indexes are 0 based 
    cell.setCellValue("R3C2"); 

    //put content in 10 random cells: 
    for (int i = 1; i < 11; i++) { 

    int r = ThreadLocalRandom.current().nextInt(4, 11); 
    int c = ThreadLocalRandom.current().nextInt(1, 6); 
    cell = CellUtil.getCell(CellUtil.getRow(r-1, sheet), c-1); 
    String cellcontent = ""; 
    if (cell.getCellTypeEnum() == CellType.STRING) { 
    cellcontent = cell.getStringCellValue() + " "; 
    } 
    cell.setCellValue(cellcontent + i + ":R"+r+"C"+c); 
    } 

    workbook.write(new FileOutputStream("CreateExcelCellsByIndex.xlsx")); 
    workbook.close(); 

} 

} 
+0

Vielen Dank. Das ist brilliant! –

0

Ich bin mir nicht sicher, was Sie von 2D-Index bedeuten, sondern ein Cell weiß, welche Spalte gehört es zu so etwas wie dies funktionieren soll:

... 
Cell cell = cellIterator.next(); 

String comment = cell.toString(); 

int sourceColumnIndex = -1; 
if (comment.equals("Comments")) { 
    System.out.println("Hello"); 
    sourceColumnIndex = cell.getColumnIndex(); 
} 
.... 

In ähnlicher Weise definieren etwas wie int targetColumnIndex, um die Spalte darzustellen, die das Ergebnis der Verarbeitung aller Zellen aus der Spalte sourceColumnIndex haben wird.

+0

Thank you so viel ist das großartig. Ja, es tut mir leid, ich werde das ändern, um klarer zu werden. Was ich meinte war, dass ich direkt in eine Zelle springen kann, indem ich seine Zellkoordinaten benutze? Als ob ich in die dritte Reihe der zweiten Spalte gehen wollte, konnte ich Koordinaten wie (3, 2) –

+0

verwenden. Keine direkte Art mit Apache POI, die ich kenne. Aber mit 'Row r = sheet.getRow (rowIndex)' können Sie 'Cell c = r.createCell (columnIndex)'. –