При автоматизации загрузки прайс-листов, каталогов и отчетов объемом в десятки тысяч строк разработчики часто сталкиваются со значительным зависанием программы на этапе выполнения метода Workbooks.Open. При работе через OLE-объект Excel.Application открытие тяжелого файла может занимать от десятков секунд до нескольких минут. Разберем основные причины такого поведения и рассмотрим практические способы оптимизации процесса.
Выясним, какие факторы приводят к существенным задержкам при вызове метода открытия книги:
Рассмотрим, как правильно настроить свойства приложения Excel перед загрузкой тяжелой книги. Для исключения визуальных перерисовок и лишних диалогов отключаем обновление экрана и вывод системных сообщений.
Частая проблема: при попытке отключить автоматический расчет формул через Excel.Calculation = -4135 (константа xlCalculationManual) возникает ошибка Нельзя установить свойство Calculation класса Application. Это связано с тем, что в объектной модели Excel режим пересчета нельзя переключить, пока не открыта хотя бы одна книга. Чтобы обойти это ограничение, создадим временную пустую книгу, переведем расчет в ручной режим, а затем загрузим целевой файл.
Посмотрим на пример кода на платформе 1С:
Excel = СоздатьОбъект("Excel.Application");
Excel.Visible = 0;
Excel.DisplayAlerts = 0;
Excel.ScreenUpdating = 0;
Excel.EnableEvents = 0;
// Создаем временную книгу для переключения режима пересчета
ВременнаяКнига = Excel.Workbooks.Add();
Excel.Calculation = -4135; // xlCalculationManual
ВременнаяКнига.Close(0);
// Открываем целевой файл с явными параметрами
// 1-й параметр: Имя файла
// 2-й параметр (UpdateLinks): 0 - не обновлять связи
// 3-й параметр (ReadOnly): 1 - открыть только для чтения
Книга = Excel.Workbooks.Open(ДокументПрайсЛист, 0, 1);
Лист = Книга.WorkSheets(1);
Разберем по шагам ключевые параметры метода Workbooks.Open:
Workbook_Open.Проанализируем системные настройки. Если даже пустой файл или файл небольшого размера открывается с задержкой, переключите в операционной системе принтер по умолчанию на виртуальный (например, Microsoft Print to PDF или виртуальный XPS-принтер). Это полностью снимет задержки сетевого стека при определении параметров страницы.
Если есть возможность управлять форматом выгрузки прайс-листа или выполнить предварительное пересохранение, обратите внимание на формат хранения данных:
.xlsb) открываются и парсятся значительно быстрее стандартных XML-архивов .xlsx за счет отсутствия распаковки XML-структуры.При регулярной обработке больших прайс-листов (от 50 000 строк и более) использование OLE Automation становится узким местом по скорости. Рассмотрим более производительные подходы к загрузке данных:
Текст в 1С 7.7 обрабатывает 75 000 строк за пару секунд.