Предыстория.
В один из дней мне поступила проблема с загрузкой данных из 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 стала занимать около одной минуты.
а вариант чтения через csa не пробовали?
(1) shard, нет не пробовал.
Но что-то мне подсказывает, что с зашифрованным файлом не покатит.
А вы пробовали файлы под паролем читать?
Может, проще сначала сбросить пароль файла эксель? К примеру, через встроенный VBScript..
Sub Password_Cracker()
Dim t!
Dim i As Integer, j As Integer, k As Integer
Dim l As Integer, m As Integer, n As Long
Dim i1 As Integer, i2 As Integer, i3 As Integer
Dim i4 As Integer, i5 As Integer, i6 As Integer
Dim kennwort As String
t = Timer
On Error GoTo err_
For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
For i5 = 65 To 66: For i6 = 65 To 66
kennwort = Chr(i) & Chr(j) & Chr(k) & Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6)
For n = 32 To 126
ActiveSheet.Unprotect kennwort & Chr(n)
MsgBox «Done in » & Format(Timer — t, «0.0 sec»)
Exit Sub
nxt_: Next: Next: Next: Next: Next: Next
Next: Next: Next: Next: Next: Next
Exit Sub
err_: Resume nxt_
End Sub
Показать
Соглашусь с предыдущем комментатором, надо попробовать скинуть пароль файла.
https://smotriuchis.ru/it-kursy/ofisnye-programmy/top-20-formul-na-kazhdyj-den
Можете еще вот тут посмотреть решение проблемы