¿Cuál es la mejor API para leer hojas de Excel en java? JXL o Apache POI [cerrado]

94

¿Cuál de las 2 API es más sencilla de leer / escribir / editar hojas de Excel? ¿Estas API no admiten extensiones CSV?

Usando JXL para file.xls y file.xlsx, obtengo una excepción como:

jxl.read.biff.BiffException: Unable to recognize OLE stream
    at jxl.read.biff.CompoundFile.<init>(CompoundFile.java:116)
    at jxl.read.biff.File.<init>(File.java:127)
    at jxl.Workbook.getWorkbook(Workbook.java:268)
    at core.ReadXLSheet.contentReading(ReadXLSheet.java:46)
    at core.ReadXLSheet.init(ReadXLSheet.java:22)
    at core.ReadXLSheet.main(ReadXLSheet.java:72)

Tanto para extensiones .xls como .xlsx. La versión de Java que estoy usando es: JDK1.6

Swagatika
fuente
1
¿Qué pasa con: "¿Qué API existen para leer / escribir hojas de cálculo de Microsoft Excel (JXL, Apache POI, etc.) en Java? ¿Cuáles son los mejores escenarios para usar cada uno de ellos?"
Cléssio Mendes

Respuestas:

258

He utilizado tanto JXL (ahora "JExcel") como Apache POI . Al principio usé JXL, pero ahora uso Apache POI.

Primero, aquí están las cosas en las que ambas API tienen la misma funcionalidad final:

  • Ambos son gratis
  • Estilo de celda: alineación, fondos (colores y patrones), bordes (tipos y colores), soporte de fuente (nombres de fuente, colores, tamaño, negrita, cursiva, tachado, subrayado)
  • Fórmulas
  • Hipervínculos
  • Regiones celulares fusionadas
  • Tamaño de filas y columnas
  • Formato de datos: números y fechas
  • Ajuste de texto dentro de las celdas
  • Congelar paneles
  • Soporte de encabezado / pie de página
  • Leer / escribir hojas de cálculo nuevas y existentes
  • Ambos intentan mantener intactos los objetos existentes en las hojas de cálculo que leen en la medida de lo posible.

Sin embargo, existen muchas diferencias:

  • Quizás la diferencia más significativa es que Java JXL no es compatible con el formato ".xlsx" de Excel 2007+; sólo admite el antiguo formato BIFF (binario) ".xls". Apache POI admite ambos con un diseño común.
  • Además, la parte de Java de la API JXL se actualizó por última vez en 2009 (hace 3 años, 4 meses mientras escribo esto), aunque parece que hay una API C #. Apache POI se mantiene activamente.
  • JXL no admite el formato condicional, Apache POI lo hace, aunque esto no es tan significativo, porque puede formatear celdas condicionalmente con su propio código.
  • JXL no admite el formato de texto enriquecido , es decir, un formato diferente dentro de una cadena de texto; Apache POI lo admite.
  • JXL solo admite ciertas rotaciones de texto: horizontal / vertical, +/- 45 grados y apilado; Apache POI admite cualquier número entero de grados más apilado.
  • JXL no admite formas de dibujo; Apache POI lo hace.
  • JXL admite la mayoría de las configuraciones de configuración de página, como horizontal / vertical, márgenes, tamaño de papel y zoom. Apache POI admite todo eso, además de filas y columnas repetidas.
  • JXL no admite paneles divididos; Apache POI lo hace.
  • JXL no admite la creación o manipulación de gráficos; ese soporte aún no existe en Apache POI, pero una API está comenzando a formarse lentamente.
  • Apache POI tiene un conjunto de documentación y ejemplos más extenso disponible que JXL.

Además, POI contiene no solo la API principal de "modelo de usuario", sino también una API basada en eventos si todo lo que desea hacer es leer el contenido de la hoja de cálculo.

En conclusión, debido a la mejor documentación, más funciones, desarrollo activo y compatibilidad con el formato Excel 2007+, utilizo Apache POI.

rgettman
fuente
Gracias por la elaborada explicación.
Swagatika
8
+1 para ser claro, conciso y extremadamente útil
Ron
1
el getContents()método sucio en JExcelAPI me ahorra mucho tiempo. Con POI, debe verificar su tipo de celda, luego obtener su valor (si es una celda numérica, debe verificar si es una celda de fecha) de acuerdo con su tipo, y finalmente convertirlo a un valor de cadena con diferentes métodos, eso es muy inconveniente. No puedo imaginar que POI no proporcione un método tan sucio pero conveniente como lo hace JExcelAPI.
LiuYan 刘 研
1
Algo muy positivo si POI es la lectura basada en eventos. Especialmente en dispositivos móviles (= Android), esto ayuda mucho cuando se trata de tamaños de montón limitados y GC. La lectura de un XLS simple con JXL a menudo alcanzaba el límite de memoria de la aplicación, lo que provocaba que la aplicación se bloqueara.
Dermatias
2
Uno de los factores importantes que me hizo migrar a POI es la flexibilidad para usar la API de vaporización, que es imprescindible cuando se desea leer Excel con una gran cantidad de datos. No querrá que los datos de wole se carguen en la memoria cuando abra Excel, si los datos en Excel son enormes. Con la transmisión, todo el contenido de su Excel / cualquier documento de Office no se cargará en la memoria inmediatamente después de analizar la hoja.
Ashok Koyi
12

He utilizado POI.

Si usa eso, esté atento a los formateadores de celda: cree uno y úselo varias veces en lugar de crear cada vez para la celda, es una gran diferencia de consumo de memoria o datos grandes.


fuente
5

No estoy familiarizado con JXL pero usamos POI. POI está bien mantenido y puede manejar tanto el formato .xls binario como el nuevo formato basado en xml que se introdujo en Office 2007.

Los archivos CSV no son archivos de Excel, son archivos basados ​​en texto, por lo que estas bibliotecas no los leen. Deberá analizar un archivo CSV usted mismo. No conozco ninguna biblioteca de archivos CSV, pero tampoco he mirado.

jwesley
fuente