Имя: Пароль:
1C
 
Как ускорить чтение из Экселя?
0 Гений 1С
 
гуру
24.10.07
15:41
В общем большие файлы (7000 строк на 15 столбцов) читаются долго.
Насильно ли ускорится загрузка, если юзать АДО?
1 zbv
 
24.10.07
15:48
(0) Abrahams - предлагал считывать с помощью массива... реально ускоряет...
2 774816
 
24.10.07
15:50
по карйне мере не придеться загружать весь application, а работать через адо надо что б файл имел  структуры эксель бд, + если выборка данных по условию то скул запрос и цикл по рекодсету на порядок быстрее должно быть
3 Гений 1С
 
гуру
24.10.07
16:02
может переконвертить в CSV?
4 Гений 1С
 
гуру
24.10.07
16:03
(3) а потом читать как обычный текстовый? меня ведь только значения в ячейках интересуют...
5 Lendy
 
24.10.07
16:42
(0) ускорится очень. Пример из жизни - 5 минут чтения файла 50тыс строк на 60 столбцов. Кусками через СОМ, через АДО 5-7 секунд.
6 Scooter
 
24.10.07
16:44
(3)сохрани в ДБФ, если возможно
7 smaharbA
 
24.10.07
16:49
(5) заспорим что по ОЛЕ быстрее ?
а еще у адо есть неприятное ограничение (правдо оно невсегда мешает)
8 Lendy
 
24.10.07
16:57
(7) не готов )) Понравилось, что одним запросом можно быстро получить данные с любым фильтром, объединить данные с разных листов и т.п.
9 nii
 
24.10.07
17:10
Подскажите, а записывать данные из 1с в Execl можно с помощью массива?
10 smaharbA
 
25.10.07
07:18
(9) да, но это медленнее, чем читать
11 Kasper076
 
25.10.07
08:00
Если использовать компоненту GameWithFire, то можно сразу ТЗ получить. Я последнее время с Ехелем только через нее работаю.
12 Гений 1С
 
гуру
25.10.07
09:55
(11) 77/80 фри или за бабки?
13 Гений 1С
 
гуру
25.10.07
11:02
Пытаюсь читать через АДО, выдает ошибку:

{Обработка.ЧтецЭлектронныхТаблиц(67)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft JET Database Engine): Не был задан текст команды для командного объекта.
       АДОЗапись.Open();

Вот код:

       АДОЗапись=Новый COMОбъект("ADODB.Recordset");
       АДОЗапись.ActiveConnection=АДОСоединение;
       АДОЗапись.CursorType = 3;
       АДОЗапись.LockType = 2;
       АДОЗапись.Source = "Select * from ["+ТекТаблица.Имя+"]";
       АДОЗапись.Open();

Можно вместо имени таблицы указывать ее номер, или причина не в этом?
14 Гений 1С
 
гуру
25.10.07
11:25
Разобрался, надо так:

       //АДОЗапись.Source = "Select * from ["+ТекТаблица.Имя+"]";
       АДОЗапись.Open("Select * from ["+ТекТаблица.Имя+"]");
15 Гений 1С
 
гуру
25.10.07
11:28
Интересно, а можно, чтобы дата преобразовывалась в строку по нужному правилу?
И число тоже по определенному формату?
16 Гений 1С
 
гуру
25.10.07
11:31
т.е. я хочу чтобы при чтении по ADO дата преобразовывалась в строку YYYYMMDDHHMMSS, а число - строго в NNNNNNNNNNNNNNNNNN.NNNNNNNN т.е. без разделителей триад и с точкой как разделителем дробной части?
17 Гений 1С
 
гуру
25.10.07
16:40
алле, все еще актуально!
18 asady
 
25.10.07
16:50
(17) у меня так крутится

ЗначениеПоля=Строка(RecordSet.Fields(ИмяПоля).Value);
19 smaharbA
 
25.10.07
16:53
cast(field as varchar)
20 Гений 1С
 
гуру
25.10.07
17:25
(18) АДОЗапись.Fields(iCount).Value - для поля типа дата выдает строку, видимо из-за IMEX=1 в строке коннекта:

АДОСоединение.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+СокрЛП(ИмяФайла)+";Extended Properties=""Excel 8.0;IMEX=1;""";

(19) Смархаб, не говори загадками, я из АДО получаю уже преобразованную в строку значение, а мне нужно чтобы оно преобразовывалось как-то однообразно, независимо от локальных настроек...
21 Гений 1С
 
гуру
25.10.07
17:32
Хотя и без IMEX=1 тоже выдает дату как строку.
22 Гений 1С
 
гуру
26.10.07
09:13
Аппну, все еще актуально.
23 Sasha_H
 
26.10.07
09:25
И я Апну. Так как интересно мне тоже нуно :)
24 Гений 1С
 
гуру
26.10.07
09:31
(23) Записывайтесь, товарисчы...
25 Sasha_H
 
26.10.07
09:34
И еще где можно почитать как работать с АДО и 8.х ???
26 lamme
 
26.10.07
09:40
0
ни у одного тебя проблемы ...
v8: Загрузить из Excell. Оптимизация.
27 lamme
 
26.10.07
09:44
(0)
а покажи весь код работы с АДО
т.е. - открыть excel файл
пройтись по строчкам
получить из строчки N параметр из колкни M
?
28 RKx
 
