Pull to refresh

Comments 43

Я не автор данной статьи, но был опыт работы. В целом принцип взаимодействия между этими двумя библиотеками не отличается, но EPPlus работает чуть пошустрее. Можно тут ознакомиться с моими тестами производительности https://m.habr.com/ru/company/arcadia/blog/498032/

NPOI относительно хороша, в целом не имею ничего против. Но, по моему мнению, сделать что-то простое — проще на EPPlus. Что-то совсем сложное мне делать не приходилось, в основном это были отчеты, в том числе комплексные, сильно стилизованные, с графиками, с формулами и кастомной пейдженацией.

Что касается производительности, тема интересная, но, как мне кажется, не очень актуальная для чтения\записи excel. Когда я сталкивался с тем, что файл генерируется дольше чем пользователь готов ждать, я просто добавлял кэширование. Кэшировать можно как данные для отчета так и Excel файл, целиком или даже по частям.
Также есть еще DocumentFormat.OpenXml(Open XML SDK) от MS под MIT лицензией.
UFO just landed and posted this here
DocumentFormat.OpenXml слишком низкоуровневый. Я тоже пару дней назад пытался освоить его с наскоку. В результате пришлось искать что-то более человеко-понимаемое и обозримое. Остановился на ClosedXML.
На github-странице проекта написано:
DON'T use dotnetcore/NPOI anymore
a. This project is NOT in maintainence for at least 2 years (no update after 2018)

b. It's a migrated .net core version of NPOI 2.2.1 (which is published 4 years ago)

c. They betray the open source spirit. All the git history from NPOI team are deleted. Neuzilla studio info is removed. Original Readme.txt is removed (all the contributors of NPOI are removed.)

Обычная работа с COM объектами, причем что на С# что на Паскале будет одинакова, за исключением разницы синтаксиса языков. И для построения таких отчётов лучше использовать RAVE компоненты или аналогичные, там и быстрее и не зависит от наличия экселя на компе.

Вы ошибаетесь. Большинство библиотек сейчас давным давно ушло от использования COM ибо это медленно. Осталась только старый добрый MicrosoftExcelInterop. Все остальные, в том числе EPPlus используют прямую работу с файлом, даже в режиме стриминга

Я бы добавил — чудовищно медленно. Работа с отдельными ячейками через COM это совершенно отдельное «удовольствие», я когда такое накидывал, сразу переходил к работе диапазонами ячеек, чтение/запись в массив. Следующая проблема — форматирование. Если в пределах одной ячейки автофит работает, то при объединении ячеек Excel просто игнорирует его, приходится писать алгоритм вычисления размера объединенной ячейки, иногда очень неточный, или пользоваться костылями экселя же. В общем для какого то быстрого прототипирования еще может пойдет, для серьезной работы нет.
> В общем для какого то быстрого прототипирования еще может пойдет
Там еще и API сверх неудобнный, и куча подбодных камней при запуске, например, требование установленного офиса. Не уверен, что это было бы быстрее и проще библиотеки. С другой стороны если надо поддерживать старые форматы 98 года, то тут уже почти без вариантов, но тут вроде как раз NPOI решает (или какая-то другая библиотека от японцев, точно уже не помню)
Мы для решения проблем с производительностью и сохранения совместимости со старыми отчетами сделали собственный COM-объект, аналогичный Excel.Application, с EPPlus под капотом :)
Это уже немного другая область… EPPlus быстрый и легковесный, он отлично интегрируется в серверное приложение.
EPPlus тоже не зависит от наличия экселя на компьютере, тк, если не ошибаюсь, основан на спецификации OpenXML
меня, как анализатора «вручную» интересует вопрос, зачем такой объем предела строк и столбцов, когда на 700к строк и десятке столбцов в одной таблице уже некомфортно работать? файл на 200 мегабайт начинает тормозить очень сильно.
Имеете в виду максимальное число строк и столбцов на странице? Думаю искусственно ограничивать как раз смысла нет, да и мощности у всех разные. ПО-viewer может, в теории, отображать только видимую область.
А что у этой библиотеки с производительностью и потреблением памяти?
Тут недавно заказчик хотел экспорт в excel примерно 2 тысячи столбцов и до полумиллиона строк в каждой из трёх страниц (это его проблемы что он там собрался дальше делать). Сошлись на CSV, но просто интересно, сжуёт ли задачу эта библиотека?
Интересный вопрос. Если будет время проверю…

А не проще сделать в Excel готовый XML-файл, превратить его в шаблон, и рендерить так же как HTML?

Т.е. собирать Excel zip пакет вручную? Хардкорно)
Для чего-то простого наверное пойдет — сделал и забыл. Но как это поддерживать? Если только написать умный авто-шаблонизатор, который сам понимает, где лежат данные и подменяет их.

Ну HTML же на C# можно как-то рендерить, тут тот же принцип.

Я использую ClosedXML — бесплатный софт по работе с Excel. В основном Excel используем для генерации отчетов и дальнейшей печати, так как с PDF немного сложнее и дольше работать. По скорости работы замеры не делал.

Поддерживаю, эта библиотека очень хороша. Делал с ее помощью обработку excel-файлов, все оказалось достаточно просто и удобно.
Жаль, что EPPlus не умеет экспортировать в PDF. К сожалению для этого ничего лучше Excel.Interop не нашел(бесплатного).
EPPlus — отличная библиотека, использую её очень много лет.

Но если кто пропустил, теперь она платная для использованиях в коммерческих продуктах.
Если раньше она была под LGPL лицензией (архивный репозиторий), то теперь она распространяется под PolyForm Noncommercial License 1.0.0, официальное сообщение от компании с историей вопроса можно прочитать у них на сайте.

Как то слишком много кода, строить рисовать колонки, ячейки, стили на стороне на C# так себе подход. Ладно когда еще отчет маленький, но когда он огромный код превратится в кашу.
Мы делаем по другому, создаем шаблон .xlsm типа сводной таблицы, разрисовываем в нем полностью отчет включая стили, форматирование и т.п. далее в скрипте делаем что то типа


ActiveSheet.PivotTables("СводнаяТаблица").ChangePivotCache ActiveWorkbook. _
        PivotCaches.Create(SourceType:=xlDatabase, SourceData:=Sheets(Sheets.Count).Name + "!$A:$P")

И используя библиотеку типа ClosedXML/OpenXml открываем этот шаблон, загружаем в него сырые данные в новый лист и открываем.
Плюсы: Вся логика отчета в Excel, в C# только логика загрузки данных единая для всех отчетов.
Минусы: Нужно хорошо знать Excel и VisualBasic хотя бы на базовом уровне.

А шаблон вы руками разрисовываете?
Если стили будут динамическими, в зависимости от данных, то это не прокатит(

Да шаблон полностью строится в Excel, и проблем с динамическими стилями тоже нет. Есть же условное форматирование, на крайняк если что то совсем сложное то все скриптуется в VisualBasic

UFO just landed and posted this here
Можно в том же макросе сохранять файл как .xlsx а не .xlsm после форматирования
UFO just landed and posted this here
Фильтры по столбцу на листе файла.
Не могу ничего сказать про EPPlus, но мы пробовали использовать EPPlus.Core в своём проекте. Упёрлись в то, что она завязана на System.Drawing (в частности, заливка ячеек завязана на тип System.Drawing.Color) и оказалось, что в docker'е под ubuntu xeinal она отказывается работать даже с установленным пакетом libgdiplus. Поглядели было на EPPlus, но не стали связываться с ней, т.к. 1) наверняка она имеет те же зависимости, что и EPPlus.Core, а также 2) последние версии не являются открытыми. Остановились на ClosedXML (лицензия MIT). Работает прекрасно, как в windows, так и в linux даже без libgdiplus.

PS. EPPlus.Core уже давно брошена. Собственно, она и не была никогда серьёзным проектом, в только любительским переносом какой-то версии EPPlus на .NET Core.

PPS. Чтобы не упереться в проблемы при поиске пакетов на nuget.org, я настоятельно советую всем сходить по ссылкам «Project Site» и «Source repository» и почитать, подробности о них. Если этих ссылок у пакета нет, то это повод пройти мимо.
У нас не решило. Экспрт в xlsx падал с исключением:
2020-10-22 13:17:39.337 +00:00 [ERR] The type initializer for 'Gdip' threw an exception.
2020-10-22 13:17:39.340 +00:00 [ERR] at System.Drawing.SafeNativeMethods.Gdip.GdipGetGenericFontFamilySansSerif(IntPtr& fontfamily)
at System.Drawing.FontFamily.GetGdipGenericSansSerif()
...

Перешли на ClosedXML. Благо, принцип работы с ним аналогичен EPPlus, а где-то и удобнее. Серьёзных переделок не потребалось.

Мы у себя на докере используем epplus.core под линуксом, так что это реально) был какой то затык там изначально, как раз с либой графической связанный, но решился за несколько минут гуглинга, если интересно, могу подсказать какую либу доставляли ещё

Не, уже не интересно. Пару дней назад полностью выкинули EPPlus.Core из своего проекта. Рецепты из гугла пробовали, но с разбегу не пошло, а разбираться было особо некогда. Быстро посмотрели примеры использования ClosedXML и поняли, что это достаточно близкий аналог и больших переделок не потребуется. Прогнали примеры в debian без установленной libgdiplus, после чего перевели часть функционала на неё. После удачного тестирования окончательно перешли на ClosedXML.

Если важна скорость, то рекомендую https://www.spreadsheetgear.com/ У нас есть несколько серверных решений на основе этой библиотеки. Измерения показали, что SpreadsheetGear работает намного быстрее, чем EPPlus

А есть ли в EPPlus возможность проверить состояние drawing в worksheet, к примеру чекбокса? Пытаюсь сделать это уже долгое время, но никак не удалось найти никакого решения. Проще говоря, загружаем файл в приложение, а оно парсит его поля в модель. Для drawings вижу только xml с разметкой типа width/height/name, но состояние (checked/unchecked) такого чекбокса найти просто не получается. Лучшее, что удалось узнать — это то, что состояния drawing объектов хранятся в VML.
Sign up to leave a comment.

Articles