Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > JAVA y EXCEL 2007

Hola,

estoy refaccionando mi codigo que lee archivos excel 2003 para que lea excel 2007 por lo tanto he tenido que utilizar POI 3.9, el problema que tengo es a la hora de querer saber cuantas (cantidad) de filas existen en el archivo excel leido.
en mi "viejo" codigo se obtenia de la siguiente manera:

(utilizando libreria jxl)
cantCamposCordY = objetoExcel.getSheet(0).getRows();

alguna idea de como obtengo la cantidad de filas de una hoja excel utilizando la libreria POI 3.9 ??

diciembre 29, 2012 | Registered Commenterdmorales

Un suponer:

FileInputStream fileInputStream = new FileInputStream("archivo.xls");
HSSFWorkbook workbook = new HSSFWorkbook(fileInputStream);
HSSFSheet worksheet = workbook.getSheet("archivo");
int nrows= worksheet .getLastRowNum();

Una buena fuente de respuestas: http://stackoverflow.com/questions/tagged/apache-poi

Usando JavaSE 1.7 el input stream se puede obtener mediante:

http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#newInputStream(java.nio.file.Path, java.nio.file.OpenOption...)

que incluye try-with-resources con AutoCloseable:

http://docs.oracle.com/javase/7/docs/api/java/lang/AutoCloseable.html

diciembre 29, 2012 | Registered Commenterchoces

De los Javadocs de POI

org.apache.poi.hssf.usermodel
Class HSSFSheet

getLastRowNum

public int getLastRowNum()
Gets the number last row on the sheet. Owing to idiosyncrasies in the excel file format, if the result of calling this method is zero, you can't tell if that means there are zero rows on the sheet, or one at position zero. For that case, additionally call getPhysicalNumberOfRows() to tell if there is a row at position zero or not.
Specified by:
getLastRowNum in interface Sheet
Returns:
the number of the last row contained in this sheet, zero based.

getPhysicalNumberOfRows

public int getPhysicalNumberOfRows()
Returns the number of physically defined rows (NOT the number of rows in the sheet)
Specified by:
getPhysicalNumberOfRows in interface Sheet
Returns:
the number of physically defined rows in this sheet

diciembre 29, 2012 | Registered Commenterchoces

Por lo que leo lo que debo utilizar es getPhysicalNumberOfRows (me quedaria probar que pasaria si para una fila determinada esa celda esta vacia pero el resto de las columnas tienen datos) contaria la cantidad hasta dicha fila ? o seguiria contando el resto de filas ? Es necesariamente deba haber dato para que se tome en cuenta ?

Gracias Choces

diciembre 30, 2012 | Registered Commenterdmorales

Creo que se puede utilizar así:

int nrows= worksheet .getLastRowNum();
if(nrows == 0 && getPhysicalNumberOfRows() != 0 ){
nrows = 1;
}

Supongo que la información sobre las filas la obtiene de los datos del archivo Excel, y que el número de filas depende de que haya datos en alguna columna de cada fila.
El problema es que el método getLastRowNum() puede devolver un valor 0, y sin embargo haber una fila definida, con datos en alguna columna. Por eso recomiendan verificarlo con getPhysicalNumberOfRows().

diciembre 30, 2012 | Registered Commenterchoces

si la razon la habia entendido, me viene bien el ejemplo de codigo que pones.
Voy a probarlo luego "posteo" comentando como me fue......
nuevamente gracias Choces.

diciembre 30, 2012 | Registered Commenterdmorales

algo previo a probar lo que hablamos,
estoy utilizando el siguiente codigo:
para luego utilizarlo de la siguiente manera :
FileInputStream fileInputStream = new FileInputStream(file);
HSSFWorkbook objetoExcel = new HSSFWorkbook(fileInputStream);

HSSFSheet worksheet = objetoExcel.getSheet("file");

//Tamanio de planilla excel
int cantCamposCordY;
cantCamposCordY = worksheet.getLastRowNum();

me lanza la siguiente excepcion:

Exception in thread "AWT-EventQueue-0" org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)

por lo que entiendo necesito utilizar XSSF y no HSSF bueno intento importar : import org.apache.poi.ss.usermodel.*;
y cambiar a XSSF pero no logro conseguir que funcione, no me reconoce XSSFWorkbook por ejemplo.

enero 3, 2013 | Registered Commenterdmorales

estoy intentando leer un archivo excel 2007 (extension xlsx)

enero 3, 2013 | Registered Commenterdmorales

¿Usas esta construcción?

// XSSFWorkbook, File
OPCPackage pkg = OPCPackage.open(new File("file.xlsx"));
XSSFWorkbook wb = new XSSFWorkbook(pkg);
....
pkg.close();

// XSSFWorkbook, InputStream, needs more memory
OPCPackage pkg = OPCPackage.open(myInputStream);
XSSFWorkbook wb = new XSSFWorkbook(pkg);
....
pkg.close();

http://poi.apache.org/spreadsheet/quick-guide.html

enero 3, 2013 | Registered Commenterchoces

Un ejemplo más completo:

FileInputStream fis = null;
try {
fis = new FileInputStream("C://miExcel.xlsx");
XSSFWorkbook wb = new XSSFWorkbook(fis);
XSSFSheet sheet = wb.getSheetAt(0);
Iterator rows = sheet.rowIterator();
while (rows.hasNext())
{
XSSFRow row = ((XSSFRow) rows.next());
Iterator cells = row.cellIterator();
while(cells.hasNext())
{
XSSFCell cell = (XSSFCell) cells.next();
String result=cell.getStringCellValue();
System.out.println(result);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
fis.close();
}
}

enero 3, 2013 | Registered Commenterchoces

Tal vez este ejemplo sea más claro:

InputStream inputStream = new FileInputStream(destDir);
POIFSFileSystem fileSystem = new POIFSFileSystem(inputStream);
XSSFWorkbook workBook = new XSSFWorkbook(salesFileName);
XSSFSheet sheet = workBook.getSheetAt(0);
totalRows = sheet.getPhysicalNumberOfRows();
System.out.println("total no of rows >>>>"+totalRows);

enero 3, 2013 | Registered Commenterchoces

no me reconoce la clase XSSFWorkbook no logro importarla para utilizar. estoy con poi-3.9-20121203

enero 3, 2013 | Registered Commenterdmorales

Que cosa más rara. Está en los Javadocs de esa versión:

org.apache.poi.xssf.usermodel
Class XSSFWorkbook

java.lang.Object
org.apache.poi.POIXMLDocumentPart
org.apache.poi.POIXMLDocument
org.apache.poi.xssf.usermodel.XSSFWorkbook

¿Has incluido también, en las dependencias externas, las librerías de la carpeta ooxml-lib?
Aparte de las librerías poi-ooxml.xxxx de la carpeta raíz de la distribución. No sé si con estas últimas será suficiente.

enero 3, 2013 | Registered Commenterchoces

no, no tengo esa libreria incorporada al proyecto consegui la libreria poi-ooxml-3.8-beta4 y la voy a agregar a ver si de esa forma soluciono este inconveniente.

enero 3, 2013 | Registered Commenterdmorales

sigue sin funcionar por la 3 linea de codigo

XSSFWorkbook workBook = new XSSFWorkbook(salesFileName);
ya que el constructor no acepta parametros, eso funciona si trabajara con HSSF

enero 3, 2013 | Registered Commenterdmorales