|
Сравнение методов передачи данных в Excel
|
|||
---|---|---|---|
#18+
Возникла задача передачи набора данных из кода .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. Таблицу результатов привожу ниже. Если у кого-то есть мысли по теме, поделитесь. Если тема заинтересует, прилагаю скрипт на создание таблицы и само приложение – можно будет дописать код по тем же самым исходным данным для корректного сравнения. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2016, 03:42 |
|
Сравнение методов передачи данных в Excel
|
|||
---|---|---|---|
#18+
таблица с результатами ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2016, 03:43 |
|
Сравнение методов передачи данных в Excel
|
|||
---|---|---|---|
#18+
Вы не тестировали еще один метод - присвоение двухмерного массива диапазону ячеек (через св-во Value или Formula). Правда в массиве, полученном GetRows надо поменять размерности местами, попутно преобразовав Null в "". Вакшуль Сергейзахотел уйти от ADO А что так не нравится? А DAO.Recordset? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2016, 09:46 |
|
Сравнение методов передачи данных в Excel
|
|||
---|---|---|---|
#18+
Анатолий, здравствуйте. Case 2 и Case 3 это как раз варианты использующие двумерные массивы. Собственно ради них я и проводил тест. Почему хотел уйти от ADO? Показалось непоследовательно перейти на .Net и продолжать использовать ADO. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2016, 09:57 |
|
Сравнение методов передачи данных в Excel
|
|||
---|---|---|---|
#18+
Вакшуль СергейВообще, xlsx файл сам представлен форматом Office Open XML решил все же добить вопрос. Подключил EPPlus.dll и оценил скорость вставки данных через: worksheet.Cells["B2"].LoadFromDataTable(dt, false); Это примерно в 1,5 раза быстрее, чем CopyFromRecordset. Однако это все в памяти. А если после загрузки данных сохранить на диск как ExcelPackage, так и открытую раб.книгу Excel, то Excel сделает это быстрее и в результате CopyFromRecordset будет раза в два быстрее конкурента. В общем у CopyFromRecordset таки есть достойный конкурент. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2016, 02:14 |
|
Сравнение методов передачи данных в Excel
|
|||
---|---|---|---|
#18+
апну тему. Столкнулся при экспорте из ацесса 2007 (ADODB.Recordset) с тем, что запрос с blob-полем (поле хранит длинные тексты со сложным форматированием) спотыкается на какойто определённой записи и не хочет дальше экспортировать на лист. В связи с этим обнаружился ещё один метод - экспорт рекордсета в xml (ADODB.Recordset.Save), затем открытие xml-я средствами экселя (Workboks.Open) в виде xml-таблицы, затем поколоночное копирование в целевую книгу (Range.Copy - PasteSpecial xlPasteValues). Скорость так себе, плюс поколоночно приходится обрабатывать, т.к. при открытии xml-я эксель почемуто переставляет некоторые колонки, в итоге их порядок получается не такой, как в исходном рекордсете. Приходится цикл по Recordset.Fields делать и сопоставлять названия колонок. Но обойти проблему копирования blob/memo позволяет. Плюс наглядно, т.к. виден промежуточный результат в виде открытого в экселе xml-рекордсета. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2018, 21:59 |
|
|
start [/forum/topic.php?fid=45&fpage=55&tid=1611614]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
57ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 160ms |
0 / 0 |