Имя: Пароль:
1C
 
Excel через OLE DB
0 ivant
 
10.11.08
17:49
СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + ФайлЗагрузки + "; Extended Properties=""Excel 8.0;HDR=NO;""";

   // Чтение данных
   // Создание объекта установки связи с источником данных
   Connection = Новый COMОбъект("ADODB.Connection");
   
   // Подключение к источнику данных
   Попытка
       Connection.Open(СтрокаПодключения);
   Исключение
       Сообщить(ОписаниеОшибки());
       Возврат;
   КонецПопытки;
   
   // Создание объекта выполнения команды
   Command = Новый COMОбъект("ADODB.Command");
   // Указание активного соединения
   Command.ActiveConnection = Connection;
   // Определение текста команды
   Command.CommandText = "SELECT * FROM Test$";
   // Определение типа команды
   Command.CommandType = 1;
   
   // Создание объекта набора записей
   RecordSet = Новый COMОбъект("ADODB.RecordSet");
   //Выполнение и получение набора данных
   RecordSet = Command.Execute();
   
   // Перебор данных
   Пока RecordSet.EOF() = 0 Цикл
       Сообщить("Строка: " + Recordset.Fields(1).Value);
       Сообщить("Число: " + Recordset.Fields(4).Value);
       RecordSet.MoveNext();  
   КонецЦикла;
   
   // После того, как набор записей уже не нужен, его нужно закрыть
   RecordSet.Close();
   Connection.Close();
1 undertaker
 
10.11.08
17:50
мысли вслух?
2 Дуб
 
10.11.08
17:50
(0) чего хотел-то?
3 Salvador Limones
 
10.11.08
17:51
(1)(2) Человек хвастается! Не мешайте.
4 ivant
 
10.11.08
17:57
Собсно, вопрос такой - если файл экселя создавать через АДО - все работает, а если ручками, то получается следующее:

1."Произошла исключительная ситуация (Microsoft JET Database Engine): Объект 'Test' не найден ядром базы данных Microsoft Jet.  Проверьте существование объекта и правильность имени и пути." - где Тест имя таблицы в экселе. При проверке оказалось, что он находит таблицу "Test$", но если подставить это значение в строку

Command.CommandText = "SELECT * FROM Test$"; //то

2."Произошла исключительная ситуация (Microsoft JET Database Engine): Ошибка синтаксиса в предложении FROM."

ах да, еще пробовал через СОМ - работает, но уж очень тормозит..
5 ДенисЧ
 
10.11.08
17:58
Command.CommandText = "SELECT * FROM [Test$]";
Command.CommandText = "SELECT * FROM ""Test$""";

что-нибудь такое попробуй...
6 ivant
 
10.11.08
17:59
(1)(2)(3) задумался :)
7 v_rtex
 
10.11.08
18:00
возможно.. доллар убери у имени таблицы -)
и там.. и там..
8 ivant
 
10.11.08
18:07
(5)пишет синтаксическая ошибка в 1 случае и неполный текст запроса во втором

(7) что касается имени таблицы, то де факто я его и называю без доллара (имя листа в экселе), но когда я подключаюсь к файлу, то он отображает имя таблицы по:

   Catalog = Новый COMОбъект("ADOX.Catalog");
   Catalog.ActiveConnection = СтрокаПодключения;
   
   ИмяТаблицы = Catalog.Tables.Item(0).Name;

уже с долларом..
9 ivant
 
10.11.08
18:10
(7)я хочу сказать, что в экселе я и называю лист просто "Test", но, подключаясь к файлу, он видит имя как "Test$"
10 Ковычки
 
10.11.08
18:20
(7) не ври
11 ivant
 
10.11.08
18:25
может я зря ипу моск и есть проверенный, надежный и быстрый метод?
12 v_rtex
 
10.11.08
18:31
(10) там написано "возможно" -) твой автоответчик тупит..
13 Armando
 
10.11.08
19:03
почитай, может найдешь чего http://support.microsoft.com/kb/316934
14 ivant
 
11.11.08
11:41
(13) спасибо большое! разобрался!

(5) и тебе спасибо! правильный ответ:
Command.CommandText = "SELECT * FROM [Test$]"; //опять рассеянность подвела)
15 ivant
 
11.11.08
11:43
работает, кстати, на ура! не то что СОМ.
16 Ковычки
 
11.11.08
12:14
(15) может спорнем на коньяк что ком быстрее ?
17 vde69
 
11.11.08
12:19
(16) ты про получение массивов?

много споров было, так и не определились, что быстрее. Но конечно через КОМ можно работать не только получая данные по 1 ячейки :)
18 Torquader Darigha
 
11.11.08
12:30
Быстрее загнать сценарий в Excel-файл, который мы читаем, чтобы он сохранил все необходимые данные в текстовый файл, а 1С этот файл прочитает.
Если нужны только данные, то можно попробовать просунуть весь лист, как массив (65536х256), но это не очень быстро.
P.S. собрались улитка и черепаха и поспорили, кто быстрее ^_^
19 ivant
 
