2010-04-15 75 views
11

Tôi đang cố gắng tìm chỉ mục của hàng cuối cùng trong bảng tính excel bằng cách sử dụng POI của Apache cho Java.Tìm hàng cuối cùng trong bảng tính Excel

Tôi nghĩ điều này có thể xảy ra với getLastRowNum() hoặc getPhysicalNumberOfRows() nhưng dường như chúng không mang lại kết quả phù hợp. Ví dụ: tôi có bảng tính một dòng và hai hàm này trả về giá trị là 1140. Một bảng tính hai dòng khác có giá trị là 1162.

Vấn đề khác là tôi không thể chỉ tìm hàng trống đầu tiên, vì nó có thể có hàng trống giữa các hàng dữ liệu hợp lệ.

Vậy có cách nào để tìm chỉ mục của hàng cuối cùng không? Tôi cho rằng tôi có thể làm cho nó một yêu cầu không có hàng trống giữa dữ liệu, nhưng tôi đã hy vọng cho một giải pháp tốt hơn.

Chỉnh sửa: Đối với bản ghi sử dụng trình lặp không có tác dụng. Nó chỉ lặp lại trên các hàng được cho là 1140/1162.

+4

Có lý do khiến tất cả các lớp học của POI cho Excel được gọi là HSSF ... – ig0774

Trả lời

1

Tôi biết cách giải quyết vấn đề của bạn bằng VBA, nhưng tôi không biết cách lấy thông tin tương đương từ giao diện Apache POI. Trong VBA, để có được phạm vi của các tế bào sử dụng trong bảng tính "Sheet1", sử dụng:

Worksheets("Sheet1").UsedRange 

này trả về một đối tượng Range trong đó có bất động sản cung cấp thêm thông tin. Ví dụ, để có được số lượng hàng trong Range này, sử dụng:

Worksheets("Sheet1").UsedRange.Rows 

Một lần nữa, tôi không chắc chắn cho dù đây là acessible qua API POI, nhưng nếu không, có lẽ nó cung cấp một cách để thực hiện tùy ý đoạn trích của VBA?

+0

Thoạt nhìn, tôi không thấy bất kỳ điều gì tương tự với giải pháp VBA. Không quá chắc chắn về các đoạn mã thực thi của VBA. – FromCanada

7

tôi nhận được đầu ra dự kiến ​​sử dụng poi-3,6-20.091.214 và test.xls có hai hàng trống tiếp theo ba hàng chiếm:

InputStream myxls = new FileInputStream("test.xls"); 
Workbook book = new HSSFWorkbook(myxls); 
Sheet sheet = book.getSheetAt(0); 
System.out.println(sheet.getLastRowNum()); 

Output: 4

+0

Thực ra, sau khi kiểm tra lại, tôi nhận thấy rằng tôi đã nhận được kết quả chính xác trên một số bảng tính trong số hàng trăm bảng tính mà tôi đang sử dụng. Sự khác biệt duy nhất có vẻ như những người không làm việc chỉ có một bảng tính được đổi tên. Tôi đã thử nghiệm một bảng tính mới và nó đã cho kết quả đúng. Tuy nhiên, tôi không thể tạo lại lỗi bằng cách đổi tên trang tính và xóa các trang khác, nguồn gốc của sự cố vẫn chưa được biết =/ – FromCanada

+0

Bất kỳ cách nào để loại bỏ sách không phù hợp bằng cách kiểm tra sự không phù hợp? – trashgod

+0

điều này sẽ làm việc trong trường hợp bình thường .. nhưng sẽ không hoạt động khi bạn chạy mã cho cùng một excel sau khi xóa vài hàng cuối cùng ... sheet.getLastRowNum sẽ cung cấp cho số lượng hàng trước chỉ ... –

0

Bạn có thể làm điều này bằng đoạn mã sau :

SVTableModel model = new SVTableModel(sheet); 
lastRowNum = model.getRowCount(); 

Tuy nhiên, tôi đang cố thực hiện điều này trong Apache POI 3.7 nhưng không thể tìm thấy SVTableModel trong API. Điều này đã bị xóa kể từ 3.2, tôi đoán vậy.

3

bạn có thể sử dụng phương pháp sau để nhận số lượng hàng gốc.

