Qual é a melhor API para leitura de planilhas do Excel em java - JXL ou Apache POI [fechado]

94

Qual das 2 APIs é mais simples de ler / escrever / editar planilhas do Excel? Essas APIs não oferecem suporte a extensões CSV?

Usando JXL para file.xls e file.xlsx, recebo uma exceção 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)

Para extensões .xls e .xlsx. A versão Java que estou usando é: JDK1.6

Swagatika
fonte
1
E sobre: ​​"Quais APIs existem para ler / escrever planilhas do Microsoft Excel (JXL, Apache POI, etc) em Java? Quais são os melhores cenários para usar cada um deles?"
Cléssio Mendes

Respostas:

258

Usei o JXL (agora "JExcel") e o Apache POI . No começo eu usei JXL, mas agora uso o Apache POI.

Primeiro, aqui estão as coisas em que ambas as APIs têm a mesma funcionalidade final:

  • Ambos são gratuitos
  • Estilo de célula: alinhamento, planos de fundo (cores e padrões), bordas (tipos e cores), suporte de fonte (nomes de fontes, cores, tamanho, negrito, itálico, riscado, sublinhado)
  • Fórmulas
  • Hiperlinks
  • Regiões de células mescladas
  • Tamanho das linhas e colunas
  • Formatação de dados: números e datas
  • Quebra de texto dentro das células
  • Congelar painéis
  • Suporte para cabeçalho / rodapé
  • Ler / escrever planilhas novas e existentes
  • Ambos tentam manter os objetos existentes nas planilhas que lêem intactos, tanto quanto possível.

No entanto, existem muitas diferenças:

  • Talvez a diferença mais significativa seja que o Java JXL não oferece suporte ao formato ".xlsx" do Excel 2007+; ele suporta apenas o antigo formato BIFF (binário) ".xls". O Apache POI oferece suporte a ambos com um design comum.
  • Além disso, a parte Java da API JXL foi atualizada pela última vez em 2009 (3 anos, 4 meses atrás, enquanto escrevo isso), embora pareça que existe uma API C #. O Apache POI é mantido ativamente.
  • JXL não oferece suporte à Formatação Condicional, mas o Apache POI, embora isso não seja tão significativo, porque você pode formatar células condicionalmente com seu próprio código.
  • JXL não suporta formatação rich text , ou seja, formatação diferente dentro de uma string de texto; Apache POI oferece suporte.
  • JXL suporta apenas certas rotações de texto: horizontal / vertical, +/- 45 graus e empilhado; Apache POI suporta qualquer número inteiro de graus mais empilhados.
  • JXL não suporta o desenho de formas; O Apache POI sim.
  • JXL suporta a maioria das configurações de configuração de página, como Paisagem / Retrato, Margens, Tamanho do papel e Zoom. O Apache POI oferece suporte a tudo isso, além de Repetir Linhas e Colunas.
  • JXL não oferece suporte a painéis divididos; O Apache POI sim.
  • JXL não oferece suporte à criação ou manipulação de gráficos; esse suporte ainda não existe no Apache POI, mas uma API está lentamente começando a se formar.
  • O Apache POI tem um conjunto mais extenso de documentação e exemplos disponíveis do que o JXL.

Além disso, o POI contém não apenas a API "usermodel" principal, mas também uma API baseada em eventos, se tudo o que você quiser fazer for ler o conteúdo da planilha.

Concluindo, por causa da melhor documentação, mais recursos, desenvolvimento ativo e suporte ao formato Excel 2007+, eu uso o Apache POI.

rgettman
fonte
Obrigado pela explicação elaborada.
Swagatika
8
+1 para claro, conciso e extremamente útil
Ron,
1
o getContents()método sujo em JExcelAPI me economiza muito tempo. Com o POI, você deve verificar seu tipo de célula, depois pegar seu valor (se for uma célula Numérica, você precisa verificar se é uma célula de Data) de acordo com seu tipo, e finalmente convertê-lo para o valor String com métodos diferentes, isso é tão inconveniente. Não consigo imaginar que o POI não forneça um método tão sujo, mas conveniente, como o JExcelAPI.
LiuYan 刘 研
1
Uma coisa muito positiva se o POI for a leitura baseada em eventos. Especialmente em dispositivos móveis (= Android), isso ajuda muito ao lidar com tamanhos de heap limitados e GC. A leitura de um XLS simples com JXL costumava atingir o limite de memória do aplicativo, fazendo com que ele travasse.
dermatias de
2
Um dos fatores importantes que me fez migrar para o POI é a flexibilidade de usar a API Steaming, que é fundamental quando você deseja ler o Excel com uma grande quantidade de dados. Você não gostaria que todos os dados fossem carregados na memória ao abrir o Excel, se os dados no Excel fossem enormes. Com o streaming, todo o conteúdo do seu Excel / qualquer documento do Office não será carregado na memória imediatamente após você analisar a planilha.
Ashok Koyi
12

Eu usei o POI.

Se você usar isso, fique de olho nos formatadores de células: crie um e use-o várias vezes ao invés de criar cada vez para a célula, é uma diferença enorme de consumo de memória ou dados grandes.


fonte
5

Não estou familiarizado com JXL, mas usamos POI. O POI é bem mantido e pode lidar com o formato .xls binário e o novo formato baseado em xml que foi introduzido no Office 2007.

Os arquivos CSV não são arquivos do Excel, são arquivos baseados em texto, portanto, essas bibliotecas não os lêem. Você precisará analisar um arquivo CSV sozinho. Não conheço nenhuma biblioteca de arquivos CSV, mas também não procurei.

Jwesley
fonte