Сравните три бесплатные библиотеки, чтобы выбрать лучшую

Управление статистикой данных является главным приоритетом, когда речь идет о разработке системы.

Многие люди полагаются на Excel как на инструмент для управления данными.

В связи с постоянным ростом компании объем данных в ее базе данных также увеличился.

Вы когда-нибудь видели, что когда вы нажимаете кнопку «Создать отчет», ваш почтовый ящик всегда молчит?

Есть две распространенные причины низкой производительности. Первая причина — медленное извлечение данных запроса из базы данных, а вторая — медленная запись в Excel.

В этой статье я буду использовать некоторые сгенерированные библиотеки Excel, чтобы сравнить самые быстрые в разных объемах данных.

Расскажите, какие библиотеки я буду использовать

1.LargeXlsx

Это минималистичная, но многофункциональная библиотека, написанная на C# для стандарта .net 2.0, предоставляющая простые примитивы для записи файлов Excel в формате XLSX в потоковом режиме, так что потенциально огромные файлы могут быть созданы при потреблении небольшого постоянного объема памяти. Память.

salvois/LargeXlsx: библиотека .net для записи больших файлов Excel в формате XLSX с низким потреблением памяти с использованием потоковой записи. (github.com)

2. МиниExcel

MiniExcel прост и эффективен, чтобы избежать использования инструмента OOM .NET для обработки Excel.

В настоящее время большинству популярных фреймворков необходимо загружать все данные в память для облегчения работы, но это вызовет проблемы с потреблением памяти. MiniExcel пытается использовать алгоритм из потока, чтобы уменьшить исходное использование 1000 МБ до нескольких МБ, чтобы избежать OOM (недостаточно памяти).

мини-программное обеспечение/MiniExcel: быстрый, не требующий большого объема памяти, простой помощник Excel .NET для импорта/экспорта/шаблонов электронных таблиц (github.com)

3.ClosedXml

ClosedXML — это библиотека .NET для чтения, обработки и записи файлов Excel 2007+ (.xlsx, .xlsm). Он направлен на предоставление интуитивно понятного и удобного интерфейса для работы с базовым API OpenXML.

ClosedXML/ClosedXML: ClosedXML — это библиотека .NET для чтения, обработки и записи файлов Excel 2007+ (.xlsx, .xlsm). Он направлен на предоставление интуитивно понятного и удобного интерфейса для работы с лежащим в основе OpenXML API. (github.com)

Подходы к тестированию

Учитывая три объема данных для создания 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++;
}

LargeXlsx/src/LargeXlsx/Worksheet.cs по адресу 0e51106909e564d0f1ffe4178d01295968595fa6 · salvois/LargeXlsx (github.com)

Заключение

Если вы хотите быстро сгенерировать отчет Excel, пакет LargeXlsx — лучший выбор.

И самое главное это бесплатно!

Пакет также может стилизовать содержимое листа, например размер шрифта, цвет и функцию фиксированного заголовка.

Я надеюсь, что эта статья поможет вам эффективно генерировать Excel!

Вы можете найти исходный код на моем GitHub:

Jefferycheng/FastestExcelTest (github.com)