Подтвердить что ты не робот

Удаление строки из листа Excel с помощью Apache POI HSSF

Я использую библиотеку Apache POi HSSF для импорта информации в мое приложение. Проблема в том, что в файлах есть несколько лишних/пустых строк, которые необходимо удалить перед разбором.

Нет метода HSSFSheet.removeRow( int rowNum ). Только removeRow( HSSFRow row ). Проблема с этим в том, что пустые строки не могут быть удалены. Например:

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

дает исключение NullPointerException в пустых строках, потому что getRow() возвращает значение null. Кроме того, когда я читал на форумах, removeRow() только стирает содержимое ячеек, но строка все еще присутствует как пустая строка.

Есть ли способ удаления строк (пустой или нет) без создания всего нового листа без строк, которые я хочу удалить?

4b9b3361

Ответ 1

 /**
 * 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);
        }
    }
}

Ответ 2

Я знаю, это 3-летний вопрос, но мне пришлось решить ту же проблему в последнее время, и мне пришлось это делать на С#. И вот функция, которую я использую с 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);
        }
    }

Ответ 3

HSSFRow имеет метод setRowNum(int rowIndex).

Когда вам нужно "удалить" строку, вы поместите этот индекс в List. Затем, когда вы переходите к следующей строке непустой, вы берете индекс из этого списка и устанавливаете его, вызывающий setRowNum(), и удаляете индекс из этого списка. (Или вы можете использовать очередь)

Ответ 4

Что-то вдоль линий

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

должен сделать трюк.

Ответ 5

Мой специальный случай (он работал у меня):

    //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);
                }
              }
            }
          }
        }
      }
    }

Ответ 6

Я пытаюсь вернуться в глубины своего мозга для моего опыта, связанного с POI, через год или два назад, но мой первый вопрос: зачем нужно удалять строки перед разбором? Почему бы вам просто не уловить нулевой результат из вызова sheet.getRow(rowNum) и перейти?

Ответ 7

Этот ответ является расширением для ответа AndreAY, предоставляя вам полную функцию при удалении строки.

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;
}