poi leer example desde java apache excel row apache-poi

java - leer - Eliminar una fila de una hoja de Excel con Apache POI HSSF



apache poi excel java (7)

Estoy usando la biblioteca Apache POi HSSF para importar información en mi aplicación. El problema es que los archivos tienen algunas filas adicionales / vacías que deben eliminarse primero antes de analizar.

No hay un HSSFSheet.removeRow( int rowNum ) . Solo removeRow( HSSFRow row ) . El problema con esto es que las filas vacías no se pueden eliminar. Por ejemplo:

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

da una NullPointerException en filas vacías porque getRow() devuelve null. Además, cuando leo en los foros, removeRow() solo borra el contenido de la celda, pero la fila sigue allí como una fila vacía.

¿Hay alguna manera de eliminar filas (vacías o no) sin crear una hoja nueva sin las filas que quiero eliminar?


Algo a lo largo de las líneas de

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

debería hacer el truco.


El HSSFRow tiene un método llamado setRowNum(int rowIndex) .

Cuando tiene que "eliminar" una fila, coloca ese índice en una List . Luego, cuando llegue a la siguiente fila no vacía, tome un índice de esa lista y setRowNum() llamando a setRowNum() y elimine el índice de esa lista. (O puede usar una cola)


Esta respuesta es una extensión de la respuesta de AndreAY, que le da una función completa al eliminar una fila.

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


Intento volver a las profundidades de mi cerebro para mi experiencia relacionada con PDI de hace un año o dos, pero mi primera pregunta sería: ¿por qué las filas deben eliminarse antes de analizar? ¿Por qué no sheet.getRow(rowNum) el resultado nulo de la sheet.getRow(rowNum) y sheet.getRow(rowNum) adelante?


Lo sé, esta es una pregunta de 3 años, pero tuve que resolver el mismo problema recientemente, y tuve que hacerlo en C #. Y aquí está la función que estoy usando con 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); } }


Mi caso especial (funcionó para mí):

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


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