powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Сравнение методов передачи данных в Excel
6 сообщений из 6, страница 1 из 1
Сравнение методов передачи данных в Excel
    #39217704
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возникла задача передачи набора данных из кода .Net в Excel. Задался вопросом, какие есть способы передачи, не используя ADODB.Recordset. Сделал несколько вариантов, а потом решил уже перебрать все подряд, что пришли в голову.

В итоге собрал тестовый стенд:
- таблица на SQL Server 2008
- приложение на Access 2010

Раньше всегда использовал метод CopyFromRecordset. Потому что быстро и просто. Но так как захотел уйти от ADO, то остановился на массивах и XML. Когда начинал, то была надежда, что массивы если не быстрее, то хотя бы не медленнее CopyFromRecordset. Увы, как выяснилось, это не так. Из двух примененных способов самый быстрый уступает CopyFromRecordset в 2 раза по скорости.

Самый скоростной из использованных способ импорта XML в 6 раз медленней, чем CopyFromRecordset. Хотелось бы пошустрее. Возможно, есть какие-то тонкости, если кто знает – поделитесь. Вообще, xlsx файл сам представлен форматом Office Open XML, но на изучение работы с ним времени пока нет. Если кто-то работал, интересно узнать о впечатлениях.

Из обнаруженного – XML, данные которого представлены атрибутами, а не элементами, обрабатывается Excel-ом в разы быстрее.
Выяснилось, что наиболее близким и сопоставимым по скорости к CopyFromRecordset является ListObject, источник данных которого также ADODB.Recordset.

Таблицу результатов привожу ниже. Если у кого-то есть мысли по теме, поделитесь. Если тема заинтересует, прилагаю скрипт на создание таблицы и само приложение – можно будет дописать код по тем же самым исходным данным для корректного сравнения.
...
Рейтинг: 0 / 0
Сравнение методов передачи данных в Excel
    #39217705
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
таблица с результатами
...
Рейтинг: 0 / 0
Сравнение методов передачи данных в Excel
    #39217798
Вы не тестировали еще один метод - присвоение двухмерного массива диапазону ячеек (через св-во Value или Formula). Правда в массиве, полученном GetRows надо поменять размерности местами, попутно преобразовав Null в "".
Вакшуль Сергейзахотел уйти от ADO А что так не нравится? А DAO.Recordset?
...
Рейтинг: 0 / 0
Сравнение методов передачи данных в Excel
    #39217817
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий, здравствуйте.
Case 2 и Case 3 это как раз варианты использующие двумерные массивы. Собственно ради них я и проводил тест.
Почему хотел уйти от ADO? Показалось непоследовательно перейти на .Net и продолжать использовать ADO.
...
Рейтинг: 0 / 0
Сравнение методов передачи данных в Excel
    #39224308
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вакшуль СергейВообще, xlsx файл сам представлен форматом Office Open XML
решил все же добить вопрос.
Подключил EPPlus.dll и оценил скорость вставки данных через:
worksheet.Cells["B2"].LoadFromDataTable(dt, false);
Это примерно в 1,5 раза быстрее, чем CopyFromRecordset.

Однако это все в памяти. А если после загрузки данных сохранить на диск как ExcelPackage, так и открытую раб.книгу Excel, то Excel сделает это быстрее и в результате CopyFromRecordset будет раза в два быстрее конкурента.

В общем у CopyFromRecordset таки есть достойный конкурент.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Сравнение методов передачи данных в Excel
    #39613084
ldfanate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
апну тему.
Столкнулся при экспорте из ацесса 2007 (ADODB.Recordset) с тем, что запрос с blob-полем (поле хранит длинные тексты со сложным форматированием) спотыкается на какойто определённой записи и не хочет дальше экспортировать на лист.

В связи с этим обнаружился ещё один метод - экспорт рекордсета в xml (ADODB.Recordset.Save), затем открытие xml-я средствами экселя (Workboks.Open) в виде xml-таблицы, затем поколоночное копирование в целевую книгу (Range.Copy - PasteSpecial xlPasteValues).
Скорость так себе, плюс поколоночно приходится обрабатывать, т.к. при открытии xml-я эксель почемуто переставляет некоторые колонки, в итоге их порядок получается не такой, как в исходном рекордсете. Приходится цикл по Recordset.Fields делать и сопоставлять названия колонок.
Но обойти проблему копирования blob/memo позволяет. Плюс наглядно, т.к. виден промежуточный результат в виде открытого в экселе xml-рекордсета.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Сравнение методов передачи данных в Excel
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]