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