validar vacia usar poi modificar leer insertar desde descargar datos con como celdas celda java apache apache-poi

vacia - modificar excel desde java



¿Cómo obtener un valor de celda en blanco de Excel en Apache POI? (8)

Tengo un gran archivo de Excel con toneladas de columnas que se ve así:

Column1 Column2 Column3 Column4 Column5 abc def ghi mno pqr ......

Este es el código que escribí para imprimir estos valores:

try { FileInputStream inputStr = new FileInputStream(fileName); XSSFWorkbook xssfWork = new XSSFWorkbook(inputStr) ; XSSFSheet sheet1 = xssfWork.getSheetAt(0); Iterator rowItr = sheet1.rowIterator(); while ( rowItr.hasNext() ) { XSSFRow row = (XSSFRow) rowItr.next(); System.out.println("ROW:-->"); Iterator cellItr = row.cellIterator(); while ( cellItr.hasNext() ) { XSSFCell cell = (XSSFCell) cellItr.next(); System.out.println("CELL:-->"+cell.toString()); } } } catch (Exception e) { e.printStackTrace(); }

El resultado generado por este código es:

ROW:--> CELL:-->Column1 CELL:-->Column2 CELL:-->Column3 CELL:-->Column4 CELL:-->Column5 ROW:--> CELL:-->abc CELL:-->def CELL:-->ghi ROW:--> CELL:-->mno CELL:-->pqr

Entonces, si miramos el resultado anterior, podemos notar que las celdas donde dejé valores en blanco no fueron recogidas por la biblioteca de PDI, ¿hay alguna manera de que pueda obtener estos valores como nulos? o una forma de reconocer que los valores presentados saltaron las celdas en blanco?

Gracias.


Debajo está lo que funcionó para mí. El "row.CREATE_NULL_AS_BLANK" no parece ser válido, pero podría ser una falta de conocimiento de NPOI.

HSSFCell dataCell= (HSSFCell)row.GetCell(column, NPOI.SS.UserModel.MissingCellPolicy.CREATE_NULL_AS_BLANK);


Esto funcionó para mí ...

int rowNumber; int previousCell; int currentCell; int currentRowNumber; HSSFCell cell; while (rows.hasNext()) { previousCell = -1; currentCell = 0; while (cellIterator.hasNext()) { cell = (HSSFCell) cellIterator.next(); currentCell = cell.getColumnIndex(); if (previousCell == currentCell-1) { //... } else { System.out.println("Blank cell found"); } previousCell = currentCell; } }


La razón es bastante simple: los archivos de Excel pueden contener tantas filas y tantas columnas como sea posible, por lo que devolver todas las filas y columnas disponibles hará que las celdas sean enormes y requieran mucha memoria.

Suponiendo que tiene una hoja de 10x10, en Excel, no es "exactamente" 10x10, ya que puede agregar 11x10 muy fácilmente con una celda en blanco, por lo que debe POI devolver la 11ª columna?

Una forma de hacer lo que está solicitando es usar HSSFCell.getColumnIndex() .

Ejemplo:

//Assuming your have a 2 dimensional array. String[][] values = ......;// It is assigned POIFSFileSystem fileSystem = new POIFSFileSystem(new FileInputStream(fileName)); HSSFWorkbook workbook = new HSSFWorkbook(fileSystem); //Going through every worksheet. for (int sheetPos = 0; sheetPos < workbook.getNumberOfSheets(); sheetPos++) { HSSFSheet sheet = workbook.getSheetAt(sheetPos); int rowPos = 0; Iterator<Row> rows = sheet.rowIterator(); while (rows.hasNext()) { HSSFRow row = (HSSFRow) rows.next(); Iterator<Cell> cells = row.cellIterator(); while (cells.hasNext()) { HSSFCell cell = (HSSFCell) cells.next(); String value = ""; switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_NUMERIC: value = BigDecimal.valueOf(cell.getNumericCellValue()).toPlainString(); break; case HSSFCell.CELL_TYPE_STRING: value = cell.getStringCellValue(); break; case HSSFCell.CELL_TYPE_BLANK: value = ""; break; case HSSFCell.CELL_TYPE_FORMULA: value = cell.getCellFormula(); break; default: break; } values[rowPos][cell.getColumnIndex()] = value; } rowPos++; } }


Me he sentido frustrado por este mismo problema. Esto es lo que encontré con poi-3.7-20101029 y poi-3.8.

RowIterator y CellIterator no admiten iterar sobre celdas o filas NULL, solo celdas definidas físicamente (que pueden estar en BLANCO).

La solución que devuelve lo que espero requiere el uso de Row.getCell([int], Row.CREATE_NULL_AS_BLANK) , al igual que alude a la respuesta de Chavira (suponiendo 8 filas de celdas). O puede usar el valor Cell.columnIndex mientras itera para verificar si hay números que saltan ...

De manera molesta, después de crear celdas en blanco usando el método n. ° 1, los iteradores devolverán las celdas en BLANCO ahora creadas. Considero que es un error que CellIterator ignora a MissingCellPolicy.


Si desea obtener todas las celdas, no importa si existen o no, entonces el iterador no es para usted. En cambio, debe buscar manualmente las celdas apropiadas, probablemente con una política de celda faltante.

for(Row row : sheet) { for(int cn=0; cn<row.getLastCellNum(); cn++) { // If the cell is missing from the file, generate a blank one // (Works by specifying a MissingCellPolicy) Cell cell = row.getCell(cn, Row.CREATE_NULL_AS_BLANK); // Print the cell for debugging System.out.println("CELL: " + cn + " --> " + cell.toString()); } }

Hay más detalles sobre todo esto en la documentación de POI de Apache sobre cómo iterar sobre las celdas


for(org.apache.poi.ss.usermodel.Row tmp : hssfSheet){ for(int i = 0; i<8;i++){ System.out.println(tmp.getCell(i)); } }


List cellDataList = new ArrayList(); int lineNumber = 0; while (rowIterator.hasNext()) { HSSFRow hssfRow = (HSSFRow) rowIterator.next(); //System.out.println("Befor If"); lineNumber++; if(lineNumber==1){continue;} //System.out.println("Out side if "); Iterator<Cell> iterator = hssfRow.cellIterator(); List<Cell> cellTempList = new ArrayList(); int current = 0, next = 1; while (iterator.hasNext()) { Cell hssfCell = iterator.next(); current = hssfCell.getColumnIndex(); if(current<next){ System.out.println("Condition Satisfied"); } else{ int loop = current-next; System.out.println("inside else Loop value : "+(loop)); for(int k=0;k<loop+1;k++){ System.out.println("Adding nulls"); cellTempList.add(null); next = next + 1; } } cellTempList.add(hssfCell); next = next + 1; System.out.println("At End next value is : "+next); } cellDataList.add(cellTempList); }


public String[] rowToString(Row row) { Iterator<Cell> cells = row.cellIterator() ; String[] data = new String[row.getLastCellNum()] ; int previousCell = 0 ; Cell cell = cells.next() ; int currentCell = cell.getColumnIndex(); while (true) { if (previousCell == currentCell) { switch (cell.getCellType()) { case Cell.CELL_TYPE_NUMERIC: data[previousCell] = cell.getNumericCellValue()+"" ; break; case Cell.CELL_TYPE_STRING: data[previousCell] = cell.getStringCellValue() ; break; /* // there could be other cases here. case Cell.CELL_TYPE_FORMULA: data[previousCell] =eval.evaluateFormulaCell(cell); break; case Cell.CELL_TYPE_BOOLEAN: data[previousCell] = cell.getBooleanCellValue(); break; case Cell.CELL_TYPE_BLANK: data[previousCell] = ""; break; case Cell.CELL_TYPE_ERROR: data[previousCell] = "ERROR"; break; */ } if(cells.hasNext()){ cell = cells.next() ; currentCell = cell.getColumnIndex(); } else { break ; } } else { data[previousCell] = ""; } previousCell++ ; } return data ; }