|   |   | 
| 
 | Можно ли засосать Excel лист в таблицу значений, быстро!? | ☑ | ||
|---|---|---|---|---|
| 0
    
        Гений 1С гуру 05.07.07✎ 16:51 | 
        Потому что через Excel.Application (OLE) в час по чайной ложке.     | |||
| 1
    
        Immortal 05.07.07✎ 16:51 | 
        через ADO ещё можно попробовать     | |||
| 2
    
        Лис в курятнике 05.07.07✎ 16:53 | 
        ключевое слово "засосать", умеючи то долго....     | |||
| 3
    
        asady 05.07.07✎ 16:56 | 
        (0) абрахамс давал идею через comsafearray
  быстрее уж быть не может | |||
| 4
    
        Гений 1С гуру 05.07.07✎ 17:03 | 
        (3) где!     | |||
| 5
    
        Матрейя 05.07.07✎ 17:05 | 
        4.  www.itpb.ru/forum4 посиом пройдись.....     | |||
| 6
    
        vde69 05.07.07✎ 17:08 | 
        самый быстрый способ - через ADO
  только он местами сложнее.... по скольку поддерживает доступ только к данным, а не к обьектам | |||
| 7
    
        Гений 1С гуру 05.07.07✎ 17:09 | 
        (6) а мне и нужны только данные     | |||
| 8
    
        asady 05.07.07✎ 17:10 | 
        (4) ну поищи - у меня в архивах есть но они дома - только завтра что-то выложу.     | |||
| 9
    
        asady 05.07.07✎ 17:11 | 
        (0) вот кстати способ через ВК
  http://www.infostart.ru/projects/621/?&desc=1&ref=1173 | |||
| 10
    
        vde69 05.07.07✎ 17:11 | 
        (7) тогда ADO, + в нем можно использовать запросы SQL и получать сразу готовые выборки     | |||
| 11
    
        Гений 1С гуру 05.07.07✎ 17:13 | 
        (9) ВК не катит.     | |||
| 12
    
        Гений 1С гуру 05.07.07✎ 17:13 | 
        (10) Кинь пример     | |||
| 13
    
        Гений 1С гуру 05.07.07✎ 17:14 | 
        Странно, что в 1це есть метод записи табличного документа в Эксель, но нет обратной операции.     | |||
| 14
    
        Babay 05.07.07✎ 17:15 | 
        Пожно через ODBC драйвер. Строка подключения:
  Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=C:\MyExcel.xls;DefaultDir=c:\mypath; Потом пишешь простой запрос: SELECT * FROM [sheet1$] Или через OLE DB. Вот строка: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1"; | |||
| 15
    
        Immortal 05.07.07✎ 17:16 | 
        (9)*** Для работы компоненты потребуется установленный Microsoft .NET Framework 2.0, который можно скачать отсюда.  LOL! | |||
| 16
    
        Babay 05.07.07✎ 17:17 | 
        А если Excel 2007, то:
  Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcel2007file.xlsx;Extended Properties="Excel 12.0;HDR=YES"; | |||
| 17
    
        vde69 05.07.07✎ 17:23 | 
        (12) пример в (14)     | |||
| 18
    
        evd 05.07.07✎ 17:26 | 
        можно через CSV     | |||
| 19
    
        coder1cv8 05.07.07✎ 17:29 | 
        (0) Почитай Михайлова, там есть пример через ADO.     | |||
| 20
    
        Гений 1С гуру 05.07.07✎ 17:40 | 
        (14) а какой объект создавать?     | |||
| 21
    
        Гений 1С гуру 05.07.07✎ 17:41 | 
        (18) Орегенально, а как эксель конвертировать в CSV?     | |||
| 22
    
        Директор PR отдела 05.07.07✎ 17:45 | 
        Фиксин, жесть. Напиши в дневнике! Про (13) напиши в 1С!     | |||
| 23
    
        Гений 1С гуру 05.07.07✎ 18:07 | 
        (22) ты имеешь что то против?!     | |||
| 24
    
        Babay 05.07.07✎ 18:11 | 
        (20) смотри (10)     | |||
| 25
    
        France 05.07.07✎ 18:13 | 
        (13) ничего странного - структура тз известна, а структура файла эксель - совершенно не предсказуема - кто знает, у кого какие зверушки в черепке бегают...     | |||
| 26
    
        Гений 1С гуру 05.07.07✎ 18:25 | 
        (25) а я думал что эксель состоит из ячеек и колонок?! гыгыгы     | |||
| 27
    
        France 05.07.07✎ 18:36 | 
        (26) серьезно чтоли?.. а как насчет объединенных колонок и строк? гыкать тянет?..     | |||
| 28
    
        Гений 1С гуру 05.07.07✎ 18:37 | 
        (27) В МХЛ тоже есть объединенные ячейки, в чем проблема, франц, Гыгыгы     | |||
| 29
    
        Гений 1С гуру 05.07.07✎ 18:37 | 
        (27) изучайте, батенька, мат-часть     | |||
| 30
    
        France 05.07.07✎ 18:42 | 
        (28) при чем тут мхл?.. в (0) про таблицу значений... 
  (29) дать тебе книжек? | |||
| 31
    
        Гений 1С гуру 05.07.07✎ 18:44 | 
        (30) Речь идет о МХЛ, пардон если не так объяснил.     | |||
| 32
    
        Звездочёт 05.07.07✎ 18:45 | 
        (0) кстати, а можно ли его потом обратно высосать? :)     | |||
| 33
    
        France 05.07.07✎ 18:45 | 
        (31) тада есть смысл сменить название темы..     | |||
| 34
    
        Shaytan 05.07.07✎ 20:13 | 
        Через ADO работает на порядок быстрее чем через OLE. Но есть проблемы. Например, если в одной колонке данные типа число и строка. Т. е. предварительно надопривести к одному типу
  Об_Excel=Новый COMОбъект("Excel.Application"); Об_файл = Новый Файл(ПутьКФайлуИсточнику); Ч_НачСтрока=0; Если Об_файл.Существует() Тогда Стр_Конект = "Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq="+Об_файл.ПолноеИмя+";DefaultDir="+Об_файл.Путь+";"; Об_Конект = Новый COMОбъект("ADODB.Connection"); Попытка Об_Конект.Open(Стр_Конект); Исключение Сообщить ("Не возможно подключится к Microsoft Excel Driver!!! |Возможно файл ["+Об_файл.ПолноеИмя+"] открыт другим пользователем!!!"); Возврат; КонецПопытки; Попытка Стр_SQL = "SELECT * FROM [A:I] WHERE (Марка <> '') AND ((Модель <> '') OR (Модификация <> '')) ORDER BY Марка"; Об_РекордСет=Об_Конект.Execute(Стр_SQL); Исключение Сообщить ("Не возможно получить данные из файла ["+ ОписаниеОшибки()+"!!!"); Возврат; КонецПопытки; Пока Об_РекордСет.EOF = Ложь Цикл МаркаНаименование = СокрЛП(Об_РекордСет.Fields("Марка").value); КонецЦикла | |||
| 35
    
        smaharbA 05.07.07✎ 20:40 | 
        самый быстрый способ это ОЛЕ в восьмерке вообще проста
  Массив = Лист.UsedRange.Value; Для каждого М из Массив Цикл .... | |||
| 36
    
        smaharbA 05.07.07✎ 20:41 | 
        (34) может спарнем, что ОЛЕ быстрее, не один уже обломался с АДО, заспорив ))     | |||
| 37
    
        Immortal 05.07.07✎ 21:19 | 
        (35)  что то сомневаюс. | |||
| 38
    
        smaharbA 05.07.07✎ 21:21 | 
        (35) сомневайся... не первый...     | |||
| 39
    
        vde69 05.07.07✎ 21:30 | 
        (38) я то-же сомневаюсь, хоть сам пользуюсь ОЛЕ...
  причины сомнения: 1. загрузка самого екселя 2. много проверок при получении данных (например на ошибку в формуле) 3. конфликт отладчиков, виснет при отладке... 4. возможность получать данные только по 1 ячейки, а не блоком кроме того у екселя есть и еще проблемы: 1. при исключение 1с зависает процесс 2. не возможно использовать многопользовательский доступ ADO - 1. сложнее в понимание и программирование 2. меньше функционала | |||
| 40
    
        Garlic 05.07.07✎ 21:58 | 
        Если обычные данные(7) - может скинуть их скриптом в txt-файл с разделителем, а потом взять 1С?     | |||
| 41
    
        smaharbA 05.07.07✎ 22:52 | 
        (39) даже и не сомневайся... погляди внимательно на (35)     | |||
| 42
    
        smaharbA 05.07.07✎ 22:53 | 
        +(41) и еще - у адо есть неприятное ограничение в количестве колонок     | |||
| 43
    
        vde69 06.07.07✎ 00:00 | 
        (41) там ты все равно получаешь массив ссылок, а в ADO ты получаешь массив значений! хотя спорить не буду, не сравнивал...
  могу сказать, что выборка 40 000 строк и 32 столбцов по оле идет примерно 3-5 минут, на первый взгляд ADO будет быстрее... хотя конечно спорить не буду... | |||
| 44
    
        MMF 06.07.07✎ 00:01 | 
        (41) проспоришь. Когда-то на т1С заспорил также с глумом, потом экспериментировал. Использование вариантных массивов для обмена с экселем приближается по скорости с АДО, но все-же проигрывает     | |||
| 45
    
        MRAK 06.07.07✎ 00:10 | 
        ADO быстрее     | |||
| 46
    
        smaharbA 06.07.07✎ 02:56 | 
        (44) Миша, уже спорили и тут и на кубани и на рилнете, моя метода быстрее любого адо, но на больших массивах, когда более 5000 строк и 10 колонок
  загрузка 60000 строк на 20 колонок идет секунды | |||
| 47
    
        IUnknown 06.07.07✎ 06:38 | 
        засосать ексель... оригинальное половое извращение...     | |||
| 48
    
        evd 06.07.07✎ 06:57 | 
        (21) Файл - Сохранить как... - CSV (разделители - запятые)(*.csv)     | |||
| 49
    
        774816 06.07.07✎ 08:00 | 
        Если стоит задача вывести информацию из бд пользователю, то лушчий способ это использование 
  ADO + MS DataGrid в v8 есть возможность вставить ActiveX control найди в списке Microsoft DataGrid Control назови его DG (если он конечно есть) создай адо рекорсет присовой DataGrid.DataSource рекорсет после присвоения рекордсета к гриду грид автоматом получает все записи за секунду (без циклов и вводов данных) это пример для SQL server-а Перем REC,СтрСоединения,Con; Con=Новый COMОбъект("ADODB.Connection"); REC=Новый COMОбъект("ADODB.Recordset"); СтрСоединения="Driver={SQL Server};Server=server;Database=ИмяБД;Uid=sa;Pwd=;" ; Если Con.State=1 Тогда Con.Close(); КонецЕсли; Con.Open(СтрСоединения) ; REC.Open("Таблица",Con,3); DataGrid=ЭлементыФормы.DG; DataGrid.DataSource=rec; DataGrid.ReBind(); НО данная .ocx есть не на всех машинах так что нужно еще ее поставить на машину клиента Приемущества ADO в том что ado универсальный инструмен работы с бд, использовать adо только для выборки всего листа нет смысла поскольку, сила ado в том что в ней можно использовать SQL запрос, не только для выборки но и для ввода удаления обновления создания таблиц удаления таблиц итд.... ЗЫ недавно ствил эксперимент что быстрее XBase или Ado (в части выборки данных) при работе с дбфниками XBase на две три секунды быстрее | |||
| 50
    
        Гений 1С гуру 06.07.07✎ 09:30 | 
        блин, когда уже эти мелкософтовцы перейдут на XML, чтобы можно было парсить.     | |||
| 51
    
        smaharbA 06.07.07✎ 10:19 | 
        (49) еще один блин...
  ну че может спорнем со всеми сразу на коньяк ? | |||
| 52
    
        Nordok 06.07.07✎ 10:23 | 
        Мля, уже который раз читаю как "Можно ли зассать Excel..." что за провакационное название.     | |||
| 53
    
        774816 06.07.07✎ 11:36 | 
        (51) покажи весь код с использованием массива
  Массив = Лист.UsedRange.Value; Для каждого М из Массив Цикл что здесь ??? | |||
| 54
    
        vde69 06.07.07✎ 12:50 | 
        (53)+1 согласен!!!
  ведь кроме получения ССЫЛКИ с ней надо чего-то сделать!!! | |||
| 55
    
        Drock 06.07.07✎ 12:59 | 
        (15) зато быстрее чем все остальное работает     | |||
| 56
    
        smaharbA 06.07.07✎ 13:37 | 
        (53) тоже самое что и с АДО, рассовывание по ячейкам ТЗ
  вот для семерки, к примеру - 
 у меня 60000х30 за 50 сек выдернуло а 40000х10 за 24 сек кстати былоб быстрее, на серваке у меня глобальный флаг объектов выставлен, это замедляет | |||
| 57
    
        smaharbA 06.07.07✎ 13:38 | 
        +(56) причем по ОЛЕ я могу определить истинно заполненный диапазон, а не тот у которого просто оформление, и не перебором     | |||
| 58
    
        774816 06.07.07✎ 13:52 | 
        отвечаю на (51) я привел пример использования MS DataGrid-а
  если ты думаешь что перебирая массив будет быстрее чем использование DataGrid.DataSource-а тот ты сильно ошибаешся, жаль нет времени на дисскусия но попробую твой код дома, кто знает может так быстрее))) | |||
| 59
    
        iSeRG 22.05.08✎ 13:42 | 
        Кто пробовал 56?
  У меня ругается: Метод объекта не обнаружен (lbound) | |||
| 60
    
        iSeRG 22.05.08✎ 14:04 | 
        Разобрался, кому интересно:  Диапазон = ЛистПрайса.UsedRange; МассивДанных = Диапазон.Value.Выгрузить(); ВсегоСтрок = МассивДанных[0].Количество() - 1; Для НомерСтрокиПрайса = 0 По ВсегоСтрок Цикл Значение = МассивДанных[НомерКолонки][НомерСтроки]; ... | |||
| 61
    
        iSeRG 22.05.08✎ 14:05 | 
        Работает очень быстро, спс smaharbA     | |||
| 62
    
        Гений 1С гуру 22.05.08✎ 15:12 | 
        (60) Да я ужо давно разобрался и на инфостартец лежит обработка по названию Чтец Excel... ;-)     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |