2016-06-04 3 views
0

Wie kann ich einen Wert für bestimmte Spaltennamen mit Apache POI in Excel (xlsx) lesen?Wie kann ich einen Wert aus dem Spaltennamen in Excel in Java lesen?

Spaltennamen ist meine erste Zeile der Excel-Tabelle. Wert ist die Zeile mit Y als Zellenwert.

Meine Eingabe ist nur Spaltenname, Ich brauche Wert für die Spaltennamen und Row, den Wert „Y“ hat

Below is the Excel Sheet

hier ich, wenn Spaltennamen als „Name“ geben, sollte es zurückgeben Wert „Jose“ und „Alter“ soll es 23

zurückkehrt ich habe versucht, und zwei Codes mit unterschiedlichem Loop-System gefunden, aber einige Fehler

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

    File file = new File("D:\\xcel.xlsx"); 
    FileInputStream inputStream = new FileInputStream(file); 


    Workbook wb = new XSSFWorkbook(inputStream); 
    Sheet sh = wb.getSheet("Sheet1"); 

    // Find the Column number Which has column name and row number 0 

    Row row1 = sh.getRow(0);  
    int colNum = -1; 
    for (int i = 0 ;i<=row1.getLastCellNum();i++){ 
     Cell cell1 = row1.getCell(i,Row.CREATE_NULL_AS_BLANK); 
     String cellValue1 = cell1.getStringCellValue(); 
     if ("Employee".equals(cellValue1)){ 
       colNum = i ; 
       break;} 
     } 



    // Find the Row number Which is "Y" and column number 1 

    int rowNum = -1;   
    for (int j = 0 ;j<=sh.getLastRowNum()+1;j++){   
     Row row2 = sh.getRow(j); 
     Cell cell2 = row2.getCell(1,Row.CREATE_NULL_AS_BLANK);  
     String cellValue2 = cell2.getStringCellValue(); 
      if ("Y".equals(cellValue2)) 
      { rowNum = j ; 
      break;}      
     } 



    Row r = sh.getRow(rowNum); 
    String val = r.getCell(colNum).getStringCellValue(); 

    System.out.println("Row number is "+rowNum); 
    System.out.println("Last row number :"+sh.getLastRowNum()); 
    System.out.println("Column number is "+colNum); 
    System.out.println("Last Column number :"+sh.getRow(0).getLastCellNum()); 
    System.out.println("Value is "+val); 

} 
bekommen

Wenn ich den obigen Code ausführen, bekomme ich die Spaltennummer, auch wenn es eine leere Zelle ist, bevor es vorhanden ist,

aber für die Reihe, wenn es eine leere Zelle vorhanden, bevor es ist, ich Fehler Ausnahme erhalten in thread "main" java.lang.NullPointerException Aber es funktioniert gut, wenn es keine schwarze Zelle gibt.

Auch in diesem Code unten, ich erhalte keine Fehler

Aber wenn meine Spaltennamen in letzter Zelle ist, dann letzte Zellennummer und meine Spaltennummer sollen gleich sein, aber ich meine Spaltennummer bekommen ist eins weniger als die letzte Zellennummer.

Aber für Zeile Nummer, es ist in Ordnung, ich bekomme die gleiche Nummer.

Dieses Problem gilt auch für den ersten Code ist

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

    File file = new File("D:\\xcel.xlsx"); 
    FileInputStream inputStream = new FileInputStream(file); 


    Workbook wb = new XSSFWorkbook(inputStream); 
    Sheet sh = wb.getSheet("Sheet1"); 

    // Find the Column number Which has column name and row number 0 

    Row row1 = sh.getRow(0);  

    int colNum = -1; 
    for (Cell cell : row1) { 
      if (cell.getCellType() == Cell.CELL_TYPE_STRING) { 
       if (cell.getRichStringCellValue().getString().trim().equals("Employee")) { 
        colNum = cell.getColumnIndex();         } 
                  } 
           } 

    // Find the Row number Which is "Y" and column number 1 


    int rowNum = -1; 
    for (Row row : sh) { 
      for (Cell cell : row) { 
       if (cell.getCellType() == Cell.CELL_TYPE_STRING) { 
        if (cell.getRichStringCellValue().getString().trim().equals("Y")) { 
         rowNum = row.getRowNum();          } 
                   } 
            } 
         }    


// Get the required value 
    Row r = sh.getRow(rowNum); 
    String val = r.getCell(colNum).getStringCellValue(); 

    System.out.println("Row number is "+rowNum); 
    System.out.println("Last row number :"+sh.getLastRowNum()); 
    System.out.println("Column number is "+colNum); 
    System.out.println("Last Column number :"+sh.getRow(0).getLastCellNum()); 
    System.out.println("Value is "+val); 

Antwort

0

Apache POI nicht unterstützt diese Art der Sache aus dem Sack. Möglicherweise müssen Sie Ihre EXCEL-Datei in einer abstrakten Struktur Ihres eigenen Schreibens lesen.

Ich würde etwas wie ein Dokumentmodell empfehlen, das Ihre Header und Inhalte enthält.

Wenn Ihr Zweck nur das Sammeln von Werten nach Spaltennamen ist, können Sie mit ein wenig Datenredundanz jeden Wert als Map-Eintrag von {Spaltenname: Zeilenwert} in einer Liste aller Zeilen speichern.

Wenn Sie eine solche Struktur haben, können Sie einfach nach Spaltenwerten suchen.

Zum Beispiel:

import java.util.ArrayList; 
import java.util.List; 

public class Document { 

    private List<String> headers; 

    private List<DataRow> contents; 

