Как лучше / быстрее всего экспортировать большой набор данных из C# в excel


У меня есть код, который использует библиотеку OpenXML для экспорта данных.

У меня есть 20 000 строк и 22 столбца, и это занимает годы (около 10 минут).

Есть ли какое-либо решение, которое экспортировало бы данные из C# в excel, что было бы быстрее, поскольку я делаю это из asp.net MVC приложение и многие браузеры людей тайм-аут.

7 4

7 ответов:

Предполагая 20 ' 000 строк и 22 столбца с приблизительно 100 байтами каждый, составляет 41 мегабайт данных в одиночку. плюс XML-теги, плюс форматирование, я бы сказал, что вы в конечном итоге зиппируете (.xlsx - это не что иное, как несколько сжатых xml-файлов) 100 МБ данных.

Конечно, это занимает некоторое время, как и извлечение данных. Я рекомендую вам использовать пакет excel plus вместо пакета разработки Office OpenXML. http://epplus.codeplex.com/

Там, вероятно, ошибка / проблема производительности в пишите-в-спешке-и-надейтесь-что-это-не-взорвется-слишком-скоро код Microsoft.

CSV. Это обычный текстовый файл, но он может быть открыт любой версией Excel.

Несомненно, это более простой способ экспортировать данные в excel. Многие веб-сайты предоставляют экспорт данных в формате CSV.

Что вам нужно сделать, это просто добавить запятую (,), чтобы разделить значения и разрыв строки, чтобы разделить записи. Для создания csv-файла не требуется дополнительных ресурсов, поэтому он достаточно быстр.

Я использовал решение с открытым исходным кодом под названием ClosedXML, которое отлично работало

В зависимости от того, на какую версию Excel вы ориентируетесь, вы можете представить данные в виде Службы OData, которую Excel 2010 может естественно использовать и будет обрабатывать загрузку и форматирование для вас.

Я предполагаю, что эти данные должны быть полностью отправлены клиенту и уже были предварительно отфильтрованы каким-то образом, но все еще должны быть отправлены обратно человеку, который сделал запрос.

В этом случае вы хотите выполнить эту конкретную операцию "асинхронно". Я не уверен, что это будет соответствовать вашему рабочему процессу, но скажем, что человек запрашивает этот большой XML-форматированный документ, я бы: а) поставил в очередь другой рабочий поток, чтобы начать генерацию документ при возврате "токена" (возможно, GUID запрашивающему); б) возврат ссылки на страницу, где запрашивающий может щелкнуть по ссылке (передавая токен), позволяя странице посмотреть результаты.

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

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

Надеюсь, я правильно понял этот вопрос.

Я обнаружил, что могу ускорить экспорт данных из базы данных в электронную таблицу Excel, ограничив число операций экспорта. Я обнаружил, что при накоплении 100 строк данных перед записью скорость создания увеличивается по меньшей мере в 5-10 раз.

Ошибка при экспорте данных, которая чаще всего делается при экспорте данных, находится в рабочем процессе

  • Построить Модель
  • построить XML DOM
  • сохранить XML DOM в файл

Этот рабочий процесс приводит к накладным расходам, потому что создание XML DOM требует времени, XML DOM хранится в памяти вместе с моделью, а затем вся куча данных записывается в файл.

Лучший способ справиться с этим-преобразовать запись модели за записью непосредственно в цель отформатируйте и запишите его непосредственно в (буферизованный) файл.

Формат с низкими накладными расходами, который быстро пишется и читается Excel, - это CSV (хорошо, это наследие, это неудобно...).