2011-02-08 50 views
34

Tôi có một file excel rất lớn với tấn của các cột mà trông như thế này: -Cách lấy Giá trị Ô trống Excel trong Apache POI?

Column1 Column2 Column3 Column4 Column5 
abc    def    ghi 
     mno    pqr 
...... 

Đây là mã mà tôi đã viết để in các giá trị:

try { 
    FileInputStream inputStr = new FileInputStream(fileName); 
    XSSFWorkbook xssfWork = new XSSFWorkbook(inputStr) ; 
    XSSFSheet sheet1 = xssfWork.getSheetAt(0); 
    Iterator rowItr = sheet1.rowIterator(); 

    while (rowItr.hasNext()) { 
     XSSFRow row = (XSSFRow) rowItr.next(); 
     System.out.println("ROW:-->"); 
     Iterator cellItr = row.cellIterator(); 

     while (cellItr.hasNext()) { 
      XSSFCell cell = (XSSFCell) cellItr.next(); 
      System.out.println("CELL:-->"+cell.toString()); 
     } 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

Sản lượng được tạo ra bởi mã này là: -

ROW:--> 
CELL:-->Column1 
CELL:-->Column2 
CELL:-->Column3 
CELL:-->Column4 
CELL:-->Column5 
ROW:--> 
CELL:-->abc 
CELL:-->def 
CELL:-->ghi 
ROW:--> 
CELL:-->mno 
CELL:-->pqr 

Vì vậy, nếu chúng tôi xem xét đầu ra ở trên, chúng tôi có thể lưu ý rằng các ô mà tôi để thư viện POI không nhận được giá trị trống một cách mà tôi có thể nhận được các giá trị này là null. hoặc một cách để nhận ra rằng các giá trị được trình bày bỏ qua các ô trống?

Cảm ơn.

Trả lời

1
 for(org.apache.poi.ss.usermodel.Row tmp : hssfSheet){ 
      for(int i = 0; i<8;i++){ 
       System.out.println(tmp.getCell(i)); 
      }    
     } 
+0

ông đang sử dụng XSSF để mở một tệp XLSX (2007+). HSSF sẽ không giải quyết vấn đề của mình. –

9

Tôi đã thất vọng bởi cùng một vấn đề này. Dưới đây là những gì tôi tìm thấy với poi-3.7-20101029 và poi-3.8.

RowIterator và CellIterator không hỗ trợ lặp qua các ô hoặc hàng NULL - chỉ các ô được xác định vật lý (có thể là BLANK).

Giải pháp trả về những gì tôi mong đợi yêu cầu sử dụngdựa trên 0, giống như câu trả lời của Chavira ám chỉ đến (giả sử 8 hàng ô). Hoặc bạn có thể sử dụng giá trị Cell.columnIndex trong khi lặp lại để kiểm tra số nhảy ...

Khó chịu, sau khi tạo ô trống bằng phương pháp # 1, trình lặp sẽ trả về ô BLANK hiện được tạo. Tôi coi nó là một lỗi mà MissingCellPolicy bị bỏ qua bởi CellIterator.

+1

Ran vào cùng một vấn đề và sử dụng cách tiếp cận chỉ mục dựa trên 0 (không thông qua foreach) và CREAT_NULL_AS_BLANK MissingRowPolicy đã làm việc cho tôi. – fimez

+1

Tuyệt vời. Có thể xác nhận điều này cũng hoạt động trong POI 3.8. – javatestcase

51

Nếu bạn muốn nhận tất cả các ô, bất kể chúng có tồn tại hay không, thì trình vòng lặp không dành cho bạn. Thay vào đó, bạn cần phải tự lấy các tế bào thích hợp, có khả năng với một chính sách di động thiếu

for(Row row : sheet) { 
    for(int cn=0; cn<row.getLastCellNum(); cn++) { 
     // If the cell is missing from the file, generate a blank one 
     // (Works by specifying a MissingCellPolicy) 
     Cell cell = row.getCell(cn, Row.CREATE_NULL_AS_BLANK); 
     // Print the cell for debugging 
     System.out.println("CELL: " + cn + " --> " + cell.toString()); 
    } 
} 

Có thêm chi tiết về tất cả điều này trong the Apache POI documentation on iterating over cells

+0

Phương thức 'row.getCell()' không được chấp nhận. –

+3

Nó thực sự thực sự không phải là .... – Gagravarr

+2

Đó là 'row.getCell (viết tắt)' bị từ chối. Lấy làm tiếc. –

3

Lý do khá đơn giản: các file Excel có thể chứa nhiều hàng và càng nhiều cột càng tốt, do đó, trả về tất cả các hàng trống và cột trống sẽ làm cho các ô lớn và bộ nhớ tập trung.

Giả sử bạn có trang tính 10x10, trong Excel, nó không phải là "chính xác" 10x10 vì bạn có thể thêm 11x10 rất dễ dàng với ô trống, vì vậy POI có nên trả lại cột thứ 11 không?

Một cách để thực hiện những gì bạn yêu cầu là sử dụng HSSFCell.getColumnIndex().

Ví dụ:

//Assuming your have a 2 dimensional array. 
String[][] values = ......;// It is assigned 

POIFSFileSystem fileSystem = new POIFSFileSystem(new FileInputStream(fileName)); 
HSSFWorkbook workbook = new HSSFWorkbook(fileSystem); 

//Going through every worksheet. 
for (int sheetPos = 0; sheetPos < workbook.getNumberOfSheets(); sheetPos++) { 
    HSSFSheet sheet = workbook.getSheetAt(sheetPos); 

    int rowPos = 0; 
    Iterator<Row> rows = sheet.rowIterator(); 
    while (rows.hasNext()) { 
     HSSFRow row = (HSSFRow) rows.next(); 

     Iterator<Cell> cells = row.cellIterator(); 
     while (cells.hasNext()) { 
      HSSFCell cell = (HSSFCell) cells.next(); 
      String value = ""; 

      switch (cell.getCellType()) { 
       case HSSFCell.CELL_TYPE_NUMERIC: 
        value = BigDecimal.valueOf(cell.getNumericCellValue()).toPlainString(); 
        break; 

       case HSSFCell.CELL_TYPE_STRING: 
        value = cell.getStringCellValue(); 
        break; 

       case HSSFCell.CELL_TYPE_BLANK: 
        value = ""; 
        break; 

       case HSSFCell.CELL_TYPE_FORMULA: 
        value = cell.getCellFormula(); 
        break; 

       default: 
        break; 
      } 

      values[rowPos][cell.getColumnIndex()] = value; 
     } 

     rowPos++; 
    } 
} 
+0

Row.getCell (int) ** không được dùng nữa **! Không có ý tưởng tại sao bạn nghĩ rằng, nhưng tôi có thể đảm bảo với bạn rằng nó không phải là - xem [JavaDocs] (http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Row.html# getCell (int)) cho bằng chứng. – Gagravarr

+0

@Gagravarr, xin lỗi, đó là 'Row.getCell (viết tắt) 'bị từ chối. –

0

này làm việc cho tôi ....

int rowNumber; 
int previousCell; 
int currentCell; 
int currentRowNumber; 
HSSFCell cell; 

while (rows.hasNext()) { 
    previousCell = -1; 
    currentCell = 0; 
    while (cellIterator.hasNext()) { 
     cell = (HSSFCell) cellIterator.next(); 
     currentCell = cell.getColumnIndex(); 
     if (previousCell == currentCell-1) { 
      //... 
     } 
     else { 
      System.out.println("Blank cell found"); 
     } 
     previousCell = currentCell; 
    } 
} 
1

Dưới đây là những gì làm việc cho tôi. "Row.CREATE_NULL_AS_BLANK" có vẻ không hợp lệ nhưng có thể thiếu kiến ​​thức NPOI.

HSSFCell dataCell= (HSSFCell)row.GetCell(column, NPOI.SS.UserModel.MissingCellPolicy.CREATE_NULL_AS_BLANK); 
+3

NPOI? Nếu bạn đang sử dụng cổng POI .net, bất kỳ số thứ nào có thể khác nhau;) – Leigh

0
List cellDataList = new ArrayList(); 

int lineNumber = 0; 

while (rowIterator.hasNext()) { 
    HSSFRow hssfRow = (HSSFRow) rowIterator.next(); 
    //System.out.println("Befor If"); 
    lineNumber++; 
    if(lineNumber==1){continue;} 
    //System.out.println("Out side if "); 

    Iterator<Cell> iterator = hssfRow.cellIterator(); 
    List<Cell> cellTempList = new ArrayList(); 
    int current = 0, next = 1; 
    while (iterator.hasNext()) { 
     Cell hssfCell = iterator.next(); 
     current = hssfCell.getColumnIndex(); 

     if(current<next){ 
      System.out.println("Condition Satisfied"); 
     } 
     else{ 
      int loop = current-next; 
      System.out.println("inside else Loop value : "+(loop)); 
      for(int k=0;k<loop+1;k++){ 
      System.out.println("Adding nulls"); 
      cellTempList.add(null); 
      next = next + 1; 
      } 
     } 

     cellTempList.add(hssfCell); 

     next = next + 1; 
     System.out.println("At End next value is : "+next); 
    } 
    cellDataList.add(cellTempList); 
} 
0
public String[] rowToString(Row row) 
{ 
    Iterator<Cell> cells = row.cellIterator() ; 
    String[] data = new String[row.getLastCellNum()] ; 

    int previousCell = 0 ; 

    Cell cell = cells.next() ; 
    int currentCell = cell.getColumnIndex(); 

    while (true) 
    { 
     if (previousCell == currentCell) { 
      switch (cell.getCellType()) { 
       case Cell.CELL_TYPE_NUMERIC: 
        data[previousCell] = cell.getNumericCellValue()+"" ; 
        break; 
       case Cell.CELL_TYPE_STRING: 
        data[previousCell] = cell.getStringCellValue() ; 
        break; 
        /* // there could be other cases here. 
        case Cell.CELL_TYPE_FORMULA: 
         data[previousCell] =eval.evaluateFormulaCell(cell); 
         break; 
        case Cell.CELL_TYPE_BOOLEAN: 
         data[previousCell] = cell.getBooleanCellValue(); 
         break; 
        case Cell.CELL_TYPE_BLANK: 
         data[previousCell] = ""; 
         break; 
        case Cell.CELL_TYPE_ERROR: 
         data[previousCell] = "ERROR"; 
         break; 
        */ 
      } 
      if(cells.hasNext()){ 
       cell = cells.next() ; 
       currentCell = cell.getColumnIndex(); 
      } else { 
       break ; 
      } 

     } else { 
      data[previousCell] = ""; 
     } 
     previousCell++ ; 

    } 

    return data ; 

} 
+0

vui lòng thêm nhận xét vào câu trả lời của bạn – dlavila

+1

bạn nên thêm các nhận xét và giải thích vào bài viết bên dưới, ngoài ra, hãy xem năm của Câu hỏi – dlavila

+0

Phương pháp này biến đổi một hàng excel trong một mảng các chuỗi, mà không bỏ qua các giá trị ô trống hoặc trống (giá trị mảng tương ứng sẽ chỉ có một chuỗi rỗng trong trường hợp này). – Albe

Các vấn đề liên quan