    public Document(List<String> headers, List<DataRow> contents) { 
     this.headers = headers; 
     this.contents = contents; 
    } 

    public List<DataRow> findAllWhere(String column, String value) { 
     List<DataRow> result = new ArrayList<>(); 
     for (DataRow content : contents) { 
      if (content.get(column).equals(value)) { 
       result.add(content); 
      } 
     } 
     return result; 
    } 

    public List<DataRow> getContents() { 
     return contents; 
    } 

    public void setContents(List<DataRow> contents) { 
     this.contents = contents; 
    } 

    public List<String> getHeaders() { 
     return headers; 
    } 

    public void setHeaders(List<String> headers) { 
     this.headers = headers; 
    } 

    @Override 
    public String toString() { 
     return "Document{" + 
       "headers=" + headers + 
       ", contents=" + contents + 
       '}'; 
    } 

} 

Für Reihen wir so etwas wie dieses haben:

import java.util.HashMap; 
import java.util.Map; 

public class DataRow { 

    private Map<String, String> values = new HashMap<>(); 
    private Integer index; 

    public String put(String columnName, String value) { 
     return values.put(columnName, value); 
    } 

    public String get(String columnName) { 
     return values.get(columnName); 
    } 

    public Integer getIndex() { 
     return index; 
    } 

    public void setIndex(Integer index) { 
     this.index = index; 
    } 


    @Override 
    public String toString() { 
     return "DataRow{" + 
       "values=" + values + 
       ", index=" + index + 
       '}'; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (o == null || getClass() != o.getClass()) return false; 

     DataRow dataRow = (DataRow) o; 

     if (values != null ? !values.equals(dataRow.values) : dataRow.values != null) return false; 
     return !(index != null ? !index.equals(dataRow.index) : dataRow.index != null); 

    } 

    @Override 
    public int hashCode() { 
     int result = values != null ? values.hashCode() : 0; 
     result = 31 * result + (index != null ? index.hashCode() : 0); 
     return result; 
    } 

} 

Beispiel, wie es zu analysieren:

import org.apache.poi.openxml4j.exceptions.InvalidFormatException; 
import org.apache.poi.ss.usermodel.*; 

import java.io.IOException; 
import java.io.InputStream; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 

public class Parser { 

    private InputStream stream; 

    public Parser(InputStream stream) { 
     this.stream = stream; 
    } 

    public Document parse() { 
     try { 
      Workbook wb = WorkbookFactory.create(stream); 

      //TODO better sheet searching 
      Sheet sheet = wb.getSheetAt(0); 
      Iterator<Row> rows = sheet.rowIterator(); 

      List<String> headers = new ArrayList<>(); 
      if (rows.hasNext()) { 
       Row row = rows.next(); 
       for (Cell cell : row) { 
        headers.add(cell.getStringCellValue()); 
       } 
      } 

      List<DataRow> contents = new ArrayList<>(); 
      while (rows.hasNext()) { 
       Row row = rows.next(); 
       DataRow dataRow = new DataRow(); 
       dataRow.setIndex(row.getRowNum()); 
       for (Cell cell : row) { 
        //TODO safeguard for header resolving, cell column index might be out of bound of header array 
        dataRow.put(
          headers.get(cell.getColumnIndex()), 
          cell.getStringCellValue() 
        ); 
       } 
       contents.add(dataRow); 
      } 

      return new Document(headers, contents); 
     } catch (IOException | InvalidFormatException e) { 
      throw new RuntimeException(e); 
     } 
    } 

} 

Beispiel wie man verwendet:

Parser parser = new Parser(getClass().getResourceAsStream("resource.xlsx")); 
List<DataRow> data = parser.parse().findAllWhere("FLAG", "Y"); 

Voll up Mock ist here

verfügbar Ist das, was Sie suchen? Ich muss Sie warnen, das ist keine gute Idee, das ganze Excel jedes Mal zu lesen, wenn Sie danach suchen müssen.

public static String findFirstExecute(String excelPath, String sheetName, String columnName) { 
    return findFirstValue(excelPath, sheetName, columnName, "Execute", "Y"); 
} 

public static String findFirstValue(String excelPath, String sheetName, String columnName, String filterColumnName, String filterColumnValue) { 
    try { 
     Workbook wb = WorkbookFactory.create(new FileInputStream(new File(excelPath))); 

     Sheet sheet = wb.getSheet(sheetName); 
     Iterator<Row> rows = sheet.rowIterator(); 

     Map<String, Integer> headers = new HashMap<>(); 
     if (rows.hasNext()) { 
      Row row = rows.next(); 
      for (Cell cell : row) { 
       headers.put(cell.getStringCellValue(), cell.getColumnIndex()); 
      } 
     } 

     while (rows.hasNext()) { 
      Row row = rows.next(); 
      String executeValue = row.getCell(headers.get(filterColumnName)).getStringCellValue(); 
      if (executeValue.equals(filterColumnValue)) { 
       return row.getCell(headers.get(columnName)).getStringCellValue(); 
      } 
     } 
     return null; 
    } catch (IOException | InvalidFormatException e) { 
     throw new RuntimeException(e); 
    } 
} 
+0

Hallo Rofgar, vielen Dank für den Code. – psaikia

+0

können wir nicht einfache Logik in poi wie verwenden 1 .loop die erste Zeile, um Spalte Nummer mit angegebenen Spaltennamen zu erhalten. 2. Schleife die Zeile mit der angegebenen Spalte, in der Y vorhanden ist, um die Zeilennummer zu finden. 3. dann erhalten Zelleninhalt mit Zeilen- und Spaltennummer – psaikia

+0

Sicher können Sie. Es ist nur ein Beispiel. – Rofgar

Verwandte Themen