26.10.07
09:45
Специально для фиксина:) Кусок рабочего кода:
Для 8-ки тоже работает. Пробовал.

   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;""";
   db.Open();
   rs.ActiveConnection = db;
   rs.CursorType = 3;
   rs.LockType = 2;
   cat=CreateObject("ADOX.Catalog");
   cat.ActiveConnection=db;
   Для сч=0 По cat.Tables.Count-1 Цикл
       Сообщить("Загружаются данные с листа '"+cat.Tables(сч).Name+"'");
       rs.Source = "Select * from ["+cat.Tables(сч).Name+"]";
       Если cat.Tables(сч).Columns.Count > 1 Тогда
           rs.Open();      
           Пока rs.Eof()=0 Цикл  
               Если RS.AbsolutePosition<6 тогда  
                   rs.MoveNext();
                   Продолжить;
               КонецЕсли;    
               НомерПП= rs.Fields(1);
............
29 Леха Дум
 
26.10.07
10:00
(21) Драйвер MS читает первые 8 строк и, в зависимости от того какого типа данных больше, такой тип и выставляет для всей колонки, не соответствующие типу данные заменяются на NULL. IMEX=1 нужен чтобы сохранить формат разных данных и сами данные в колонке.
30 lamme
 
26.10.07
10:02
эта ... хм ...
сообщить (НомерПП)
должно выдавать что находиться в колонке 1 ?
31 lamme
 
26.10.07
10:04
а что означает строка
Для сч=0 По cat.Tables.Count-1 Цикл
в отладчике показывает что cat.Tables.Count = 0
32 lamme
 
26.10.07
10:20
33 Гений 1С
 
гуру
26.10.07
10:26
Пожалста, вот код:

       АДОСоединение=Новый COMОбъект("ADODB.Connection");
       //АДОСоединение.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+СокрЛП(ИмяФайла)+";Extended Properties=""Excel 8.0;IMEX=1;""";
       АДОСоединение.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+СокрЛП(ИмяФайла)+";Extended Properties=""Excel 8.0;""";
       АДОСоединение.Open();
       Открыта=истина;


   Если Не Открыта Тогда Возврат Неопределено; КонецЕсли;
   Если Таблицы<>Неопределено Тогда
       Возврат Таблицы;
   КонецЕсли;

   Таблицы=Новый ТаблицаЗначений();
   Таблицы.Колонки.Добавить("Имя");
   Таблицы.Колонки.Добавить("Данные");
   Таблицы.Колонки.Добавить("КоличествоСтрок");
   Таблицы.Колонки.Добавить("КоличествоКолонок");
   Таблицы.Колонки.Добавить("Загружены", Новый ОписаниеТипов("Булево"));

       
       АДОКаталог = Новый COMОбъект("ADOX.Catalog");
       АДОКаталог.ActiveConnection = АДОСоединение;
       
       Для iCount = 0 По АДОКаталог.Tables.Count-1 Цикл
           Если АДОКаталог.Tables.Item(iCount).Type <> "VIEW" Тогда
               Стр=Таблицы.Добавить();
               Стр.Имя = АДОКаталог.Tables.Item(iCount).Name;
           КонецЕсли;
       КонецЦикла;


   ТекТаблица=Таблицы[0];
       ТекТаблица.Загружены=истина;
       
       ТекТаблица.Данные=Новый ТаблицаЗначений();
       
       АДОЗапись=Новый COMОбъект("ADODB.Recordset");
       АДОЗапись.ActiveConnection=АДОСоединение;
       АДОЗапись.CursorType = 0;
       АДОЗапись.LockType = 1;
       //АДОЗапись.Source = "Select * from ["+ТекТаблица.Имя+"]";
       АДОЗапись.Open("Select * from ["+ТекТаблица.Имя+"]");
       
       
       //Определяем диапазаны
       Если НачальнаяКолонка=0 Тогда
           НачКолонка=0;
       Иначе
           НачКолонка=НачальнаяКолонка-1;
       КонецЕсли;
       Если КонечнаяКолонка=0 Тогда
           КонКолонка=АДОЗапись.Fields.Count-1;
       Иначе
           КонКолонка=КонечнаяКолонка-1;
       КонецЕсли;
               
       Если НачальнаяСтрока=0 Тогда
           НачСтрока=0;
       Иначе
           НачСтрока=НачальнаяСтрока-1;
       КонецЕсли;
       Если КонечнаяСтрока=0 Тогда
           КонСтрока=Неопределено;
       Иначе
           КонСтрока=КонечнаяСтрока-1;
       КонецЕсли;

       
       
       Для iCount = 1 По АДОЗапись.Fields.Count-1 Цикл
           ТекТаблица.Данные.Колонки.Добавить(,,АДОЗапись.Fields.Item(iCount).Name);
       КонецЦикла;
       
       
       ИндексЗаписи=0;
       АДОЗапись.MoveFirst();                
       Пока АДОЗапись.EOF() = 0 Цикл
           Если КонСтрока<>Неопределено И ИндексЗаписи>КонСтрока Тогда
               Прервать;
           КонецЕсли;
           Если НЕ ЗагружатьТолькоРамку Тогда
               Стр=ТекТаблица.Данные.Добавить();
           КонецЕсли;
           Если ИндексЗаписи>=НачСтрока Тогда
               Для iCount = НачКолонка По КонКолонка Цикл
                   Стр[iCount]=АДОЗапись.Fields(iCount).Value;
               КонецЦикла;
           КонецЕсли;
           АДОЗапись.MoveNext();  
           ИндексЗаписи=ИндексЗаписи+1;
       КонецЦикла;
       АДОЗапись.Close();
34 Гений 1С
 
гуру
26.10.07
10:28
(28) чтение файла у меня работает, но мне нужно чтобы даты и числа преобразовывались по фиксированному формату, а не по локальному формату компа...
Чтобы на разных компах я получал преобразование даты и числа по одному формату.
Так что вы меня не поняли, код у меня есть.

(29) Вот о режиме IMEX=1 и идет речь.
35 Гений 1С
 
гуру
26.10.07
10:29
(32) Да, оттуда я и взял каркас кода...
36 Гений 1С
 
гуру
26.10.07
10:33
(31) число листов в экселе.
37 lamme
 
26.10.07
10:35
(36)
да ... я уж разобрался.
только не понятно вот что ...
у меня лист имеет название не Лист 1 - как обычно, а timesheet_freelance_sales_ret_l
и водоная структура доступа - не видит лист вообще. Говоит - что листов 0
38 Гений 1С
 
гуру
26.10.07
10:36
(37) Попробуй для теста переименовать лист, но здается у тебя дело в другом...
39 lamme
 
26.10.07
10:37
при переименовании - все нормально читаеться.
40 Гений 1С
 
гуру
26.10.07
10:37
(39) Гыгыгы, х.з. АДО тупит
41 774816
 
26.10.07
10:48
SELECT FORMAT(DATACOL, 'YYYYMMDDHHMMSS')
FROM TABLE
42 774816
 
26.10.07
10:49
(41)в ацессе такой код работает в экселе не знаю пробуй
43 lift
 
26.10.07
10:57
(0) Попробуй кинуть из Excel в текстовый формат, а потом считать, с текстовиком 1С шустро работает, быстрее чем с дбф.
44 Гений 1С
 
гуру
26.10.07
11:24
(41) Для этого нужно заранее знать тип данных в колонке, а если в колонке есть и даты и числа и строки, не катит, ведь АДО как-то догоняет...
Не катит.
(43) АДО тоже летает, при преобразовании в текст будут такие же траблы с форматами, что и при АДО, так что проблема ВИСИТ.
45 774816
 
26.10.07
11:34
(44)не очень понял
<а если в колонке есть и даты и числа и строки>  значение колонок зависят от типа колонки в одной колонке не может быть значение с типом дата или число если конечно это обычный текст и значения текстовые, а что бы определить тип колонок  для этого есть
АДОЗапись.Fields(0).Type, что именно ты пытаешься сделать универсальную обработку чтения из экс файла?
46 Гений 1С
 