HSSFSheet worksheet = workbook.getSheet("Role_Mapping"); 
int rowsNum = worksheet.getPhysicalNumberOfRows(); 
1

Cách duy nhất để biết chắc chắn là kiểm tra các hàng. Đây là giải pháp tôi đang sử dụng cho cùng một vấn đề:

int lastRowIndex = -1; 
if(sheet.getPhysicalNumberOfRows() > 0) 
{ 
    // getLastRowNum() actually returns an index, not a row number 
    lastRowIndex = sheet.getLastRowNum(); 

    // now, start at end of spreadsheet and work our way backwards until we find a row having data 
    for(; lastRowIndex >= 0; lastRowIndex--){ 
     Row row = sheet.getRow(lastRowIndex); 
     if(row != null){ 
      break; 
     } 
    } 
} 

Lưu ý: điều này không kiểm tra các hàng có vẻ trống nhưng không, chẳng hạn như các ô có chuỗi trống trong chúng. Cho rằng, bạn cần một giải pháp hoàn chỉnh hơn như:

private int determineRowCount() 
{ 
    this.evaluator = workbook.getCreationHelper().createFormulaEvaluator(); 
    this.formatter = new DataFormatter(true); 

    int lastRowIndex = -1; 
    if(sheet.getPhysicalNumberOfRows() > 0) 
    { 
     // getLastRowNum() actually returns an index, not a row number 
     lastRowIndex = sheet.getLastRowNum(); 

     // now, start at end of spreadsheet and work our way backwards until we find a row having data 
     for(; lastRowIndex >= 0; lastRowIndex--) 
     { 
      Row row = sheet.getRow(lastRowIndex); 
      if(!isRowEmpty(row)) 
      { 
       break; 
      } 
     } 
    } 
    return lastRowIndex; 
} 

/** 
* Determine whether a row is effectively completely empty - i.e. all cells either contain an empty string or nothing. 
*/ 
private boolean isRowEmpty(Row row) 
{ 
    if(row == null){ 
     return true; 
    } 

    int cellCount = row.getLastCellNum() + 1; 
    for(int i = 0; i < cellCount; i++){ 
     String cellValue = getCellValue(row, i); 
     if(cellValue != null && cellValue.length() > 0){ 
      return false; 
     } 
    } 
    return true; 
} 

/** 
* Get the effective value of a cell, formatted according to the formatting of the cell. 
* If the cell contains a formula, it is evaluated first, then the result is formatted. 
* 
* @param row the row 
* @param columnIndex the cell's column index 
* @return the cell's value 
*/ 
private String getCellValue(Row row, int columnIndex) 
{ 
    String cellValue; 
    Cell cell = row.getCell(columnIndex); 
    if(cell == null){ 
     // no data in this cell 
     cellValue = null; 
    } 
    else{ 
     if(cell.getCellType() != Cell.CELL_TYPE_FORMULA){ 
      // cell has a value, so format it into a string 
      cellValue = this.formatter.formatCellValue(cell); 
     } 
     else { 
      // cell has a formula, so evaluate it 
      cellValue = this.formatter.formatCellValue(cell, this.evaluator); 
     } 
    } 
    return cellValue; 
} 
-2
int total = sheet.getPhysicalNumberOfRows() - sheet.getLastRowNum(); 
+1

Câu hỏi được yêu cầu cho chỉ mục của hàng cuối cùng. Điều này xuất hiện để có được chỉ mục của hàng đầu tiên, và không thể giải thích nó cho một biến có tên là "tổng". –

0

tôi đã cùng một vấn đề trước.Tôi sử dụng thủ thuật này để nhận được giá trị hàng trả về đúng:

  1. Mở tệp excel và đi bảng mong muốn.
  2. Chọn hàng cuối cùng + 1. Ví dụ: bạn có 12 hàng có dữ liệu, sau đó nhấp vào hàng 13 rồi cuộn xuống hàng 2000. Hãy đảm bảo rằng tất cả các hàng được chọn.
  3. R-nhấp vào hàng đã chọn và chọn Xóa.
  4. Chạy lại mã và kiểm tra giá trị trả lại.

Đây không phải là vấn đề của thư viện POI.

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