2009-12-02 26 views
23

Tôi đang sử dụng thư viện Apache POi HSSF để nhập thông tin vào ứng dụng của mình. Vấn đề là các tệp có một số hàng thừa/trống cần được loại bỏ trước khi phân tích cú pháp.Xóa một hàng khỏi trang tính Excel với Apache POI HSSF

Không có phương thức HSSFSheet.removeRow(int rowNum). Chỉ removeRow(HSSFRow row). Vấn đề với điều này nó là hàng trống không thể được gỡ bỏ. Ví dụ:

sheet.removeRow(sheet.getRow(rowNum)); 

cho NullPointerChẩn đoán trên hàng trống vì getRow() trả về giá trị rỗng. Ngoài ra, khi tôi đọc trên diễn đàn, removeRow() chỉ xóa nội dung ô nhưng hàng vẫn ở đó dưới dạng hàng trống.

Có cách nào xóa hàng (trống hay không) mà không cần tạo một trang tính hoàn toàn mới không có hàng mà tôi muốn xóa?

Trả lời

0

Tôi đang cố gắng tiếp cận sâu trong não của mình để có kinh nghiệm liên quan đến POI từ một hoặc hai năm trước, nhưng câu hỏi đầu tiên của tôi là: tại sao các hàng cần phải được loại bỏ trước khi phân tích cú pháp? Tại sao bạn không chỉ thu được kết quả rỗng từ cuộc gọi sheet.getRow(rowNum) và tiếp tục?

+0

Vì tôi đã thực hiện phân tích cú pháp cho tệp Excel được định dạng dưới dạng bảng đơn giản (tên cột ở hàng đầu tiên và dữ liệu bên dưới) và tôi cần cảnh báo người dùng nếu có hàng trống. Ngoài ra, các tệp mà tôi muốn nhập bây giờ là từ một ứng dụng khác và có rất nhiều hàng bổ sung (trống hoặc không) chỉ để làm cho tệp trông đẹp hơn! – fmaste

+0

OK - Tuy nhiên, tôi chỉ muốn nói rằng bạn có thể được phục vụ tốt để phân lớp trình phân tích cú pháp hiện tại của bạn và để cho lớp con của bạn bỏ qua các hàng trống thay vì làm điều gì đó với chúng; theo cách đó, các tệp từ ứng dụng khác vẫn có thể trông đẹp và bạn không phải chết trên các tệp đó. :) – delfuego

+0

Có. Tôi cũng nghĩ về điều đó. Nhưng tệp có những thứ như: một hàng chỉ cho cột đầu tiên (id) và phần còn lại của các cột trong hàng bên dưới. Chỉ vì nó trông đẹp hơn. Tôi cần phải làm cho nó một hàng duy nhất và xóa một. Tôi nghĩ rằng tôi sẽ tạo một lớp có chứa một trang tính và danh sách các chỉ mục hàng và xóa các chỉ mục khi tôi xóa một hàng. Của nó đến nhiều, nhưng tôi cần phải xóa hàng, tôi không hiểu tại sao bạn không thể xóa hàng với thư viện này! – fmaste

3

HSSFRow có phương thức được gọi là setRowNum(int rowIndex).

Khi bạn phải "xóa" một hàng, bạn đặt chỉ mục đó trong một số List. Sau đó, khi bạn đến hàng tiếp theo không trống, bạn lấy chỉ mục từ danh sách đó và đặt nó là gọi setRowNum() và xóa chỉ mục khỏi danh sách đó. (Hoặc bạn có thể sử dụng một hàng đợi)

2

cái gì đó dọc theo dòng của

int newrownum=0; 
for (int i=0; i<=sheet.getLastRowNum(); i++) { 
    HSSFRow row=sheet.getRow(i); 
    if (row) row.setRowNum(newrownum++); 
} 

nên làm các trick.

24
/** 
* Remove a row by its index 
* @param sheet a Excel sheet 
* @param rowIndex a 0 based index of removing row 
*/ 
public static void removeRow(HSSFSheet sheet, int rowIndex) { 
    int lastRowNum=sheet.getLastRowNum(); 
    if(rowIndex>=0&&rowIndex<lastRowNum){ 
     sheet.shiftRows(rowIndex+1,lastRowNum, -1); 
    } 
    if(rowIndex==lastRowNum){ 
     HSSFRow removingRow=sheet.getRow(rowIndex); 
     if(removingRow!=null){ 
      sheet.removeRow(removingRow); 
     } 
    } 
} 
+1

giải pháp này không hoạt động trong trường hợp xóa nhiều hàng. – gospodin

+0

@gospodin - Chạy mã bên trong trong một vòng lặp và đừng quên giảm rowIndex truy cập 1 mỗi lần bạn xóa một hàng. – Avik

+1

Hiện tại, có lỗi trong POI sẽ ném> org.apache.xmlbeans.impl.values.XmlValueDisconnectedException beermann

6

Tôi biết, đây là câu hỏi 3 năm cũ, nhưng tôi phải giải quyết vấn đề tương tự gần đây và tôi phải làm điều đó trong C#. Và đây là chức năng Tôi đang sử dụng với NPOI, Net 4,0

public static void DeleteRow(this ISheet sheet, IRow row) 
    { 
     sheet.RemoveRow(row); // this only deletes all the cell values 

     int rowIndex = row.RowNum; 

     int lastRowNum = sheet.LastRowNum; 

     if (rowIndex >= 0 && rowIndex < lastRowNum) 
     { 
      sheet.ShiftRows(rowIndex + 1, lastRowNum, -1); 
     } 
    } 
1

trường hợp đặc biệt của tôi (nó làm việc cho tôi):

//Various times to delete all the rows without units 
    for (int j=0;j<7;j++) { 
     //Follow all the rows to delete lines without units (and look for the TOTAL row) 
     for (int i=1;i<sheet.getLastRowNum();i++) { 
     //Starting on the 2nd row, ignoring first one 
     row = sheet.getRow(i); 
     cell = row.getCell(garMACode); 
     if (cell != null) 
     { 
      //Ignore empty rows (they have a "." on first column) 
      if (cell.getStringCellValue().compareTo(".") != 0) { 
      if (cell.getStringCellValue().compareTo("TOTAL") == 0) { 
       cell = row.getCell(garMAUnits+1); 
       cell.setCellType(HSSFCell.CELL_TYPE_FORMULA); 
       cell.setCellFormula("SUM(BB1" + ":BB" + (i - 1) + ")"); 
      } else { 
       cell = row.getCell(garMAUnits); 
       if (cell != null) { 
       int valor = (int)(cell.getNumericCellValue()); 
       if (valor == 0) { 
        //sheet.removeRow(row); 
        removeRow(sheet,i); 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
0

Câu trả lời này là một phần mở rộng hơn câu trả lời AndreAY của, Đem lại cho bạn hoàn thành chức năng xóa một hàng.

public boolean deleteRow(String sheetName, String excelPath, int rowNo) throws IOException { 

    XSSFWorkbook workbook = null; 
    XSSFSheet sheet = null; 

    try { 
     FileInputStream file = new FileInputStream(new File(excelPath)); 
     workbook = new XSSFWorkbook(file); 
     sheet = workbook.getSheet(sheetName); 
     if (sheet == null) { 
      return false; 
     } 
     int lastRowNum = sheet.getLastRowNum(); 
     if (rowNo >= 0 && rowNo < lastRowNum) { 
      sheet.shiftRows(rowNo + 1, lastRowNum, -1); 
     } 
     if (rowNo == lastRowNum) { 
      XSSFRow removingRow=sheet.getRow(rowNo); 
      if(removingRow != null) { 
       sheet.removeRow(removingRow); 
      } 
     } 
     file.close(); 
     FileOutputStream outFile = new FileOutputStream(new File(excelPath)); 
     workbook.write(outFile); 
     outFile.close(); 


    } catch(Exception e) { 
     throw e; 
    } finally { 
     if(workbook != null) 
      workbook.close(); 
    } 
    return false; 
} 
Các vấn đề liên quan