гуру
26.10.07
11:56
(45) Товарищ, у меня в экселе хранится не таблица значений, а некая форма, поэтому тип колонок не катит...

Неужели непонятно - АДО по локальным правилам преобразовывает дату и число в строку, а мне надо, чтобы он преобразовывал по глобальным правилам.
47 Гений 1С
 
гуру
26.10.07
12:00
То бишь я например знаю, что в ячейке 100-45 хранится дата, но она мне дает дату в локальном формате, поэтому я не знаю, как ее преобразовать в нормальную дату...
48 Гений 1С
 
гуру
26.10.07
13:23
(45) К тому же заказчики не очень аккуратны и числа не всегда соответствуют формату, кроме того данные грузятся не из таблицы, а скорее из печатной формы, где таблица начинается гдето на 20-й строке, а в шапке - разные реквзииты...
49 Eugene555
 
26.10.07
18:08
Кстати установка IMEX=1 почему-то не помогает с типами...ситуация:

db = Новый COMОбъект("ADODB.Connection");
       rs = Новый COMОбъект("ADODB.RecordSet");
       db.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+СокрЛП(ПутьКФайлу)+";Extended Properties=""Excel 8.0;IMEX=1;HDR=NO;""";
       db.ConnectionTimeout=0;
       db.CursorLocation=3;
       
           db.Open();
           rs.ActiveConnection = db;
           rs.CursorType = 0;
           rs.LockType = 1;
   
           cat = Новый COMОбъект("ADOX.Catalog");
         cat.ActiveConnection=db;
       queryText = "Select * from ["+cat.Tables(0).Name+"]";
           rs.Open(queryText);
       rs.MoveFirst();
           Пока НЕ rs.EOF() Цикл
           стр1 = rs.Fields(0).Value;
           стр2 = rs.Fields(1).Value;
             rs.MoveNext();
       КонецЦикла;
       rs.Close();
       db.Close();

выборка делается из Excel файла:

c61661    111
c68001    121
c68002    131
c68535    131
L00599    121
L00610    2323
L00608    131
c68188    112
c61711    112
b01666    112
c67092    122
L00573    132
c67188    113
c68583    123
c68527    133
c68568    133
p00435    Н/М

В последней строке, где  значение = "Н/М"
rs.Fields(1).Value = "", а rs.Fields(1).Type = NULL

как получить то что нужно, т.е "Н/М"???
50 Fragster
 
гуру
26.10.07
18:26
Вопрос на многа денег, а работает ли это без установленного екселя?
51 nii
 
26.10.07
19:57
кстати, протестил варианты у себя через массив и ADO....
простой лист Excel, 15000 строк, 9 столбцов - через массив 3 сек - это с загрузкой в таблицу значений... через Ado ощутимо дольше.. даже дожидаться не стал... (массив супер!!!) :)
52 Гений 1С
 
гуру
29.10.07
10:11
(50) Адо работает без экселя
53 Гений 1С
 
гуру
29.10.07
10:12
(51) кинь код с массивом, я тоже протесчу
54 nii
 
29.10.07
10:53
(53)
       Попытка
           Excel    = Новый COMОбъект("Excel.Application");
           WB        = Excel.Workbooks.Open(ИмяФайла);
           WS        = WB.Worksheets(НомерЛиста);
           arr    = WS.UsedRange.Value;
           WB.Close(0);
       Исключение
           Возврат Ложь;
       КонецПопытки;
       
       МассивКолонок            = arr.Выгрузить();
       ОбщееКоличествоКолонок    = arr.GetUpperBound(0);
       ОбщееКоличествоСтрок    = arr.GetUpperBound(1);
       Для Инд = 1 По ОбщееКоличествоСтрок Цикл
           НовСтр = ТЗ.Добавить();    
       КонецЦикла;
       Для Каждого Колонка Из МассивКолонок Цикл
           ТЗ.ЗагрузитьКолонку(Колонка,ИмяКолонкиТаблицыЗначений);
       КонецЦикла;
55 Sasha_H
 
29.10.07
11:14
Я у себя сделал вот такого универсального типа:

//Функция обрабатывает ADO-соединение к файлу Ексель
//Входные данные:
//                ИмяФайла  - полный путь к файлу включая его самого
//                Лист      - номер листа на который следует спозиционироватся
//              НачСтрока - номер начальной строки выборки
//              КонСтрока - номер конечной строки выборки
//              СтруктураКолонок: "НомерКолонки, ИдентификаторВыхода"
//              НаличиеЗаголовкаВФайле: "YES"-если первая строка ненужна, "NO"-включать в выборку первую строчку (это нужно понимать)
//
Функция РаботаСADOОбъктами(ИмяФайла,Лист,НачСтрока,КонСтрока,СтруктураКолонок,НаличиеЗаголовкаВФайле="NO") Экспорт
   
   Если (НЕ ЗначениеЗаполнено(ИмяФайла))
   ИЛИ     (НЕ ЗначениеЗаполнено(Лист))
   ИЛИ  (НЕ ЗначениеЗаполнено(НачСтрока))
   ИЛИ  (НЕ ЗначениеЗаполнено(КонСтрока))
   ИЛИ     (СтруктураКолонок = Неопределено) Тогда
       Возврат Неопределено;
   КонецЕсли;
   
   НачСтрока = ?(НачСтрока>0,НачСтрока-1,0);
   КонСтрока = ?(КонСтрока>0,КонСтрока-1,0);
   
   АДОСоединение = Новый COMОбъект("ADODB.Connection");
   АДОСоединение.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+СокрЛП(ИмяФайла)+";Extended Properties=""Excel 8.0;HDR="+НаличиеЗаголовкаВФайле+";""";
   Попытка
       АДОСоединение.Open();
   Исключение
       Сообщить(ОписаниеОшибки(),СтатусСообщения.Важное);
       Возврат Неопределено;
   КонецПопытки;
   
   АДОЗапись                  = Новый COMОбъект("ADODB.Recordset");
   АДОЗапись.ActiveConnection = АДОСоединение;
   АДОЗапись.CursorType       = 0;
   Лист = "Лист" + Лист +"$";
   АДОЗапись.Open("Select * from ["+Лист+"]"); //выборка с указанного листа
   
   //разбор структуры
   ВыходнаяТаблицаДанных = Новый ТаблицаЗначений;
   НоваяКолонка = ВыходнаяТаблицаДанных.Колонки;
   Для Каждого ИндетификатораКолонки Из СтруктураКолонок Цикл
       НоваяКолонка.Добавить(ИндетификатораКолонки.Представление);
   КонецЦикла;    
   
   АДОЗапись.MoveFirst();
   ИндексЗаписи = 0;
   ТекПроцент   = 0;
   Пока АДОЗапись.EOF() = 0 Цикл
       Если (ИндексЗаписи >= НачСтрока)
       И     (ИндексЗаписи <= КонСтрока)Тогда
           НоваяСтрока = ВыходнаяТаблицаДанных.Добавить();
           Для Каждого ИндетификатораКолонки Из СтруктураКолонок Цикл
               iCount         = ?(ИндетификатораКолонки.Значение>0,ИндетификатораКолонки.Значение-1,ИндетификатораКолонки.Значение);
               ЗначениеЗаписи = АДОЗапись.Fields(iCount).Value;
               НоваяСтрока[ИндетификатораКолонки.Представление] = ЗначениеЗаписи;
           КонецЦикла;
       КонецЕсли;
       
       АДОЗапись.MoveNext();
       ИндексЗаписи = ИндексЗаписи + 1;
       ТекПроцент   = Формат((ИндексЗаписи/КонСтрока)*100,"ЧЦ=5; ЧДЦ=2");
       Состояние("Обработка файла: " + ТекПроцент + "%");
       Если ИндексЗаписи > КонСтрока Тогда
           Прервать;
       КонецЕсли;    
   КонецЦикла;
   АДОЗапись.Close();
   АДОСоединение.Close();
   Возврат ВыходнаяТаблицаДанных;
