Foro sobre Java SE > JAVA y EXCEL 2007
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
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
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
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().
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.
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.
estoy intentando leer un archivo excel 2007 (extension xlsx)
¿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
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();
}
}
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);
no me reconoce la clase XSSFWorkbook no logro importarla para utilizar. estoy con poi-3.9-20121203
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.
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.
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
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 ??