2013-04-26 56 views
29

Các bạn hiện đang sử dụng thư viện POI 3.9 để làm việc với các tệp excel. Tôi biết về hàm getLastRowNum(), trả về một số hàng trong tệp Excel.Làm cách nào để lấy số lượng hàng trong tệp Excel bằng thư viện POI?

Vấn đề duy nhất là getLastRowNum() trả về một số với số lượng bắt đầu từ 0.

Vì vậy, nếu một file Excel sử dụng 3 hàng đầu tiên, getLastRowNum() lợi nhuận 2. Nếu một file Excel chỉ có 1 hàng, getLastRowNum() lợi nhuận 0.

Sự cố xảy ra khi tệp Excel hoàn toàn trống. getLastRowNum() vẫn trả về 0, vì vậy tôi không thể xác định xem tệp Excel có 1 hàng dữ liệu hay không.

Vậy làm cách nào tôi có thể phát hiện xem tệp Excel có trống không?

Trả lời

55
+5

+1 Marcias. Chỉ cần rằng nếu một trong những xóa các tế bào bằng cách chỉ cần nhấn Delete, sau đó có vẻ như hàng vẫn tồn tại thể chất và số lượng cũ được trả lại. – anujin

+1

Vâng, tôi nghĩ rằng nếu bạn muốn đếm các hàng thực sự có một số giá trị không trống, bạn sẽ cần tự mình lặp lại nó. Tôi không chắc chắn, nhưng tôi hiểu rằng phương thức này trả về số hàng đã từng được "khai báo". – macias

+1

CẢNH BÁO: Nếu trang tính có hàng trống thì getPhysicalNumberOfRows không bao gồm chúng trong số đếm nó trả về. Tuy nhiên, getLastRowNum cũng thực hiện chính xác những gì nó nói trên tin.Vì vậy, để lặp qua tất cả các hàng bạn cần sử dụng getLastRowNum + 1 làm giới hạn trên trong vòng lặp lặp của bạn - hãy cẩn thận xử lý các hàng có thể không tồn tại. –

2

Nếu bạn làm một tấm séc

if 
(getLastRowNum()<1){ 
res="Sheet Cannot be empty"; 
return 
} 

Điều này sẽ đảm bảo bạn có ít nhất một dòng với dữ liệu ngoại trừ tiêu đề. Dưới đây là chương trình của tôi hoạt động tốt. Tệp Excel có ba cột. ID, NAME, LASTNAME

XSSFWorkbook workbook = new XSSFWorkbook(inputstream); 
     XSSFSheet sheet = workbook.getSheetAt(0); 
     Row header = sheet.getRow(0); 
     int n = header.getLastCellNum(); 
     String header1 = header.getCell(0).getStringCellValue(); 
     String header2 = header.getCell(1).getStringCellValue(); 
     String header3 = header.getCell(2).getStringCellValue(); 
     if (header1.equals("ID") && header2.equals("NAME") 
       && header3.equals("LASTNAME")) { 
      if(sheet.getLastRowNum()<1){ 
       System.out.println("Sheet empty"); 
         return; 
      } 
         iterate over sheet to get cell values 
     }else{ 
          SOP("invalid format"); 
          return; 
          } 
+1

[tài liệu] (https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFSheet.html#getLastRowNum) lưu ý rằng nó không dựa trên. Vì vậy, 'getLastRowNum()' sẽ trả về 0 cho khi không có cột hoặc khi chỉ có 1 (tiêu đề trong trường hợp của bạn). Vì vậy, để kiểm tra nếu có bất kỳ hàng 'getPhysicalNumberOfRows()' cũng nên được sử dụng. –

+0

cũng là [tài liệu bảng HSSF] (https://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFSheet.html#getLastRowNum()) có thêm một số nội dung liên quan đến chủ đề này. –

1

Có hai điều bạn có thể làm

sử dụng

int noOfColumns = sh.getRow(0).getPhysicalNumberOfCells(); 

hoặc

int noOfColumns = sh.getRow(0).getLastCellNum(); 

Có một sự khác biệt tinh tế giữa họ

  1. Tùy chọn 1 cho biết không có cột nào thực sự chứa đầy nội dung (Nếu cột thứ 2 của 10 cột không được lấp đầy, bạn sẽ nhận được 9)

  2. Tùy chọn 2 chỉ cung cấp cho bạn chỉ mục cột cuối cùng. Do đó thực hiện 'getLastCellNum()'

1

Kể từ Sheet.getPhysicalNumberOfRows() không đếm hàng trống rỗng và Sheet.getLastRowNum() trả về 0 cả hai nếu có một hàng hoặc không có hàng, tôi sử dụng một sự kết hợp của hai phương pháp để tính toán chính xác tổng số hàng.

int rowTotal = sheet.getLastRowNum(); 

if ((rowTotal > 0) || (sheet.getPhysicalNumberOfRows() > 0)) { 
    rowTotal++; 
} 

Lưu ý: Điều này sẽ xử lý bảng tính với một hàng trống không có nhưng đối với hầu hết các mục đích, điều này có thể không sao.

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