КонецФункции    

Это Обработка в конфе. Далее с нужной мне обработины я использую данную функцию:

Процедура ТестADOНажатие(Элемент)
   Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
   Диалог.Заголовок = "Укажите файл тестирования";
   Диалог.Фильтр =
   "Все файлы импорта (*.xls;*.csv)|*.xls;*.csv|"
   + "Формат xls (*.xls;*.csv)|*.xls;*.csv|";
   
   Если (НЕ Диалог.Выбрать())
   ИЛИ  (НЕ ЗначениеЗаполнено(ПолеВводаНачСтрока))
   ИЛИ     (НЕ ЗначениеЗаполнено(ПолеВводаКонСтрока)) Тогда
       Предупреждение("Тест не произведен");
       Возврат;
   КонецЕсли;
   
   ИмяФайла = Диалог.ПолноеИмяФайла;
   
   НачСтрока = ПолеВводаНачСтрока;
   КонСтрока = ПолеВводаКонСтрока;

   СтруктураКолонок = Новый СписокЗначений;                                        
   СтруктураКолонок.Добавить(1,"Бренд"   );
   СтруктураКолонок.Добавить(2,"Тип"     );
   СтруктураКолонок.Добавить(3,"Размер"  );
   СтруктураКолонок.Добавить(4,"Модель"  );
   СтруктураКолонок.Добавить(5,"Сезон"   );
   СтруктураКолонок.Добавить(18,"Артикул");
   
   НачалоТеста = ТекущаяДата();
   Сообщить("=== НАЧАЛО ТЕСТИРОВАНИЯ ЕКСЕЛЬ через ADO ===");
   Сообщить("Время начала: "+НачалоТеста);
   
   ФормаADO   = Обработки.РаботаСADOОбъктами.ПолучитьФорму("РаботаСADOОбъктами");
   ТаблицаADO = ФормаADO.РаботаСADOОбъктами(ИмяФайла,1,НачСтрока,КонСтрока,СтруктураКолонок);
   Если ТаблицаADO = Неопределено Тогда
       Возврат;
   КонецЕсли;
   
   НачСтрока = 0;
   КонСтрока = ТаблицаADO.Количество()-1;

   ЭлементыФормы.Индикатор.МаксимальноеЗначение = КонСтрока+1;
   Для НомерОбработанойСтроки = НачСтрока По КонСтрока Цикл
       ЭлементыФормы.Индикатор.Значение = НомерОбработанойСтроки+1;
       
       Бренд        = СокрЛП(ТаблицаADO[НомерОбработанойСтроки].Бренд  );
       Тип          = СокрЛП(ТаблицаADO[НомерОбработанойСтроки].Тип    );
       Размер       = СокрЛП(ТаблицаADO[НомерОбработанойСтроки].Размер );
       Модель       = СокрЛП(ТаблицаADO[НомерОбработанойСтроки].Модель );
       Сезон        = СокрЛП(ТаблицаADO[НомерОбработанойСтроки].Сезон  );
       Артикул      = СокрЛП(ТаблицаADO[НомерОбработанойСтроки].Артикул);
       
   КонецЦикла;
   КонецТеста  = ТекущаяДата();
   ВремяЗатрат = Формат((КонецТеста - НачалоТеста)/60,"ЧЦ=6; ЧДЦ=3");
   Сообщить("Время окончания: " + КонецТеста);
   Сообщить("Трудоемкость: " + ВремяЗатрат+" мин.",СтатусСообщения.Информация);
   Сообщить("=== КОНЕЦ ТЕСТА ЕКСЕЛЬ через ADO ===");

   ЭлементыФормы.Индикатор.Значение = 0;
КонецПроцедуры

Я это проганял через тест.

А вот теперь хочу сказать в защиту 1С 7.7, она быстрее работает с АДО и быстрей работает с апликацией Екселя я был ошеломлен.

Если сравнить загрузку с ексель СОМ-присоединением 8.х и Е = СоздатьОбъект("Excel.Application"); в 7.7 то семерка обходит по скорости адназначна с чтением Екселя.

