Saltar al contenido

Error al leer Excel .XLSX con Apache POI

Luego de de una extensa búsqueda de datos dimos con la solución esta dificultad que presentan ciertos usuarios. Te ofrecemos la solución y nuestro deseo es resultarte de mucha ayuda.

Solución:

El método que utiliza el código anterior tiene un único parámetro: FileInputStream. La primera línea del fragmento de código es una parte muy importante del código, pero también del método de invocación. Dado que el método en cuestión no tenía conocimiento del formato de Excel o incluso una extensión de archivo para hacer una conjetura, decidí que primero intentaría leer FileInputStream usando la API HSSF como se muestra a continuación:

Sheet sheet = null;
try 

    POIFSFileSystem poifs = new POIFSFileSystem(inputFS);
    Workbook workbook = new HSSFWorkbook(poifs);
    sheet = workbook.getSheetAt(0);

catch (Exception e) 


if (sheet == null) 

    try 

        Workbook workbook = new XSSFWorkbook(inputFS);
        sheet = workbook.getSheetAt(0);
    
    catch (Exception e) 
    

El problema con el código anterior es que el estado del inputFS se desconoce el objeto durante el segundo intento de abrirlo a través de la API XSSF. Y esto produjo un read error. Reemplacé lo anterior con el siguiente código, que funciona bien y el problema parece estar resuelto:

Sheet sheet = null;
try 

    Workbook workbook = WorkbookFactory.create(inputFS);
    sheet = workbook.getSheetAt(0);

catch (Exception e) 

Probé esto con los formatos XLS (más antiguo, binario) y XLSX (más nuevo, basado en XML) y funciona. ¡Gracias por la ayuda y el aporte de todos!

La excepción indica que hay algo con su InputStream. Sin embargo, si tiene un archivo, ¡páselo directamente a POI!. El uso de un InputStream requiere el almacenamiento en búfer de todo en la memoria, lo que consume espacio. Ya que no necesita hacer ese almacenamiento en búfer, ¡no lo haga! Evitar ese almacenamiento en búfer debería solucionar su problema de todos modos

Si está utilizando las últimas compilaciones nocturnas de PDI, entonces es muy fácil. Su código se convierte en:

File file = new File("test.xlsx");
OPCPackage opcPackage = OPCPackage.open(file);
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);

Por lo demás, es muy similar:

File file = new File("test.xlsx");
OPCPackage opcPackage = OPCPackage.open(file.getAbsolutePath());
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);

Si no está seguro de si su archivo es un HSSFWorkbook o XSSFWorkbook, entonces puede usar WorkbookFactory para abrir el adecuado para usted:

File file = new File("test.xlsx");
Workbook workbook = WorkbookFactory.create(file);

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *