Microsoft Office Excel: Невозможно получить свойство Open класса Workbooks

1. saszj 14 22.08.14 10:34 Сейчас в теме
Цепляюсь к xls-файлу для импорта данных. Код:
Попытка
Эксел = СоздатьОбъект("Excel.Application");
Исключение
Предупреждение("На компьютере не установлен Microsof Excel." + РазделительСтрок + "Импорт цен невозможен.");
Возврат;
КонецПопытки;
КнигиЭкселя = Эксел.Workbooks;
Книга = КнигиЭкселя.Open(ФайлДанных);

Выдает ошибку "Microsoft Office Excel: Невозможно получить свойство Open класса Workbooks"
Причем, сволочь такая, если это делать внешней обработкой, то все нормально работает чаще всего, а из документа, как, собственно, и надо, выдает сабж.
Win7_64, Excel 2003
Кто-то поборол эту проблему. Инет читал. Создание папки Desktop результата не дало.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. dvk09 2 22.08.14 10:57 Сейчас в теме
	Эксель=СоздатьОбъект("Excel.Application");
	ТекущаяКнига=Эксель.Workbooks.Open(ФайлДанных);
	ТекущийЛист=ТекущаяКнига.Worksheets(1);


Ну и так далее, главное не забывать даже в результате ошибок очищать переменные...
Иначе второй раз файл не откроешь. Ну или копать глубже, открывать для чтения...
Но это один из самых долгий способов загрузки данных из xls(xlsx)- файлов.
4. saszj 14 22.08.14 12:16 Сейчас в теме
(2)(3) У меня метод open() не отрабатывает. На нем ошибка появляется.
5. AlexInqMetal 77 22.08.14 12:18 Сейчас в теме
(4) saszj, оба варианта испробовал?
8. saszj 14 22.08.14 12:46 Сейчас в теме
(5)Оба варианта чего?
Эксель=СоздатьОбъект("Excel.Application");
ТекущаяКнига=Эксель.Workbooks.Open(ФайлДанных);

//Создаем ОЛЕ подключение к Excel
Excel = СоздатьОбъект("Excel.Application");

//Открываем файл
Excel.Workbooks.Open(ПутьКФайлу);

Исходный код:
Эксел = СоздатьОбъект("Excel.Application");
КнигиЭкселя = Эксел.Workbooks;
Книга = КнигиЭкселя.Open(ФайлДанных);

Есть разница?
17. AlexInqMetal 77 25.08.14 09:37 Сейчас в теме
(8) saszj,
Есть разница?
Принципиальной разницы конечно нет, как и нет разницы запускать код из внешней обработки или из модуля документа, но чем черт не шутит... я бы все испробовал.
Сейчас обратил внимание что
Win7_64

Устанавливал 7.7 копированием? После этого какие то манипуляции проводил?
18. saszj 14 25.08.14 09:42 Сейчас в теме
(17)Установщиком под win64 воспользовался.
Ну и да, пробовал описать открытие по всякому.
20. AlexInqMetal 77 25.08.14 09:57 Сейчас в теме
(18) saszj, может установщик косой, попробуй скопировать заведомо рабочую платформу с х86 винды
21. saszj 14 25.08.14 10:22 Сейчас в теме
(20)Да проблема то не в эске, на мой взгляд - с этой же самой проблемой сталкиваются и те, кто на foxpro пишет, например. На восьмерке с ней тоже сталкиваются. Да и на других языках... Проблема связана именно с экселем при запуске его в "скрытом" режиме.
22. AlexInqMetal 77 25.08.14 10:26 Сейчас в теме
(21) saszj, попробовал на win7 x64, excel 2003 11.8411.8405 SP3, контроль учетных записей на минимуме, копирнул платформу - все работает
3. AlexInqMetal 77 22.08.14 11:24 Сейчас в теме
у меня вот так написано не из документов не из обработки проблем не было:

	
	//Создаем ОЛЕ подключение к Excel
	Excel = СоздатьОбъект("Excel.Application");  
	
	//Открываем файл
	Excel.Workbooks.Open(ПутьКФайлу); 
	
	//Открываем активную книгу
	Книга = Excel.ActiveWorkbook;
Показать
6. eshtrey 22.08.14 12:18 Сейчас в теме
7. AlexInqMetal 77 22.08.14 12:19 Сейчас в теме
(6) eshtrey, написано 2003... может там еще какие эксели торчат или не до конца удалены?
9. saszj 14 22.08.14 12:48 Сейчас в теме
(7)Нету. И не было никогда.
10. dvk09 2 25.08.14 07:07 Сейчас в теме
Тогда вопрос:
Если из формы документа запустить внешнюю обработку, передать туда контекст, обработать... Так получится?
Или опять ошибка будет?
11. saszj 14 25.08.14 08:29 Сейчас в теме
Уже и обработка перестала работать :(
Доэкспериментировался...
ЗЫ: код остался прежним.
12. dvk09 2 25.08.14 08:33 Сейчас в теме
15. saszj 14 25.08.14 08:54 Сейчас в теме
(12)Резервные копии системы? :) Код проги не менял - пытался через права доступа к каталогам все решить, как в некоторых статьях рекомендуют.

