![]() |
![]() |
|
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 = Неопределено; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |