How to insert a row between two rows in an existing excel with HSSF (Apache POI)

前端 未结 8 995
自闭症患者
自闭症患者 2020-11-27 02:38

Somehow I manage to create new rows between two rows in an existing excel file. The problem is, some of the formatting were not include along the shifting of the rows.

8条回答
  •  無奈伤痛
    2020-11-27 03:40

    Referencing Qwerty's answer, you can avoid to inflate XL size by re-using cellStyle. And when the type is CELL_TYPE_BLANK, getStringCellValue returns "" instead of null.

    private static void copyRow(Sheet worksheet, int sourceRowNum, int destinationRowNum) {
      // Get the source / new row
      Row newRow = worksheet.getRow(destinationRowNum);
      Row sourceRow = worksheet.getRow(sourceRowNum);
    
      // If the row exist in destination, push down all rows by 1 else create a new row
      if (newRow != null) {
        worksheet.shiftRows(destinationRowNum, worksheet.getLastRowNum(), 1);
      } else {
        newRow = worksheet.createRow(destinationRowNum);
      }
    
      // Loop through source columns to add to new row
      for (int i = 0; i < sourceRow.getLastCellNum(); i++) {
        // Grab a copy of the old/new cell
        Cell oldCell = sourceRow.getCell(i);
        Cell newCell = newRow.createCell(i);
    
        // If the old cell is null jump to next cell
        if (oldCell == null) {
          newCell = null;
          continue;
        }
    
        // Use old cell style
        newCell.setCellStyle(oldCell.getCellStyle());
    
        // If there is a cell comment, copy
        if (newCell.getCellComment() != null) {
          newCell.setCellComment(oldCell.getCellComment());
        }
    
        // If there is a cell hyperlink, copy
        if (oldCell.getHyperlink() != null) {
          newCell.setHyperlink(oldCell.getHyperlink());
        }
    
        // Set the cell data type
        newCell.setCellType(oldCell.getCellType());
    
        // Set the cell data value
        switch (oldCell.getCellType()) {
        case Cell.CELL_TYPE_BLANK:
          break;
        case Cell.CELL_TYPE_BOOLEAN:
          newCell.setCellValue(oldCell.getBooleanCellValue());
          break;
        case Cell.CELL_TYPE_ERROR:
          newCell.setCellErrorValue(oldCell.getErrorCellValue());
          break;
        case Cell.CELL_TYPE_FORMULA:
          newCell.setCellFormula(oldCell.getCellFormula());
          break;
        case Cell.CELL_TYPE_NUMERIC:
          newCell.setCellValue(oldCell.getNumericCellValue());
          break;
        case Cell.CELL_TYPE_STRING:
          newCell.setCellValue(oldCell.getRichStringCellValue());
          break;
        }
      }
    }
    

提交回复
热议问题