Excel в стиле Ultra

Эксель — самое популярное средство подготовки отчетов, печатных форм, сверок с клиентами и поставщиками. За все время работы с ним накопилось достаточно тонкостей, которые в разы (иногда в десятки раз) увеличивают скорость работы. Итак:

1) самый медленный способ выкинуть что-то в эксель — это использовать стандартный функционал Excel Buffer :-) Самый быстрый — получить (или сформировать самостоятельно) ADODB.Recordset, и затем использовать метод objRange.CopyFromRecordset. Для некоторых версий приходится сначала присвоить рекордсет переменной типа Variant. Я делаю это всегда:

GetQuery(txtQuery, adoResult);
vntResult := adoResult;
xlRange := xlSheet.Range('$A$1');
xlRange.CopyFromRecordset(vntResult);

Результаты превзойдут все ваши смелые ожидания. Только помните, что эксель не принимает больше (attention!) 65000 строк (UPD: Excel 2007 принимает мильён!)

Небольшая ремарка — после того, как в одном из предыдущих выпусков была описана венгерская нотация для Navision, думаю, больше нет нужды в коде указывать типы переменных :-)

2) обработка идет быстрее, если приложения не видно на экране. Т.е. xlApplication.Visible := FALSE. Видеть эксель на экране стоит лишь во время написания и отладки кода, в рабочей версии свойство Visible лучше устанавливать в TRUE в последнюю очередь.
Кстати, с этим связана одна проблема, полного решения которой получить до сих пор не удалось. При возникновении ошибки этот невидимый эксель остается висеть в памяти, и удалить его можно только через диспетчер задач. Если у вас есть решение — пишите на
mailbox@naviart.ru — опубликуем!

3) обработка идет быстрее, если в шаблоне указан Вид — «Обычный». Ни в коем случае не указывайте «Разметка страницы» — рискуете не дождать сформированного документа. Бывали случаи, когда терпеливый юзер ждал формирования документа из 300 строк около часа. Когда нормой для такого количества является несколько секунд. Почему так приосходит? В режиме «Разметка страницы» эксель постоянно рассчитывает область печати и делит документ на страницы. Результат — тормоза. Из этого, кстати, следует следующий пункт :-)

4) когда вы формируете многостраничный документ с форматированием, не вставляйте разрывы страниц по мере формирования документа. Лучше записывайте номера строк, где это надо сделать, во временную таблицу, и УЖЕ ПОСЛЕ ФОРМИРОВАНИЯ документа запускайте отдельную функцию, которая расставит разрывы в нужных местах. Экономия времени коллоссальная.

5) то же самое касается и всего остального форматирования. По мере возможности выносите его отдельно, укрупняйте, старайтесь форматировать документ крупными блоками, вместо того, чтобы прорисовывать границы у каждой ячейки.

6) с опаской используйте метод Columns.Autofit. На большом диапазоне он может подвесить эксель. Лучше заранее выставьте ширину столбцов так, как требуется в большинстве случаев. Здесь еще может помочь свойство ячейки — «Отображение» — «Автоподбор Ширины». Для печати бумажных документов это просто незаменимая вещь.

Кстати, столь любимая мной конструкция WITH … END не работает с Automation-серверами. Не знаю, почему, но в самый неподходящий момент вы можете получить сообщение об ошибке на ровном месте :-(

Автор:

В области Navision - с 2003 года. Профессиональные интересы: NAV, MS SQL, .NET, BPMN, IT-менеджмент. Предметная область: логистика, финансы, склады, 3PL.

Количество статей, опубликованных автором: 86.

Добавить комментарий