Solución:
Promoción de un comentario a una respuesta …
Si va a hacer algo especial con los archivos, entonces la respuesta de rjokelai es la forma de hacerlo.
Sin embargo, si solo va a utilizar el modelo de usuario HSSF / XSSF / Common SS, entonces es mucho más sencillo que POI lo haga por usted, y use WorkbookFactory para que el tipo sea detectado y abierto por usted. Harías algo como:
Workbook wb = WorkbookFactory.create(new File("something.xls"));
o
Workbook wb = WorkbookFactory.create(request.getInputStream());
Luego, si necesita hacer algo especial, pruebe si es un HSSFWorkbook
o XSSFWorkbook
. Al abrir el archivo, use un Archivo en lugar de un InputStream si es posible para acelerar las cosas y ahorrar memoria.
Si no sabe cuál es su archivo, use Apache Tika para hacer la detección; puede detectar una gran cantidad de formatos de archivo diferentes por usted.
Puedes usar:
// For .xlsx
POIXMLDocument.hasOOXMLHeader(new BufferedInputStream( new FileInputStream(file) ));
// For .xls
POIFSFileSystem.hasPOIFSHeader(new BufferedInputStream( new FileInputStream(file) ));
Estos son esencialmente los métodos que WorkbookFactory#create(InputStream)
usos para determinar el tipo
Tenga en cuenta que ambos métodos solo admiten transmisiones que admitan la función “marcar” (o PushBackInputStream), por lo que no se admite FileInputStream simple. Utilice BufferedInputStream como contenedor. Por esta razón, después de la detección, simplemente puede reutilizar el flujo, ya que se reiniciará en el punto de partida.
Esto se puede hacer usando el FileMagic clase. Consulte a continuación JavaDoc: https://poi.apache.org/apidocs/org/apache/poi/poifs/filesystem/FileMagic.html
Fragmento de código de muestra:
FileMagic.valueOf(inputStream).equals(FileMagic.OOXML) // XLSX