Решение проблемы медленной загрузки из файла Excel, защищенного паролем

Столкнулся с проблемой загрузки из файла Excel. Загрузка занимала около получаса и не всегда заканчивалась успешно. Решение проблемы изложу в данной статье.

Предыстория.

В один из дней мне поступила проблема с загрузкой данных из Excel. Тот факт, что загрузка занимала много времени (несколько часов) – не был крайне критичным. Проблема была в том, что обработка загрузки начала завершаться ошибкой (не кода 1С).

Я приступил к выяснению подробностей на своём рабочем ПК. При выполнении обработки ПК завис. Я сделал предположение, что ПК завис из-за перегрева процессора, что потом и подтвердилось. Обработка загрузки из Excel практически на 100% загрузила все 4 ядра процессора. Я заменил вентилятор на процессоре, с помощью отладки выяснил, какая часть кода нагружает процессор. Выяснилось, что обращение к Excel.

Из-за чего возникла проблема.

Что делает Excel, когда на книгу устанавливаешь пароль? Шифрует файл. При загрузке данных из такого файла, каждый раз, при обращении к данным, этот файл дешифруется, что и нагружает процессор.

Решение.

Я перепробовал множество вариантов, и один из вариантов был успешным. Суть заключается в следующем: сохранить файл обмена во временном каталоге, сняв при этом пароль. После загрузки удалить временный файл. Ниже приведен пример кода.

Состояние("Декодирование файла");
ВременныйФайлЭксельПуть = КаталогВременныхФайлов() + "Импорт.xls";
ВременныйФайлЭксель = Новый Файл(ВременныйФайлЭксельПуть);
Если ВременныйФайлЭксель.Существует() Тогда
Попытка
УдалитьФайлы(ВременныйФайлЭксельПуть);
Исключение
Сообщить("Не удалось удалить временный файл.");
Возврат;
КонецПопытки;
КонецЕсли;

Эксель = Новый COMОбъект("Excel.Application");
Эксель.Workbooks.Open(ВыбФайл,0, 0, 1, ПарольНаЧтение, ПарольНаЗапись);
Эксель.Workbooks(1).SaveAs(ВременныйФайлЭксельПуть,18,"","");
Эксель.WorkBooks.Close();
Эксель = Неопределено;
Состояние("Получение данных из Excel");

//код загрузки из Excel

УдалитьФайлы(ВременныйФайлЭксельПуть);

Данные из Excel я загружаю при помощи объекта ADODB, описание работы с данным объектом есть в других статьях на сайте.

В результате загрузка из файла Excel стала занимать около одной минуты.

4 Comments

  1. shard

    а вариант чтения через csa не пробовали?

    Reply
  2. HAMMER_59

    (1) shard, нет не пробовал.

    Но что-то мне подсказывает, что с зашифрованным файлом не покатит.

    А вы пробовали файлы под паролем читать?

    Reply
  3. user599011_nusmancrb

    Может, проще сначала сбросить пароль файла эксель? К примеру, через встроенный VBScript..

    Скрипт
    Reply
  4. Sven11

    Соглашусь с предыдущем комментатором, надо попробовать скинуть пароль файла.

    Можете еще вот тут посмотреть решение проблемы https://smotriuchis.ru/it-kursy/ofisnye-programmy/top-20-formul-na-kazhdyj-den

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *