2016-05-15 3 views
0

ich bin neu bei der Verwendung von eventusermodel zum Hochladen xls-Datei .. Ich habe ein Problem beim Lesen des Blattes .. Warum Eventusermodell lesen Sie das gesamte Blatt? wie man es ändert? Ich möchte nur mein Programm auf den ersten Bogen erfahren .. hier ist mein Beispielcode:Java - EventUserModel - warum HSSFListener alle Blätter lesen?

public void processRecord(Record record) 
{ 
    if(record.getSid()==RowRecord.sid){ 
     newrowrec = (RowRecord) record; 
     System.out.println("new ROW NUMBER : "+ newrowrec.getRowNumber()); 
     System.out.println("new LAST ROW NUMBER : "+ newrowrec.getLastCol()); 
    } 
    switch (record.getSid()) 
    { 
     case BOFRecord.sid: 
      BOFRecord bof = (BOFRecord) record; 
      if (bof.getType() == bof.TYPE_WORKBOOK) 
      { 
       System.out.println("Encountered workbook"); 
       // assigned to the class level member 
      } else if (bof.getType() == bof.TYPE_WORKSHEET) 
      { 
       System.out.println("Encountered sheet reference"); 
      } 
      break; 
     case RowRecord.sid: 
      RowRecord rowrec = (RowRecord) record; 
      System.out.println("Row found, first column at " 
        + rowrec.getFirstCol() + " last column at " + rowrec.getLastCol()); 
      break; 
     case NumberRecord.sid: 
      NumberRecord numrec = (NumberRecord) record; 
      System.out.println("Cell found with value " + (long)numrec.getValue() 
        + " at row " + numrec.getRow() + " and column " + numrec.getColumn()); 
      rowlist.add(String.valueOf((long)(numrec.getValue())).toLowerCase()); 

      if(numrec.getColumn()==newrowrec.getLastCol()-1){ 
       System.out.println("NUMBER ROWLIST: "+ rowlist); 
       extractRow(rowlist, newrowrec.getRowNumber()); 
       rowlist.clear(); 
      } 
      break; 

     case BlankRecord.sid: 
      BlankRecord blankrec = (BlankRecord) record; 
      System.out.println("BLANK VALUE at row: "+ blankrec.getRow() + " at coloumn: " + blankrec.getColumn()); 
      rowlist.add("null"); 
      break; 
     case SSTRecord.sid: 
      sstrec = (SSTRecord) record; 
      for (int k = 0; k < sstrec.getNumUniqueStrings(); k++) 
      { 
       System.out.println("String table value " + k + " = " + sstrec.getString(k)); 
        System.out.println("SSTRECORD ROWLIST: "+ rowlist); 
      } 
      break;   
     case LabelSSTRecord.sid: 
      lrec = (LabelSSTRecord) record; 
      rowlist.add(sstrec.getString(lrec.getSSTIndex()).toString()); 
      break; 
    } 

die Linie tun muss ich ändern, um dies nur erste Blatt lesen zu machen? Danke für den Fortschritt ..

Antwort

0

Eines der besten Beispiele für die Unterstützung der HSSF-Ereignisanalyse ist in EventBasedExcelExtractor shipped as part of Apache POI. Wenn Sie durch den lesen, werden Sie feststellen, dass ein BOFRecord vom Typ TYPE_WORKSHEET zu Beginn löst ein neues Blatt

Also, sollten Sie Ihren Code etwas ändern wie:

int seenSheets = 0; 

.... 

if(record.getSid()==RowRecord.sid){ 
    newrowrec = (RowRecord) record; 
    System.out.println("new ROW NUMBER : "+ newrowrec.getRowNumber()); 
    System.out.println("new LAST ROW NUMBER : "+ newrowrec.getLastCol()); 
} 
switch (record.getSid()) 
{ 
    seenSheets++; 
    if (seenSheets > 1) { 
     throw new Exception("Sheet done"); 
.... 

Und fangen diese Ausnahme auf der Außenseite zu beenden

vielleicht wollen Sie auch AbortableHSSFListener verwenden, um eine sauberere Möglichkeit zu haben, zu beenden, wenn Sie das zweite Blatt getroffen