11.11.08
12:33
(18) не-не, суть дело в том, что это файл обмена и редактировать каждый файл, я не собираюсь. как говорится, работаем с тем что есть.

"P.S. собрались улитка и черепаха и поспорили, кто быстрее ^_^", а через что быстрее?
20 ivant
 
11.11.08
12:35
(17) да там файл небольшой. суть дело в скорости чтения самого файла - пока
идет "ПолучитьCOMОбъект(Файл)", я уже все данные обработать успеваю :)
21 smaharbA
 
11.11.08
12:42
(17) да... вот только ком в этом разе полюбому быстрее
да и у адо есть много неприятностей, а тут вообще большая неприятность
надеюсь автор на нее напорется...
22 smaharbA
 
11.11.08
12:43
(20) скорость чтения по оле выше чем по адо. готовь коньяк
23 Torquader Darigha
 
11.11.08
12:47
А слабо тогда текстовый файл использовать - тот же ADO его также съест, но при этом можно смело открывать и править.
Чем вам так Excel понравился ? Или Microsoft поощряете.
24 ivant
 
11.11.08
13:04
(22) ваще-то, я заварил всю эту кашу, потому что по оле дольше.

однако, сейчас перепроверил - ком стал работать нормально.
просто чудеса какие-то... ну зато с адо разобрался.

(21) я столкнулся с тем, что он не понимает разные форматы в одном столбце..
для меня не критично, но так, конечно, бред. да и ком нормально работает.
25 ivant
 
11.11.08
13:08
(23) Excel тоже можно смело открывать и править.
А используется выгрузка в Excel потому, что прогер, который делает выгрузку, использует готовую обработку по выгрузке данных. Не вижу смысла переделывать его обработку, если я все равно делаю свою с нуля.
26 smaharbA
 
11.11.08
14:11
(24) просто надо знать метод, по оле весь лист в 1с заливается в одну строчку кода
27 smaharbA
 
11.11.08
14:11
(23) изыди... учи ексель может прозреешь
28 ivant
 
11.11.08
14:29
(26) ну я делаю так:

       РабочаяКнига = ПолучитьCOMОбъект(Файл);
   ЛистЕкселя=РабочаяКнига.Worksheets(1);
   Область=ЛистЕкселя.UsedRange;

       //ну а дальше уже в цикле обхожу данные, обрабатываю и запихиваю в ТЗ
       //а потом ТЗ загружаю в документ, который создается на основании этого
       //файла обмена. таким образом, вроде оптимально получается - данные
       //все-равно надо обрабатывать перед загрузкой в ТЧ документа

А весь лист в строчку кода это как? через COMSafeArray?
29 smaharbA
 
11.11.08
14:32
(28) да
30 ivant
 
11.11.08
14:46
благодарю
31 gorec
 
14.11.08
07:37
Здравствуйте.
ivant скажи плиз ты с помощью адо пробывал изменять данные в Excel? а то когда я пытаюсь у меня выдает ошибку:  Microsoft JET Database Engine: В операции должен использоваться обновляемый запрос.

пролазил весь инет пока удобоворимого объяснения и споба леченья не нашел :-(
может сталкивался или знаешь как надо изменять через адо. Подскажи пожалуйста.

Заранее благодарен.
Вот код:
db=CreateObject("ADODB.Connection");
rs=CreateObject("ADODB.Recordset");
db.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;
|Data Source="+ПутьКФайлу+";
|Extended Properties=""Excel 8.0;HDR=No;IMEX=1;""
|";
db.CursorLocation=3;
db.Mode=3;
db.Open();

rs.ActiveConnection = db;
rs.CursorType = 2;
rs.LockType = 3;
rs.Source = "
|UPDATE    
|  [L1$] as Авт
|  SET F3=1
|";
rs.Open();
32 ivant
 
20.11.08
14:06
(31) может поможет:

// Добавление данных запросом
   // Создание объекта установки связи с источником данных
   Connection = Новый COMОбъект("ADODB.Connection");
   
   // Подключение к источнику данных
   Попытка
       Connection.Open(СтрокаПодключения);
   Исключение
       Сообщить(ОписаниеОшибки());
       Возврат;
   КонецПопытки;
   
   // Создание объекта выполнения команды
   Command = Новый COMОбъект("ADODB.Command");
   // Указание активного соединения
   Command.ActiveConnection = Connection;
   // Определение текста команды
   Command.CommandText = "INSERT INTO TestTable VALUES(20, 'Новая строка', 33.3, 44.4, 55.5)";
   // Определение типа команды
   Command.CommandType = 1;
   // Выполнение запроса
   Command.Execute();
   
   // Закрываем соединение
   Connection.Close();
   Command = Неопределено;