Сравните три бесплатные библиотеки, чтобы выбрать лучшую
Управление статистикой данных является главным приоритетом, когда речь идет о разработке системы.
Многие люди полагаются на Excel как на инструмент для управления данными.
В связи с постоянным ростом компании объем данных в ее базе данных также увеличился.
Вы когда-нибудь видели, что когда вы нажимаете кнопку «Создать отчет», ваш почтовый ящик всегда молчит?
Есть две распространенные причины низкой производительности. Первая причина — медленное извлечение данных запроса из базы данных, а вторая — медленная запись в Excel.
В этой статье я буду использовать некоторые сгенерированные библиотеки Excel, чтобы сравнить самые быстрые в разных объемах данных.
Расскажите, какие библиотеки я буду использовать
1.LargeXlsx
Это минималистичная, но многофункциональная библиотека, написанная на C# для стандарта .net 2.0, предоставляющая простые примитивы для записи файлов Excel в формате XLSX в потоковом режиме, так что потенциально огромные файлы могут быть созданы при потреблении небольшого постоянного объема памяти. Память.
2. МиниExcel
MiniExcel прост и эффективен, чтобы избежать использования инструмента OOM .NET для обработки Excel.
В настоящее время большинству популярных фреймворков необходимо загружать все данные в память для облегчения работы, но это вызовет проблемы с потреблением памяти. MiniExcel пытается использовать алгоритм из потока, чтобы уменьшить исходное использование 1000 МБ до нескольких МБ, чтобы избежать OOM (недостаточно памяти).
3.ClosedXml
ClosedXML — это библиотека .NET для чтения, обработки и записи файлов Excel 2007+ (.xlsx, .xlsm). Он направлен на предоставление интуитивно понятного и удобного интерфейса для работы с базовым API OpenXML.
Подходы к тестированию
Учитывая три объема данных для создания Excel и сравнения завершенного времени и использования памяти.
Excel будет заполнен 20 столбцами и разным количеством строк.
- Облегченные данные: одна строка данных листа менее десяти тысяч
- Данные среднего веса: одна строка данных листа о трехстах тысячах
- Тяжеловесные данные: ограничение на одну строку данных листа, около миллиона
Я буду использовать знаменитый пакетный бенчмарк для измерения процессорного времени и памяти.
Аппаратное обеспечение: ЦП Intel I7–12700, 1 ЦП, 20 логических и 14 физических ядер.
ОС: Windows
Версия Dotnet: .NET 7
Результат испытаний
Как вы можете видеть на рисунке ниже, порядок тестирования сверху вниз
- =› 10 000 строк данных
LargeXlsx
— значит 80,53 мс, выделено 26,64 МБMiniXlsx
— означает 112,98 мс, выделено 108,26 МБClosedXML
— означает 802 мс, выделено 517 МБ- =› 300 000 строк данных
LargeXlsx
— значит 1,8 с, выделено 765,25 МБMiniXlsx
— означает 2,8 с, выделено 2,9 ГБClosedXML
— значит 22,7 с, выделено 15,8 ГБ- =› 1 000 000 строк данных
LargeXlsx
— означает 6,2 с, выделено 2,6 ГБMiniXlsx
— значит 9,7 с, выделено 9,7 ГБClosedXML
— означает 78,5 с, выделено 52,5 ГБ.
Будь то процессорное время или использование памяти, пакет LargeXlsx
всегда тратит наименьшее количество процессорного времени и памяти; по мере роста данных до ста строк данных его производительность по-прежнему остается лучшей.
Итак, почему пакет LargeXlsx
мог иметь такую производительность?
Позвольте мне показать вам исходный код в пакете LargeXlsx
.
Файл Excel
.xlsx
хранится в формате XML, поэтому пакет напрямую записывает данные в файл StreamWriter
.
public void Write(string value, XlsxStyle style) { if (value == null) { Write(style, 1); return; } EnsureRow(); // <c r="{0}{1}" s="{2}" t="inlineStr"><is><t>{3}</t></is></c> _streamWriter.Write("<c"); WriteCellRef(); WriteStyle(style); _streamWriter.Write(" t=\"inlineStr\"><is><t>"); _streamWriter.Write(Util.EscapeXmlText(value)); _streamWriter.Write("</t></is></c>\n"); CurrentColumnNumber++; }
Заключение
Если вы хотите быстро сгенерировать отчет Excel, пакет LargeXlsx
— лучший выбор.
И самое главное это бесплатно!
Пакет также может стилизовать содержимое листа, например размер шрифта, цвет и функцию фиксированного заголовка.
Я надеюсь, что эта статья поможет вам эффективно генерировать Excel!
Вы можете найти исходный код на моем GitHub: