Какой лучший 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-часть JXL API последний раз обновлялась в 2009 году (3 года, 4 месяца назад, когда я писал это), хотя похоже, что существует C # API. Apache POI активно поддерживается.
  • JXL не поддерживает условное форматирование, в отличие от Apache POI, хотя это не так важно, потому что вы можете условно форматировать ячейки своим собственным кодом.
  • JXL не поддерживает богатый текст форматирования, то есть другое форматирование внутри текстовой строки; Apache POI поддерживает это.
  • JXL поддерживает только определенные повороты текста: горизонтальный / вертикальный, +/- 45 градусов и сложенный; Apache POI поддерживает любое целое число градусов плюс стек.
  • JXL не поддерживает фигуры рисования; Apache POI делает.
  • JXL поддерживает большинство параметров настройки страницы, таких как альбомная / книжная, поля, размер бумаги и масштаб. Apache POI поддерживает все это, а также повторяющиеся строки и столбцы.
  • JXL не поддерживает разделенные панели; Apache POI делает.
  • JXL не поддерживает создание или изменение диаграмм; этой поддержки еще нет в Apache POI, но API постепенно начинает формироваться.
  • Apache POI имеет более обширный набор документации и доступных примеров, чем JXL.

Кроме того, POI содержит не только основной API «пользовательской модели», но и API, основанный на событиях, если все, что вам нужно, - это читать содержимое электронной таблицы.

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

rgettman
источник
Спасибо за подробное объяснение.
Swagatika
8
+1 за ясность, краткость и чрезвычайно полезный
Рон
1
грязный getContents()метод в JExcelAPI сэкономил мне много времени. С помощью POI вы должны проверить его тип ячейки, затем получить его значение (если это числовая ячейка, вам нужно проверить, является ли это ячейкой даты) в соответствии с ее типом, и, наконец, преобразовать ее в значение String с помощью различных методов, что так неудобно. Не могу себе представить, что POI не предоставляет такой грязный, но удобный метод, как JExcelAPI.
LiuYan 刘 研
1
Очень хорошо, если POI - это чтение на основе событий. Особенно на мобильных устройствах (= Android) это очень помогает при ограниченных размерах кучи и GC. Чтение простого XLS с JXL часто достигало предела памяти приложения, что приводило к сбою приложения.
dermatthias
2
Одним из важных факторов, побудивших меня перейти на POI, является гибкость использования API-интерфейса Steam, который необходим, когда вы хотите читать Excel с огромным объемом данных. Вы не хотели бы, чтобы данные wole загружались в память при открытии Excel, если данные в Excel огромны. При потоковой передаче все содержимое вашего Excel / любого офисного документа не будет загружено в память сразу после того, как вы проанализируете лист.
Ashok Koyi 05
12

Я использовал POI.

Если вы используете это, следите за этими программами форматирования ячеек: создайте один и используйте его несколько раз вместо того, чтобы создавать каждый раз для ячейки, это огромная разница в потреблении памяти или больших данных.


источник
5

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

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

Jwesley
источник
1

Для чтения «простых» файлов CSV на Java существует библиотека OpenCSV, доступная здесь: http://opencsv.sourceforge.net/

Джерри Оберли
источник
3
У Apache есть предложение Commons для CSV, commons.apache.org/proper/commons-csv . Он работает довольно хорошо и имеет хорошее имя.
trognanders