Имя: Пароль:
1C
 
Можно ли засосать 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) тоже самое что и с АДО, рассовывание по ячейкам ТЗ
вот для семерки, к примеру -

//*******************************************
Процедура Сформировать()
   Перем Файл,Путь;
   Если ФС.ВыбратьФайл(0,Файл,Путь,"","(*.xls)|*.xls","XLS")=0 Тогда
       Возврат;
   КонецЕсли;
   т1=_GetPerformanceCounter();
   ТЗ=СоздатьОбъект("ТаблицаЗначений");
   Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
   Скрипт.language="javascript";
   Скрипт.timeout=-1;
   Ексель=СоздатьОбъект("Excel.Application");
   Книги=Ексель.Workbooks;
   Книга=Книги.Open(Путь+Файл);
   Окно=Книга.Windows.Item(1);
   Окно.Visible=0;
   Листы=Книга.Worksheets;
   Лист=Листы.Item(1);
   Диапазон=Лист.UsedRange;
   Скрипт.addobject("Диапазон",Диапазон);
   Массив=Скрипт.eval("new VBArray(Диапазон.Value)");
   Ексель.DisplayAlerts=0;
   Книга.Close(0);
   Ексель.DisplayAlerts=-1;
   Для к=1 По Массив.ubound(2) Цикл
       ТЗ.НоваяКолонка();
   КонецЦикла;
   Для л=Массив.lbound(1) По Массив.ubound(1) Цикл
       ТЗ.НоваяСтрока();
       Для к=Массив.lbound(2) По Массив.ubound(2) Цикл
           ТЗ.УстановитьЗначение(ТЗ.КоличествоСтрок(),к,Массив.getItem(л,к));
       КонецЦикла;
   КонецЦикла;
   Сообщить(_GetPerformanceCounter()-т1);
   ТЗ.ВыбратьСтроку();
КонецПроцедуры

у меня 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... ;-)
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший