Який найкращий API для читання аркушів Excel у Java - JXL або Apache POI [закрито]


94

Який з 2 API простіше читати / писати / редагувати аркуші Excel? Ці API не підтримують розширення CSV?

Використовуючи JXL для file.xls та file.xlsx, я отримую виняток, такий як:

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)

Як для розширень .xls, так і для .xlsx. Версія Java, якою я користуюся: JDK1.6


1
А як щодо: "Які API є для читання / запису електронних таблиць Microsoft Excel (JXL, Apache POI тощо) на Java? Які найкращі сценарії використовувати кожен з них?"
Cléssio Mendes

Відповіді:


258

Я використовував як JXL (тепер "JExcel"), так і Apache POI . Спочатку я використовував JXL, але зараз використовую Apache POI.

По-перше, ось речі, де обидва API мають однакову кінцеву функціональність:

  • Обидва безкоштовні
  • Стиль комірки: вирівнювання, фони (кольори та візерунки), межі (типи та кольори), підтримка шрифтів (назви шрифтів, кольори, розмір, жирний шрифт, курсив, закреслення, підкреслення)
  • Формули
  • Гіперпосилання
  • Злиті регіони клітин
  • Розмір рядків і стовпців
  • Форматування даних: цифри та дати
  • Обтікання тексту всередині комірок
  • Заморозити панелі
  • Підтримка верхнього / нижнього колонтитула
  • Читання / запис існуючих та нових електронних таблиць
  • Обидва намагаються зберегти існуючі об’єкти в електронних таблицях, які вони читають, у цілості, наскільки це можливо.

Однак є багато відмінностей:

  • Мабуть, найбільш суттєвою відмінністю є те, що Java JXL не підтримує формат Excel 2007+ ".xlsx"; він підтримує лише старий формат BIFF (двійковий) ".xls". Apache POI підтримує як спільний дизайн.
  • Крім того, частина Java-файлу API JXL востаннє оновлена ​​в 2009 році (3 роки 4 місяці тому, коли я це пишу), хоча, схоже, існує API C #. POI Apache активно підтримується.
  • JXL не підтримує умовне форматування, Apache POI підтримує, хоча це не настільки важливо, оскільки ви можете умовно форматувати комірки за допомогою власного коду.
  • JXL не підтримує форматування насиченого тексту , тобто різне форматування в текстовому рядку; POI Apache підтримує це.
  • JXL підтримує лише певні обертання тексту: горизонтальний / вертикальний, +/- 45 градусів та складений; POI Apache підтримує будь-яку цілу кількість градусів плюс складені.
  • JXL не підтримує малювання фігур; Apache POI робить.
  • JXL підтримує більшість параметрів налаштування сторінки, таких як альбомний / портретний, поля, розмір паперу та масштабування. POI Apache підтримує все це, а також повторювані рядки та стовпці.
  • JXL не підтримує розділені панелі; Apache POI робить.
  • JXL не підтримує створення та маніпулювання діаграмою; цієї підтримки поки що немає в Apache POI, але API поступово починає формуватися.
  • Apache POI має більш широкий набір документації та прикладів, ніж JXL.

Крім того, POI містить не лише основний API "usermodel", а й API на основі подій, якщо все, що ви хочете зробити, - це прочитати вміст електронної таблиці.

На закінчення, завдяки кращій документації, більшій кількості функцій, активній розробці та підтримці формату Excel 2007+, я використовую Apache POI.


Дякую за розгорнуте пояснення.
Swagatika

8
+1 за чіткий, стислий та надзвичайно корисний
Рон,

1
брудний getContents()метод у JExcelAPI економить мені багато часу. За допомогою POI ви повинні перевірити це тип комірки, потім отримати значення (якщо це числова комірка, вам потрібно перевірити, чи це комірка Date) відповідно до свого типу, і нарешті перетворити його у значення String різними методами, що так незручно. Не уявляю, POI не забезпечує такого брудного, але зручного методу, як це робить JExcelAPI.
LiuYan 刘 研

1
Дуже позитивна річ, якщо POI - це читання на основі подій. Особливо на мобільних пристроях (= Android), це дуже допомагає при роботі з обмеженими розмірами купи та GC. Читання простого XLS за допомогою JXL часто досягало ліміту пам'яті програми, що спричиняло збій програми.
dermatthias

2
Одним з важливих факторів, який змусив мене перейти на POI, є гнучкість використання API для випаровування, що обов’язково, коли ви хочете читати Excel з величезною кількістю даних. Ви не хотіли б, щоб дані wole завантажувалися в пам'ять, коли ви відкриваєте excel, якщо дані в excel величезні. За допомогою потокового передавання весь вміст вашого Excel / будь-якого офісного документа не завантажується в пам’ять відразу після аналізу аркуша.
Ашок Кой,

12

Я використовував POI.

Якщо ви використовуєте це, слідкуйте за тими форматорами комірок: створіть один і використовуйте його кілька разів, замість того, щоб створювати кожен раз для комірки, це величезна різниця в споживанні пам'яті або великі дані.


5

Я не знайомий з JXL, але ми використовуємо POI. POI добре підтримується і може обробляти як двійковий формат .xls, так і новий формат на основі xml, який було запроваджено в Office 2007.

CSV-файли не є файлами Excel, це текстові файли, тому ці бібліотеки їх не читають. Вам потрібно буде проаналізувати файл CSV самостійно. Мені невідомо жодної бібліотеки файлів CSV, але я також не дивився.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.