(13)Да я уже думал в эту сторону, но у меня основная заковыка в том, что файл "плавающей" структуры - количество листов, колонки в каждом листе отличаются от файла к файлу. Часть данных для загрузки вообще в комментарии ячейки "сидит". Как с этим всем работать через ODBC почитать негде. С экселем проще - можно через запись макросов докопаться до нужных свойств листа.
Если есть ссыль на докуменацию по работе с экселем через ODBC, буду благодарен.

(14)Перезагрузка даже не помогает.
16. dvk09 2 25.08.14 09:05 Сейчас в теме
(15) saszj,
Часть данных для загрузки вообще в комментарии ячейки "сидит"

Тут наверно ODBC уже не поможет...
23. basf 25.08.14 10:48 Сейчас в теме
(15) перезагрузка перезагрузкой... На момент старта обработки процессы экселя точно не висят? :)
25. saszj 14 25.08.14 14:09 Сейчас в теме
(23)(24)Эксель не запускался до запуска его из эски.

Помогло вот так:
Книга = Эксел.Workbooks.Open(СокрЛП(ФайлДанных));

Странно, что
ФС.СуществуетФайл(ФайлДанных)
ошибки не выдавал.
Всем спасибо!
13. dvk09 2 25.08.14 08:35 Сейчас в теме
На вот на это посмотри...
Мне лично такой вариант больше нравится.
	BaseExel = "";
	СтрокаКолонки=",";
	Состояние("Подключение к базе данных");
	BaseExel = CreateObject("ODBCDatabase");
	Попытка
		ConnectionString = "DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};ReadOnly=1;PageTimeout=5;MaxScanRows=8;FIL=excel 12.0;DriverId=1046;DBQ="+СтрЗаменить(КаталогИБ()+"\NissanGarant\"+Путь,"\\","\")+";"; 
		Если BaseExel.Соединение(ConnectionString)=0 Тогда
			Сообщить(BaseExel.ПолучитьОписаниеОшибки());
			Сообщить("Облом...");
			Возврат 0;
		Иначе
			Состояние("Установлено соединение с базой данных...");
		КонецЕсли;
	Исключение  
		Сообщить(ОписаниеОшибки());
        Возврат 0;
	КонецПопытки;              
	
	Состояние("Начинаем считывание данных..."); 
	
	Команда = СоздатьОбъект("ODBCRecordSet");
	Команда.УстБД(BaseExel);
	Если Найти(Путь,"Comment")=0 Тогда
		ТекстСелект = "SEL ECT * FR OM [VIN_LIST$] WH ERE VIN = '"+СокрЛП(Авто.Код)+"'";//ИмяТаблицы;
	Иначе
		ТекстСелект = "SELECT * FR OM [VIN_LIST$]";//ИмяТаблицы;
	КонецЕсли;
	Попытка
		НаборЗаписей=Команда.ВыполнитьИнструкцию(ТекстСелект);
	Исключение
		Сообщить(ОписаниеОшибки());
        Возврат 0;
	КонецПопытки;
	//Сообщить(НаборЗаписей.КоличествоСтрок());
	Если Найти(Путь,"Comment")=0 Тогда
		Возврат(НаборЗаписей);
	Иначе
		Description.Загрузить(НаборЗаписей);
        Возврат 0;
	КонецЕсли;

Показать
14. dvk09 2 25.08.14 08:38 Сейчас в теме
А вообще закрой эксель и посмотри в диспетчере задач процессы экселя не висят?
19. saszj 14 25.08.14 09:44 Сейчас в теме
Хочу заметить, что это не первая моя обработка взаимодействия с экселем через OLE, но с ошибкой такой столкнулся впервые. :(
24. dvk09 2 25.08.14 11:19 Сейчас в теме
На момент старта обработки
А на момент повторного старта?...
26. basf 26.08.14 06:33 Сейчас в теме
Хех.
Ну, ФС.СуществуетФайл() от экселя не зависит и проверяет, очевидно, невзирая на пробелы :)
А ФайлДанных, стало быть, чей-то реквизит? Да, надо иметь привычку их резать :))
27. Byte-nk 26.01.17 14:27 Сейчас в теме
Проблема актуальна для многих языков, у меня, например, в vbs возникла. Была связана с тем, что файл экселя при интерактивном открытии выдавал диалоговое окно с предложением преобразовать формат файла (т.к. это результат выгрузки из другой БД). Полагаю, что команда "зависает" на обработке диалогового окна.
После повторного сохранения документа в интерактивном режиме диалог перестал появляться и Workbooks.Open стал вновь работать так, как должен.
CheBurator; V_Izzy; son_leon; user661955_ev.nest; +4 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот