Имя: Пароль:
1C
 
Долго считывает ячейки из эксель
,
0 МешочекЗнаний
 
22.02.17
13:46
День добрый.

Считываю по 1 ячейке в цикле.

ExcelПриложение = Новый COMОбъект("Excel.Application");
ExcelФайл = ExcelПриложение.WorkBooks.Open(Объект.РасположениеФайлаАртикула)
ExcelЛист = ExcelФайл.Sheets(1);
........
Пока Истина Цикл
Ячейка = ExcelЛист.Cells(СчетчикСтрок, 2).Value; - занимает 90% времени
........

Чтение одной ячейки занимает 0,7 сек. Учитывая что ячеек больше 1000 затягивается надолго. Можно как то ускорить выборку? Может не через COM объект выбирать данные.

В общем как можно ускорить загрузку.
1 piter3
 
22.02.17
13:47
Знаешь кто сейчас должен придти в тему?:)
2 Fragster
 
гуру
22.02.17
13:47
а гугл что говорит?
3 Cyberhawk
 
22.02.17
13:48
Если файл xlsx, то сам бог велел использовать нативное считывание
4 Lama12
 
22.02.17
13:49
(0) Это COM. Технология медленная. Используй ODBC ну или ADO.NET.
Еще можно екселевский файл выгрузить в CSV и работать с ним как с текстом.
5 Lama12
 
22.02.17
13:49
Ну или (3)
6 Cyberhawk
 
22.02.17
13:50
+(3) "нативное" = "native xlsx" http://catalog.mista.ru/public/300092/
7 1dvd
 
22.02.17
13:50
(3) +1
Там только при условии, что лист один
8 Fragster
 
гуру
22.02.17
13:50
через Range.value получаем ком-массив, из него получаем массив массивов и работаем с ним
9 МешочекЗнаний
 
22.02.17
13:50
(3) (4) Можно пример?
10 piter3
 
22.02.17
13:50
Скопируй в 1с через табл.документ и наслаждайся
11 МешочекЗнаний
 
22.02.17
13:51
(8) Заранее неизвестно сколько нужно строк. Может 5, может 5000
12 NorthWind
 
22.02.17
13:51
ADO
13 Lama12
 
22.02.17
13:51
(9) Смотри в (6) там куча примеров разных.
14 Cyberhawk
 
22.02.17
13:52
(7) Нет, Я считывают с любого листа любые ячейки
15 Fragster
 
гуру
22.02.17
13:52
(11) range, он разный бывает... например .usedRange - тоже range
16 МешочекЗнаний
 
22.02.17
13:53
(10) Артикулы в экселе идут с маской типа ххх-хххххх-хх. При копировании в таб док лишние символы получаются типа ххх-хххххх-6?8
17 МешочекЗнаний
 
22.02.17
13:54
Всем спасибо за советы, буду смотреть.
18 Vanilla26
 
22.02.17
14:08
(16) Это когда ТабДок.Прочитать(твойексель.xls) лишние символы?
19 Злопчинский
 
22.02.17
14:22
(11) скопируй ВСЕ СТРОКи
20 Torquader
 
23.02.17
00:35
Если хочется читать быстрее, то формируешь Range, который хочешь прочитать, и читаешь через Value - на выходе SafeArray двумерный с данными ячеек - через границы процесса едет один раз - скорость вас поразит.
21 Fram
 
23.02.17
01:36
(20) а писАть также можно?
22 Torquader
 
23.02.17
02:10
(21) А почему нет ? Только сначала создать массив, а потом засунуть. По крайней мере, VbScript так работает, но там массив изначально встроен: ReDim a(2,4)
23 МешочекЗнаний
 
09.03.17
11:00
(20) Можно поподробнее как это сделать?
Попробовал считать ExcelЛист.Range("A1:T40").Value. На выходе просто значения всех ячеек без привязки к их местоположению (нет ни номера строки, ни колонки).
И ещё как считать весь лист без указания диапазона?
24 Когнитивный Диссонанс
 
09.03.17
11:32
Быстро загрузить можно так

XLSОбъект = Новый COMОбъект("Excel.Application");
XLSОбъект.Visible       = Ложь;
XLSОбъект.DisplayAlerts = Ложь;
    
Book = XLSОбъект.Workbooks.Open(ПутьКФайлуЗагрузки, , Истина);

Sheet = Book.Sheets(Лист);

МассивДанных = Sheet.UsedRange.Value2.Выгрузить();
25 МешочекЗнаний
 
09.03.17
11:56
(24) Действительно очень быстро. Спасибо!
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.