Аналогично прописал у себя в глобнике 7.7
Функция глРаботаСADOОбъктами(ИмяФайла,Лист,НачСтрока,КонСтрока,СтруктураКолонок,НаличиеЗаголовкаВФайле="NO") Экспорт
   Неопределено = 0;
   
   Если (ПустоеЗначение(ИмяФайла)=1)
   ИЛИ     (ПустоеЗначение(Лист)=1)
   ИЛИ  (ПустоеЗначение(НачСтрока)=1)
   ИЛИ  (ПустоеЗначение(КонСтрока)=1)
   ИЛИ     (ПустоеЗначение(СтруктураКолонок)=1) Тогда
       Возврат Неопределено;
   КонецЕсли;
   
   НачСтрока = ?(НачСтрока>0,НачСтрока-1,0);
   КонСтрока = ?(КонСтрока>0,КонСтрока-1,0);
   
   АДОСоединение = СоздатьОбъект("ADODB.Connection");
   АДОСоединение.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+СокрЛП(ИмяФайла)+";Extended Properties=""Excel 8.0;HDR="+НаличиеЗаголовкаВФайле+";""";
   Попытка
       АДОСоединение.Open();
   Исключение
       Сообщить(ОписаниеОшибки(),"!!");
       Возврат Неопределено;
   КонецПопытки;
   
   АДОЗапись                  = СоздатьОбъект("ADODB.Recordset");
   АДОЗапись.ActiveConnection = АДОСоединение;
   АДОЗапись.CursorType       = 0;
   Лист = "Sheet" + Лист +"$";
   АДОЗапись.Open("Select * from ["+Лист+"]"); //выборка с указанного листа
   
   //разбор структуры
   ВыходнаяТаблицаДанных = СоздатьОбъект("ТаблицаЗначений");
   Для А = 1 По СтруктураКолонок.РазмерСписка() Цикл
       ИндетификатораКолонки = "";
       НомерКолонки          = СтруктураКолонок.ПолучитьЗначение(А,ИндетификатораКолонки);
       ВыходнаяТаблицаДанных.НоваяКолонка(ИндетификатораКолонки);
   КонецЦикла;    
   
   АДОЗапись.MoveFirst();
   ИндексЗаписи = 0;
   ТекПроцент   = 0;
   Пока АДОЗапись.EOF() = 0 Цикл
       Если (ИндексЗаписи >= НачСтрока)
       И     (ИндексЗаписи <= КонСтрока)Тогда
           ВыходнаяТаблицаДанных.НоваяСтрока();
           НомерПозТЗ = ВыходнаяТаблицаДанных.НомерСтроки;
           Для А = 1 По СтруктураКолонок.РазмерСписка() Цикл
               ИндетификатораКолонки = "";
               НомерКолонки          = СтруктураКолонок.ПолучитьЗначение(А,ИндетификатораКолонки);
               iCount         = ?(НомерКолонки>0,НомерКолонки-1,НомерКолонки);
               ЗначениеЗаписи = АДОЗапись.Fields(iCount).Value;
               ВыходнаяТаблицаДанных.УстановитьЗначение(НомерПозТЗ,ИндетификатораКолонки,ЗначениеЗаписи);
           КонецЦикла;
       КонецЕсли;
       
       АДОЗапись.MoveNext();
       ИндексЗаписи = ИндексЗаписи + 1;
       ТекПроцент   = Формат((ИндексЗаписи/КонСтрока)*100,"Ч6.2");
       Состояние("Обработка файла: " + ТекПроцент + "%");
       Если ИндексЗаписи > КонСтрока Тогда
           Прервать;
       КонецЕсли;    
   КонецЦикла;
   АДОЗапись.Close();
   АДОСоединение.Close();
   Возврат ВыходнаяТаблицаДанных;
КонецФункции    

Оттестил обращение:

//*******************************************
Перем Таб,Артикул,Товар,ЕдИзм,Кво,Прогрес;
Перем НачВремени;

Функция ЗагрузкаДополнительногоФункционала()
   Попытка
       ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "MPlus.dll");
       Прогрес = СоздатьОбъект("AddIn.VCL");
       Возврат 1;
   Исключение
       Сообщить("Поместите MPlus.dll  в католог базы","!");  
       Возврат 0;
   КонецПопытки;
КонецФункции    // ЗагрузкаДополнительногоФункционала

Функция ОбработатьСтроку(Тек,Е)
   Артикул = СокрЛП(Строка(Е.Cells(Тек,1).Value));
   Товар   = СокрЛП(Строка(Е.Cells(Тек,2).Value));
   ЕдИзм   = СокрЛП(Строка(Е.Cells(Тек,3).Value));//Стоимость
   Кво     = СокрЛП(Строка(Е.Cells(Тек,4).Value));//Кво
   
   Возврат(1);
КонецФункции
//--------------------------------------------------------------

Процедура Загрузка(Статус)
   Состояние("Виконання процедури загрузки...");
   ИмяФайла="";
   Книга="";
   Строк="";
   Нач=0;
   Кон=0;
   Попытка
       Е = СоздатьОбъект("Excel.Application");
   Исключение
       Сообщить("Похоже, Excel на компьютере не установлен. Необходимо выполнить установку/переустановку Excel.","!");
       Возврат;
   КонецПопытки;
   сФайл = "";
   сКатал = "";
   Если ФС.ВыбратьФайл(0,сФайл,сКатал,"Выберите файл импорта","Таблицы Excel (*.xls)|*.xls") = 1 Тогда
       ИмяФайла = сКатал+сФайл;
   Иначе
       Сообщить("Тестирование прервано!","!");
       Возврат;
   КонецЕсли;
   Если ПустаяСтрока(ИмяФайла)=1 Тогда
       Возврат;
   КонецЕсли;  
   Е.Workbooks.Open(Сокрлп(ИмяФайла));
   Е.Visible=1;
   
   Книга = Е.ActiveWorkbook;
   Строк = Е.Cells.CurrentRegion.Rows.Count;
   Нач = 9;
   Кон = Строк;
   ВвестиЧисло(Нач,"Початкова стрічка",12,0,);
   ВвестиЧисло(Кон,"Кінцева стрічка",12,0);
   
   Если Нач>Кон Тогда
       Возврат;
   КонецЕсли;
   
   Если ЗагрузкаДополнительногоФункционала() = 1 Тогда
       флИспользоватьПрогрес = 1;
       Прогрес.SetGauge();
       //Прогрес.StatusLine("Сбор данных истории в итоговою таблицу...");
   Иначе
       флИспользоватьПрогрес = 0;
   КонецЕсли;
   
   Если Статус = "1С" Тогда
       НачВремени = ТекущееВремя();
       Сообщить("Начало тестирования: " + ТекущаяДата() + " " + НачВремени);
       ном = Нач;
       Для ТекСтрока = Нач По Кон Цикл
           //процентуем состояние
           Если флИспользоватьПрогрес = 1 Тогда
               ном = ном + 1;
               текПроцент = (ном/Кон)*100;
               Прогрес.GaugePosition(текПроцент);
               Прогрес.SleepTime(0);
           КонецЕсли;
           
           Если ОбработатьСтроку(ТекСтрока, Е)=1 Тогда
               Таб.НоваяСтрока();  
               Таб.Артикул = Артикул;
               Таб.Товар   = Товар;
               Таб.ЕдИзм   = ЕдИзм;
               Таб.Кво     = Кво;
           КонецЕсли;
       КонецЦикла;
   Иначе
       НачВремени = ТекущееВремя();
       Сообщить("Начало тестирования: " + ТекущаяДата() + " " + НачВремени);
       СтруктураКолонок = СоздатьОбъект("СписокЗначений");
       СтруктураКолонок.ДобавитьЗначение(1,"Артикул");
       СтруктураКолонок.ДобавитьЗначение(2,"Товар");
       СтруктураКолонок.ДобавитьЗначение(3,"ЕдИзм");
       СтруктураКолонок.ДобавитьЗначение(4,"Кво");
       Таб = глРаботаСADOОбъктами(СокрЛП(ИмяФайла),1,Нач,Кон,СтруктураКолонок);
   КонецЕсли;
КонецПроцедуры
//--------------------------------------------------------------

//*******************************************
Процедура ТестADO()
   Сообщить("=== НАЧАЛО ТЕСТА ЕКСЕЛЬ-чтение через ADO ===");
   Загрузка("ADO");
   КонВремя     = ТекущееВремя();
   Сообщить("Окончание тестирования: " + ТекущаяДата() + " " + КонВремя);
   Сообщить("=====================");
   Предупреждение("Тест закончен",2);
   
   Если Таб <> 0 Тогда
       Таб.ВыбратьСтроку();
   КонецЕсли;
КонецПроцедуры

Процедура ТестXLS()
   Сообщить("=== НАЧАЛО ТЕСТА ЕКСЕЛЬ-чтение через 1С ===");
   Таб=СоздатьОбъект("ТаблицаЗначений");  
   Таб.НоваяКолонка("Артикул","Строка");
   Таб.НоваяКолонка("Товар","Строка") ;
   Таб.НоваяКолонка("ЕдИзм");
   Таб.НоваяКолонка("Кво","Число",12,2);
   
   Загрузка("1С");
   КонВремя     = ТекущееВремя();
   Сообщить("Окончание тестирования: " + ТекущаяДата() + " " + КонВремя);
   Сообщить("=====================");
   Предупреждение("Тест закончен",2);
   Таб.ВыбратьСтроку();
КонецПроцедуры    // ТестXLS

В загрузке участвовало 5000 строк, да 7.7 отсало на:

=== НАЧАЛО ТЕСТА ЕКСЕЛЬ-чтение через 1С ===
Начало тестирования: 29.10.07 10:13:19
Окончание тестирования: 29.10.07 10:13:36
=====================
=== НАЧАЛО ТЕСТА ЕКСЕЛЬ-чтение через ADO ===
Начало тестирования: 29.10.07 10:13:53
Окончание тестирования: 29.10.07 10:13:57
=====================
56 Гений 1С
 
гуру
29.10.07
11:43
Гы, надо пощупать COm-Safe-Array, но в АДО так и остается непонятки с типизацией
57 Sasha_H
 
29.10.07
12:13
Заметил причину тяжелости работы 8.х с апликацией Екселя. 8.х может работать только с формаьтами Ексель 97-2003 на 2007 не пробовал.

7.7 работает с апликацией Екселя 5.0/95
58 Гений 1С
 
гуру
29.10.07
13:02
Ндык корифеи таки АДО есть?
Ответят таки по локальным форматам даты и чисел?
Неужели это не лечится?
59 Sasha_H
 
29.10.07
13:17
(58) с необходимостью форматов пока не сталкивался и помочь в этом извени не смогу.
60 Гений 1С
 
гуру
29.10.07
13:48
(59) т.е. ты вытягивал из Экселя через АДО только таблицы?
61 Гений 1С
 
гуру
30.10.07
13:14
алле, эксперты АДО, так что там с форматированием чисел и дат?
62 Гений 1С
 
гуру
01.11.07
14:32
алле, все еще актуально
63 Гений 1С
 
гуру
02.11.07
09:15
утренний ап, ибо нужно знать...
64 vde69
 
02.11.07
09:35
полезно полазить в папочке C:\Program Files\Common Files\System\ado\ там гораздо больше интересного чем кажеться на перый взгляд


тоже вместо апа
65 Гений 1С
 
гуру
02.11.07
13:12
(64) там только список констант
66 BabySG
 
02.11.07
18:15
Когда очень давно делал так на VBA:
Format([ДатаОформления]," + Chr$(34) + "Short Date" + Chr$(34) + ") AS ДатаО, Format([ДатаВыдачи]," + Chr$(34) + "Short Date" + Chr$(34) + ") AS ДатаВ
67 Гений 1С
 
гуру
06.11.07
09:27
(66) Не катит, ибо у меня в экселе не таблица из колонок, а таблица с шапкой (печатная форма документа)...

Все еще интересно... Неужели мелкософтовцы не предусмотрели управление конвертацией форматов? Вот идиоты.
68 Гений 1С
 
гуру
07.11.07
11:04
ап в надежде на проходящего мимо знатока АДО...
69 Гений 1С
 
гуру
08.11.07
12:20
ап, ибо актуально...
70 Гений 1С
 
гуру
08.11.07
14:00
(54) Чувак, огромное спасибо, через ComSafeArray все буквально летает, АДО нервно курит в сторонке, единственно на компе должен быть установлен Эксель. ;-)
Так что буду юзать CSA, большое спасибо.

Но вопрос про форматы АДО остается открытым, в CSA кстати типизация исходного файла передается...
71 Pashkaa
 
09.11.07
09:45
(70)Гений подскажи как тебе помог пост 54 и как выглядит конечный код с ComSafeArray ?
72 Гений 1С
 
гуру
09.11.07
10:04
(71) Кстати, я не уверен, что CSA быстрее ADO...
В общем он у меня работает с такой же скоростью, как обычное чтение из Экселя, т.к. обычное чтение читает по 2-3 позиции в строке, а CSA грузит весь файл, хоть и быстро, но по времени то на то выходит. ;-)

Функция Открыть() Экспорт
   ТипТаблицы=ВРЕГ(ТипТаблицы);
   Если ТипТаблицы="EXCELADO" Тогда
       АДОСоединение=Новый COMОбъект("ADODB.Connection");
       //АДОСоединение.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+СокрЛП(ИмяФайла)+";Extended Properties=""Excel 8.0;IMEX=1;""";
       АДОСоединение.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+СокрЛП(ИмяФайла)+";Extended Properties=""Excel 8.0;""";
       АДОСоединение.Open();
       Открыта=истина;
   ИначеЕсли ТипТаблицы="EXCEL" Тогда
       Попытка
           ЭксельСоединение = Новый ComОбъект("Excel.Application");
           ЭксельСоединение.visible=Видимость;
           ЭксельКниги= ЭксельСоединение.WorkBooks;//.WorkSheets(номерлиста);
           ЭксельКнига = ЭксельКниги.Open(СокрЛП(ИмяФайла));
           //ЛистЭкселя =Book.WorkSheets(1);
           Открыта=истина;
       Исключение
       КонецПопытки;
   ИначеЕсли ТипТаблицы="EXCELCSA" Тогда
       Попытка
           ЭксельСоединение = Новый ComОбъект("Excel.Application");
           ЭксельСоединение.visible=Видимость;
           ЭксельКниги= ЭксельСоединение.WorkBooks;//.WorkSheets(номерлиста);
           ЭксельКнига = ЭксельКниги.Open(СокрЛП(ИмяФайла));
           Открыта=истина;
       Исключение
       КонецПопытки;
   КонецЕсли;
   
   Таблицы=Неопределено;
   Таблицы();
   
   Возврат Открыта;
КонецФункции


//Возвращает данные таблицы в виде таблицы значений
Функция Данные(НомерТаблицы) Экспорт
   ТекТаблица=Таблицы[НомерТаблицы-1];
   Если ТекТаблица.Загружены=истина Тогда
       Возврат ТекТаблица.Данные;
   КонецЕсли;
   
   //== Определяем диапазоны чтения данных ==
   
   НачКолонка=1;
   НачСтрока=1;
   КонКолонка=999999999999999; //Используем заведомо большое число
   КонСтрока=999999999999999;    //Используем заведомо большое число
   
   //Используем рамки
   Если НачальнаяКолонка<>Неопределено Тогда
       НачКолонка=НачальнаяКолонка;
   КонецЕсли;
   Если НачальнаяСтрока<>Неопределено Тогда
       НачСтрока=НачальнаяСтрока;
   КонецЕсли;
   
   Если КонечнаяКолонка<>Неопределено Тогда
       КонКолонка=КонечнаяКолонка;
   КонецЕсли;
   Если КонечнаяСтрока<>Неопределено Тогда
       КонСтрока=КонечнаяСтрока;
   КонецЕсли;
   
   ТекТаблица.Данные=Новый ТаблицаЗначений();
   ТекТаблица.Загружены=истина;

   
   //== Считываем таблицу ==
   Если ТипТаблицы="EXCELADO" Тогда
       
       АДОЗапись=Новый COMОбъект("ADODB.Recordset");
       АДОЗапись.ActiveConnection=АДОСоединение;
       АДОЗапись.CursorType = 0;
       АДОЗапись.LockType = 1;
       //АДОЗапись.Source = "Select * from ["+ТекТаблица.Имя+"]";
       АДОЗапись.Open("Select * from ["+ТекТаблица.Имя+"]");
       
       КонКолонка=Мин(КонКолонка, АДОЗапись.Fields.Count-1); //Корректируем последнюю колонку
       Для iCount = 1 По АДОЗапись.Fields.Count Цикл
           ТекТаблица.Данные.Колонки.Добавить(,,АДОЗапись.Fields.Item(iCount-1).Name);
       КонецЦикла;
       
       
       НомерЗаписи=1;
       АДОЗапись.MoveFirst();                
       Пока АДОЗапись.EOF() = 0 Цикл
           Если НомерЗаписи>КонСтрока Тогда
               Прервать;
           КонецЕсли;
           //Если НЕ ЗагружатьТолькоРамку Тогда
           Стр=ТекТаблица.Данные.Добавить();
           //КонецЕсли;
           Если НомерЗаписи>=НачСтрока Тогда
               Для iCount = НачКолонка По КонКолонка Цикл
                   Стр[iCount-1]=АДОЗапись.Fields(iCount-1).Value;
               КонецЦикла;
           КонецЕсли;
           АДОЗапись.MoveNext();  
           НомерЗаписи=НомерЗаписи+1;
       КонецЦикла;
       АДОЗапись.Close();
   ИначеЕсли ТипТаблицы="EXCEL" Тогда
       КонКолонка=Мин(КонКолонка, ЭксельКнига.WorkSheets(НомерТаблицы).UsedRange.Columns.Count); //Корректируем последнюю колонку
       КонСтрока=Мин(КонСтрока, ЭксельКнига.WorkSheets(НомерТаблицы).UsedRange.Rows.Count); //Корректируем последнюю строку
       ТекТаблица.КоличествоСтрок=КонСтрока;
       ТекТаблица.КоличествоКолонок=КонКолонка;
       Для Инд=0 По КонКолонка Цикл
           ТекТаблица.Данные.Колонки.Добавить();
       КонецЦикла;
       ТекЛист=ЭксельКнига.WorkSheets(НомерТаблицы);
       Для НомСтр=1 По КонСтрока Цикл
           Стр=ТекТаблица.Данные.Добавить();
           Если НомСтр>=НачСтрока Тогда
               Для НомКол=НачКолонка По КонКолонка Цикл
                   Стр[НомКол]=ТекЛист.Cells(НомСтр, НомКол).Value;
               КонецЦикла;
           КонецЕсли;
       КонецЦикла;
   ИначеЕсли ТипТаблицы="EXCELCSA" Тогда
       КонКолонка=Мин(КонКолонка, ЭксельКнига.WorkSheets(НомерТаблицы).UsedRange.Columns.Count); //Корректируем последнюю колонку
       КонСтрока=Мин(КонСтрока, ЭксельКнига.WorkSheets(НомерТаблицы).UsedRange.Rows.Count); //Корректируем последнюю строку
       ТекТаблица.КоличествоСтрок=КонСтрока;
       ТекТаблица.КоличествоКолонок=КонКолонка;
       
       //CSAМассив= ЭксельКнига.WorkSheets(НомерТаблицы).UsedRange.Value;
       Лист=ЭксельКнига.WorkSheets(НомерТаблицы);
       //Колонка выгружается целиком, начиная с первой ячейки
       CSAМассив= Лист.Range(Лист.Cells(1,1), Лист.Cells(КонСтрока, КонКолонка)).Value;
       МассивКолонок             = CSAМассив.Выгрузить();
       ОбщееКоличествоКолонок     = CSAМассив.GetUpperBound(0);
       ОбщееКоличествоСтрок     = CSAМассив.GetUpperBound(1);
       Для Инд = 1 По ОбщееКоличествоСтрок Цикл
           НовСтр = ТекТаблица.Данные.Добавить();    
       КонецЦикла;
       Сч=1;
       Для Каждого Колонка Из МассивКолонок Цикл
           ТекТаблица.Данные.Колонки.Добавить();
           ТекТаблица.Данные.ЗагрузитьКолонку(Колонка,Сч-1);
           Сч=Сч+1;
       КонецЦикла;
   КонецЕсли;
   
   Возврат ТекТаблица.Данные;
КонецФункции
73 nii
 
09.11.07
10:32
(70) так это не мне, это smaharbA спасибо
74 nii
 
09.11.07
10:33
а насчет че быстрее...если обычная простенькая таблица то CSA быстрее чем АДО
75 Леха Дум
 
09.11.07
11:10
(72) мои 5 копеек:
КонКолонка=256; //максимум столбцов екселе
КонСтрока=65535; //максимум строк в екселе
76 Гений 1С
 
гуру
09.11.07
11:52
(75) Неа, батенько, це планируется как универсальный загрузчик, в том числе и для Star Office...
77 Леха Дум
 
09.11.07
12:55
(76) я за оптимизацию кода. Кроме того можно использовать методы вызываемых сом-объектов для определения числа строк и столбцов. Одно дело планировать, а другое дело использовать в ожидании запланированного чего то еще - нет более постоянного чем временное :)
78 Гений 1С
 
гуру
09.11.07
13:11
(77) Леха, не тупи, мне это 9999 нисколечко не мешает... Это всего лишь задание рамки... Как грится, слышал звон, да не знаешь где он... Короче, проехали...
79 Леха Дум
 
09.11.07
13:22
(78) да уж, твоя гениальность не знает границ. Хотя может кому для начала и поможет...
80 Гений 1С
 
гуру
09.11.07
17:02
Гы, нарвался на засаду АДО. У него оказывается ограниченное число колонок только может считываться, трандец.

Вот режимы подключения:
   АДОЗапись.CursorType = 0;
   АДОЗапись.LockType = 1;

Выдает ошибку, когда в файле у меня BD колонок...
81 Гений 1С
 
гуру
09.11.07
17:21
Ха, прикиньте, нашел еще способ ускорить через CSA.
У меня грузилось штук 200 файлов.
Ндык я каждый раз создавал приложение, открывал книгу, читал, закрывал книгу, закрывал приложение. Профайлер показал на строке Excel=Неопределено 56% времени.
Трандец.
Теперь я изменю цикл: создавал приложение, открывал книгу, читаю, закрываю, .... и так со всеми книгами и только в конце закрою приложение эксель.
Предполагаю экономию в 50%. О, как , если с мозгами!
82 Гений 1С
 
гуру
12.11.07
10:48
Гы, сэкономить 50% времени за счет (81) получилось! ;-)

В общем результат трудов оформил в виде обработки, лазайте на infostart, качайте, изучайте. ;-)  http://infostart.ru/projects/1401/

А АДО Зараза - не дает открывать файл, где много колонок, вот сволочь Бил гейтс!
83 Pashkaa
 
04.12.07
08:31
Может продолжить развитие проекта
84 dk
 
04.12.07
08:38
С чтением не проверял, но при записи на больших объемах можно ускориться в 2-3 раза, если снизить приоритет процесса Excel. Т.е. приоритет процесса "1cv7s.exe" записывающего в Excel должен быть выше, чем у процесса "Excel.exe".
Запись от абрахамса через массив будет шустрее, но не получится использовать форматирование, ... и прочие прелести OLE.
85 Pashkaa
 
04.12.07
08:42
Как бы еще ускорить метод Excel ExcelЛист.Cells(Строка, Столбец).Locked
Это проверка защищена ли ячейка от записи
86 Pashkaa
 
04.12.07
08:57
Я понимаю что конфа писалась быстро и исключительно для тестирования скорости и в помощь другим, но предлагаю Гению 1С доработать вещи которые бросились мне в глаза:

1. Выбор файла xls. Пришлось писать руками путь. Ну добавь ты у реквизита ИмяФайла кнопку выбора по типу xls

2. Добавь выбор загружаемого листа (хотя бы номер что бы можно было указывать или имя)
87 у лю 427
 
04.12.07
09:03
специальная цена для гения - $997.89
88 у лю 427
 
04.12.07
09:04
предлагаю экономию 80% времени...
89 Гений 1С
 
гуру
04.12.07
11:43
(86) Конфа писалась для программистов и пока находится в завершенном виде. ;-)
Лень дописывать. Вот если кто драйвер для доков опен-офиса в этом же формате накидает, тогда вставлю и поправлю.

(87) Долой коммерцию на любовном фронте...
(88) Я и так 50% сэкономил за счет возможности держать коннекшн в открытом состоянии (и драйвер такой режим поддерживает)... см. (82)
90 Pashkaa
 
04.12.07
12:40
Гений объясни почему ТекЛист.UsedRange.Rows.Count не правильно получает последнюю строку на листе?

Какие есть предположения?

Есть другие методы получения последней строки, например ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Row;

но как показала практика, если на листе есть связи с другими файлами Excel то метод выдает ошибку.
91 Гений 1С
 
гуру
04.12.07
13:22
(90) Почему же, у меня выдает правильно. А что он выдает?
92 Pashkaa
 
04.12.07
13:30
Он выдает больше чем есть на самом деле (в доке 1525 строка а выдает 1570), т.е. 45 последних пустые а Ексель говорит что типа нет.

Пробовал в доке выделить строки с 1526 по .... пока хватило нервов, и удалил их. Один чёрт выдает 1570.

Может есть какая то особенность этого метода?
93 Pashkaa
 
04.12.07
13:32
Кстати спасибо за метод через CSA, использоваю в своей обработке, стало шустрее.
Теперь всё тормозит ExcelЛист.Cells(Строка, Столбец).Locked

может есть альтернатичные способы определения защиты ячейки?
94 Гений 1С
 
гуру
04.12.07
13:33
(93) а зачем тебе LOcked?
95 Гений 1С
 
гуру
04.12.07
13:34
(92) а если посмотреть вид для печати, эти строки показываются?
Ну больше - это не меньше, не страшно...
Может у этих ячеек заполнено форматирование, попробуй удалить их
96 Pashkaa
 
04.12.07
13:39
(95) на предварительном просмотре этих строк нет.
Удалять пробовал, не помогло.

Я тоже подумал что больше это не меньше. Но боюсь, а вдруг выдас меньше :(

Locked нужен по условию задачи, нужно заполнять ячейки только те которые не защищены в Excel. Этот метод дает возможность определения. Но поскольку он Excel-вский, то и работает это определение как черепаха
97 Гений 1С
 
гуру
04.12.07
13:44
Попробуй FindFormat юзать чтобы найти все Locked ячейки...
или пробуй занести значение в ячейки, потом прочитай изменения, если изменились,значит не локед.
98 Pashkaa
 
04.12.07
14:54
А используя CSA можно ли назад запихать данные в Excel

Или какие есть способы ускорить ExcelЛист.Cells(Строка.Номер, Столбец.Номер).Value = 0;
99 Гений 1С
 
гуру
04.12.07
16:32
Ну если есть метод Загрузить аналогично методу Выгрузить... гыгыгы
100 Kalambur
 
04.12.07
16:35
100
101 у лю 427
 
04.12.07
16:37
ну вот, Гений даже на телефон заработать не может...
102 Гений 1С
 
гуру
04.12.07
17:51
(101) Харе флудить
Независимо от того, куда вы едете — это в гору и против ветра!