Имя: Пароль:
1C
1C 7.7
v7: Область эксель адо
0 CyMepku1985
 
28.06.12
15:35
Не получается правильно задать область листа при загрузке документа эксель через адо!


ИмяФайла=КаталогЗагрузки+ФайлЗагрузки;
Акцесс = СоздатьОбъект("ADODB.Connection");
Если Прав(имяФайла,3) = "xls" Тогда
СтрокаПодключения="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+СокрЛП(имяФайла)+";Extended Properties=""Excel 8.0;HDR=NO;""";
Иначе
СтрокаПодключения="Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+СокрЛП(имяФайла)+";Extended Properties=""Excel 12.0 Xml;HDR=YES;""";
КонецЕсли;

Акцесс.Open(СтрокаПодключения);
Команда = СоздатьОбъект("ADODB.Command");
Команда.ActiveConnection=Акцесс;
ТекстСелект = "
|SELECT *    
| FROM [A4:P65500] ";
НаборЗаписей = СоздатьОбъект("ADODB.RecordSet");
Команда.CommandText= ТекстСелект;
НаборЗаписей=Команда.Execute;
НаборЗаписей.MoveFirst();
КоличествоЗаписей = НаборЗаписей.RecordCount;

И почему КоличествоЗаписей = -1
1 CyMepku1985
 
28.06.12
15:37
Лист экселя 19 столбцов (3 последних не нужны) и 50000 строк
2 CyMepku1985
 
28.06.12
15:41
Шапка для фильтра начинается с 3 строки, В первых двух строках ячейки объединены в заголовок
3 Tatitutu
 
28.06.12
15:43
Лист экселя 19 столбцов (3 последних не нужны) и 50000 строк


это A-S (19 колонок)
три не нужны
A-P
тогда тебе нужно

| FROM [A4:P50000] ";
4 CyMepku1985
 
28.06.12
15:47
так и установлено
|SELECT *    
| FROM [A4:P65500] ";
Да и пофигу что он грузит еще пустыми 15к сток не в этом вопрос.
Если допустим вырезать из документа 100 строк и вставить в новый док экселя и загрузить то всё нормально попадает!
5 ЧеловекДуши
 
28.06.12
15:50
У меня вот так...

Процедура Загрузить()
   
   СписокУдаляемыхДат=СоздатьОбъект("СписокЗначений");
   СписокУдаляемыхДокументов=СоздатьОбъект("СписокЗначений");
   
   Попытка
       db=CreateObject("ADODB.Connection");
       db.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+СокрЛП(ИмяФайла)+";Extended Properties=""Excel 8.0;HDR=1;IMEX=1""";
       db.Open();
       rs=CreateObject("ADODB.Recordset");
       rs.ActiveConnection = db;
       rs.CursorType = 3;
       rs.LockType = 2;
       rs.Source = "Select * from [Лист1$]";
       rs.Open();
   Исключение      
       Сообщить(ОписаниеОшибки(),"!");
       СтатусВозврата(0);
       Возврат;
   КонецПопытки;
   
   ПКО=СоздатьОбъект("Документ.ПКО");
   СВБ=СоздатьОбъект("Документ.СтрокаВыпискиПриход");
   
   КассаУдал = "";
   КассаНорм = "";
   СпрКассы = СоздатьОбъект("Справочник.Кассы");
   СпрКассы.ВыбратьЭлементы();
   Пока СпрКассы.ПолучитьЭлемент() = 1 Цикл
       Если ПустоеЗначение(КассаУдал)=1 Тогда
           КассаУдал = СпрКассы.ТекущийЭлемент();
       КонецЕсли;
       Если СпрКассы.ПометкаУдаления() = 0 Тогда
           КассаНорм = СпрКассы.ТекущийЭлемент();
       КонецЕсли;
   КонецЦикла;
   СпрКасса = ""; // касса по дефолту! Если нет у пользователя!
   Если ПустоеЗначение(КассаНорм)=0 Тогда
       СпрКасса = КассаНорм;
   //ИначеЕсли ПустоеЗначение(КассаУдал)=0 Тогда //Это как то мерзко :(
   //    СпрКасса = КассаУдал;
   КонецЕсли;
   
   НомерСтроки=0;
   
   СледСтрокаДанных=0;
   СдвигИндекса=0;
   
   КолВыгружено=0;
   ВсегоСтрокПоДокументу=0;
   СуммаВыгружено=0;
   ИтогоСуммаПоДокументу=0;
   
   rs.MoveFirst();
   Пока rs.Eof()=0 Цикл    
       НомерСтроки=НомерСтроки+1;
       Если СледСтрокаДанных=0 Тогда
           СледСтрокаДанных=ОпределитьСдвигЕкселя(СдвигИндекса,rs);
           
           rs.MoveNext();
           Продолжить;
       ИначеЕсли Найти(ВРег(СокрЛП(rs.Fields(0+СдвигИндекса).Value)),"ИТОГ")>0 Тогда
           Прервать;
       ИначеЕсли СдвигИндекса>0 Тогда
           Если Найти(ВРег(СокрЛП(rs.Fields(0).Value)),"ИТОГ")>0 Тогда
               Прервать;
           Иначе
               ВсегоСтрокПоДокументу=ВсегоСтрокПоДокументу+1;
           КонецЕсли;
       Иначе
           ВсегоСтрокПоДокументу=ВсегоСтрокПоДокументу+1;
       КонецЕсли;
           
       ДатаДокумента = Дата(СокрЛП(rs.Fields(0+СдвигИндекса).Value));
       Если ПустоеЗначение(ДатаДокумента)=1 Тогда
           Сообщить(" В строке: "+ВсегоСтрокПоДокументу+" - Ошибка при определении даты документа");
           rs.MoveNext();
           Продолжить;
       КонецЕсли;
       НаименованиеОрганизации=СокрЛП(rs.Fields(1+СдвигИндекса).Value);
       ИНН = СокрЛП(rs.Fields(2+СдвигИндекса).Value);
       Сумма= Число( СтрЗаменить(СтрЗаменить(СокрЛП(rs.Fields(3+СдвигИндекса).Value),",",".")," ","") );
       ТипСостояния=СокрЛП(rs.Fields(4+СдвигИндекса).Value);
       ПервичныйДокумент=СокрЛП(rs.Fields(6+СдвигИндекса).Value);
       НазначениеПлатежа=СокрЛП(rs.Fields(7+СдвигИндекса).Value);
       Примечание=ВРег(СокрЛП(rs.Fields(8+СдвигИндекса).Value));
       Ошибка=СокрЛП(rs.Fields(9+СдвигИндекса).Value);
       
       ИтогоСуммаПоДокументу=ИтогоСуммаПоДокументу+Сумма;
       //Сообщить("-"+НомерСтроки+" = "+Сумма);
       
       Если (ВРЕГ(ТипСостояния)<>"БАНК")И(ВРЕГ(ТипСостояния)<>"КАССА") Тогда
           Сообщить("    В строке: "+(ВсегоСтрокПоДокументу)+" неизвестный тип поступления (Колонка 5 ""Тип пост-ния"" = БАНК или КАССА). Строка не загружена");
           rs.MoveNext();
           Продолжить;
       КонецЕсли;
       
       Если Примечание<>"ЕМК" Тогда
           Сообщить("    Строка "+(ВсегоСтрокПоДокументу)+" неверный получатель (Колонка 9 ""Примечания"" = ЕМК). Строка не загружена");
           rs.MoveNext();
           Продолжить;
       КонецЕсли;
       
       Если ПустоеЗначение(ИНН)=1 Тогда
           Сообщить("    В строке "+(ВсегоСтрокПоДокументу)+" не указан ИНН плательщика. Строка не загружена");
           rs.MoveNext();
           Продолжить;
       КонецЕсли;
       
       СпрКонтрагентов = СоздатьОбъект("Справочник.Контрагенты");
       
       СпрКонтрагентов.НайтиПоРеквизиту("ЮрФизЛицо", НайтиОрганизацию(ИНН, 1,НаименованиеОрганизации), 1);
       Контрагент    = СпрКонтрагентов.ТекущийЭлемент();
       
       Если ПустоеЗначение(Контрагент)=1 Тогда
           Сообщить("    Не найден контрагент по строке "+(ВсегоСтрокПоДокументу)+" с ИНН "+ИНН+" строка не загружена");
           rs.MoveNext();
           Продолжить;
       КонецЕсли;
       
       //Счетчик выгружаемого
       КолВыгружено=КолВыгружено+1;
       СуммаВыгружено=СуммаВыгружено+Сумма;
       
       ПодготовитьДокументыДляСинхронизации(ДатаДокумента,ВРЕГ(ТипСостояния));
       
       ТекДок="";
       Если ВРЕГ(ТипСостояния)="БАНК" Тогда
           СВБ.Новый();
           ТекДок=СВБ;
           ТекДок.ПервичныйДокумент=ПервичныйДокумент;
           ТекДок.Ошибка=Ошибка;
       Иначе
           ПКО.Новый();
           ТекДок=ПКО;
           ТекДок.Касса=глЗначениеПоУмолчанию("ОсновнаяКасса");
           Если ПустоеЗначение(ТекДок.Касса)=1 Тогда
               ТекДок.Касса = СпрКасса;
           КонецЕсли;
           Если Контрагент.ЮрФизЛицо.Выбран() = 1 Тогда
               ТекДок.ПринятоОт = Контрагент.ЮрФизЛицо.ПолнНаименование;
           КонецЕсли;
       КонецЕсли;
       ТекДок.ДатаДок=ДатаДокумента;
       ТекДок.УстановитьНовыйНомер();
       УстановитьВремяЗаписиДокумента(ТекДок);
                             
       //ТекДок.Фирма=глЗначениеПоУмолчанию("ОсновнаяФирма");
       //глПриИзмененииФирмы(ТекДок);
       глЗаполнитьШапку(ТекДок, 0, "продажа");
       ТекДок.КодОперации=Перечисление.КодыОпераций.ОплатаОтПокупателя;
       ТекДок.Контрагент=Контрагент;
       
       ТекДок.Договор=Контрагент.ОсновнойДоговор;
       
       Если ПустоеЗначение(ТекДок.Договор.ВалютаВзаиморасчетов) =1 Тогда
           СуммаВзаиморасчетов    = 0;
       Иначе
           СуммаВзаиморасчетов        = глПересчет(ТекДок.Сумма,
                       ТекДок.Валюта,ТекДок.Курс,
                       ТекДок.Договор.ВалютаВзаиморасчетов,ТекДок.ДатаДок);
       КонецЕсли;
       
       ТекДок.Сумма=Сумма;
       ТекДок.СуммаВзаиморасчетов=Сумма;  
       ТекДок.СозданОбработкой=1;
       ТекДок.Записать();
       ТекДок.Провести();
       Сообщить(""+ТекДок+" - загружен");
       
       rs.MoveNext();
       
   КонецЦикла;
               
   Если флгУдалиФайл = 0 Тогда
       Сообщить("Синхронизация документов");
       Документ=СоздатьОбъект("Документ");
       Для НомДок=1 По СписокУдаляемыхДокументов.РазмерСписка() Цикл
           ТекДок=СписокУдаляемыхДокументов.ПолучитьЗначение(НомДок);
           Документ.НайтиДокумент(ТекДок);
           Документ.Удалить(0);
           Сообщить("Документ "+Документ+" - помечен на удаление");
       КонецЦикла;
   Иначе
       Сообщить("Синхронизация документов (НЕТ!!!)");
   КонецЕсли;
   
   //Коммнтарий
   Сообщить("--------------------------------------------");
   Сообщить("        Выгружено строк "+СокрЛП(КолВыгружено)+"   из "+СокрЛП(ВсегоСтрокПоДокументу)+
   "   на сумму "+Формат(СуммаВыгружено,"Ч19.2, ")+" из "+Формат(ИтогоСуммаПоДокументу,"Ч19.2, "));
   Сообщить("--------------------------------------------");
   Сообщить("При нумерации строк, шапка документа """+СокрЛП(Файл)+""" в расчете не учитывается");
   Сообщить("Документы успешно загружены");
   rs.Close();
   db.Close();

КонецПроцедуры
6 CyMepku1985
 
28.06.12
15:58
Если укажу лист как выше написано,то ничего вообще ничего загружает в ТЗ.
"Select * from [0606_L7$]";

Повторюсь:
Если из документа (у которого некоторые данные не загружаются) скопировать несколько строк, например сто, в новый документ экселя (с заголовком и с шапкой), то из нового созданного документа ВСЕ данные попадают. Даже те которые не попадали из целого документа.
7 ЧеловекДуши
 
28.06.12
16:01
(6)У нас Лист1, это первая закладка книги.
Их там может быть бесконечно много.
А может и не быть, т.е. название какой либо другое.
Попросту мы не заморачивались.

...В общем по гугли, как получить список...
...Ща поищу...
8 CyMepku1985
 
28.06.12
16:04
И Когда НаборЗаписей.RecordCount = -1?
9 ЧеловекДуши
 
28.06.12
16:05
Вот тут перебирает все листы... Что к чему, гугл в помощь :)


Функция ЗагрузитьИзXLS(БылаЗагрузка)
   Перем Рез;
   
   Рез = 0;
   
   Если БылаЗагрузка = 1 Тогда
       Возврат Рез;
   ИначеЕсли Найти(Врег(ПутьКФайлу),Врег(".XLS")) = 0 Тогда
       Возврат Рез;
   КонецЕсли;
   
   Попытка
       db=0;
       db=CreateObject("ADODB.Connection");
       db.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+СокрЛП(ПутьКФайлу)+";Extended Properties=""Excel 8.0;HDR=1;IMEX=1""";
       db.Open();
       
       //Узнаем количество таблиц и их наименований!!!
       тзТаблицы=0;
       тзТаблицы=СоздатьОбъект("ТаблицаЗначений");
       тзТаблицы.НоваяКолонка("Table","Строка");
       тзТаблицы.НоваяКолонка("Type","Строка");
       
       Catalog = 0;
       Catalog = СоздатьОбъект("ADOX.Catalog");
       Catalog.ActiveConnection = db;
       
       Для iCount = 0 По Catalog.Tables.Count-1 Цикл
           Если Catalog.Tables.Item(iCount).Type <> "VIEW" Тогда
               тзТаблицы.НоваяСтрока();
               TableName = Catalog.Tables.Item(iCount).Name;
               TableName = Лев(TableName,Найти(TableName,"$"));
               тзТаблицы.Table = TableName;
               тзТаблицы.Type  = Catalog.Tables.Item(iCount).Type;
           КонецЕсли;
       КонецЦикла;
       
       Если тзТаблицы.КоличествоСтрок()=0 Тогда
           db.Close();
           Возврат Рез;
       КонецЕсли;
       
       rs=0;
       rs=CreateObject("ADODB.Recordset");
       
       шш1 = 1;
       Пока шш1 <= тзТаблицы.КоличествоСтрок() Цикл
           
           ИмяСтраницы = СокрЛП(тзТаблицы.ПолучитьЗначение(шш1,"Table"));
           Если ПустоеЗначение(ИмяСтраницы) = 1 Тогда
               тзТаблицы.УдалитьСтроку(шш1);
               Продолжить;
           КонецЕсли;
           
           //проверим таблицу!!!
           rs.ActiveConnection = db;
           rs.CursorType = 3;
           rs.LockType = 2;
           rs.Source = "Select * from ["+ИмяСтраницы+"]";
           rs.Open();
           
           Если rs.Fields.Count < 4  Тогда //это то что надо!!!
               тзТаблицы.УдалитьСтроку(шш1);
           КонецЕсли;
           
           rs.Close();
           
           шш1 = шш1 + 1;
       КонецЦикла;

       Если тзТаблицы.КоличествоСтрок()=0 Тогда
           db.Close();
           Возврат Рез;
       КонецЕсли;
       
       //Произведем выбор из списка, интерактивно!!!
       СпсМеню = 0;
       СпсМеню = СоздатьОбъект("СписокЗначений");
       тзТаблицы.Выгрузить(СпсМеню,,,"Table");
       
       Если СпсМеню.РазмерСписка() > 1 Тогда
           ИмяСтраницы = "";
           Если СпсМеню.ВыбратьЗначение(ИмяСтраницы,"Выбрать загружаемый лист...",,60,0) <> 1 Тогда
               db.Close();
               Возврат Рез;
           КонецЕсли;
       ИначеЕсли СпсМеню.РазмерСписка() = 1 Тогда
           ИмяСтраницы = СпсМеню.ПолучитьЗначение(1);
       Иначе
           db.Close();
           Возврат Рез;
       КонецЕсли;
       
       //Начнем поэтапно считывать данне из таблиц!!!
       //rs=0;
       //rs=CreateObject("ADODB.Recordset");
       rs.ActiveConnection = db;
       rs.CursorType = 3;
       rs.LockType = 2;
       rs.Source = "Select * from ["+ИмяСтраницы+"]";
       rs.Open();
       
       //rs.Fields.Count = количество колонок :) -1, т.к. начинется все с 0-ля
       
   Исключение      
       Сообщить("Ошибка при загрузки данных из екселя!!!
       |Описание: "+ОписаниеОшибки(),"!");
       Возврат Рез;
   КонецПопытки;
   
   //Перечисление    Значение    Описание
   //adSchemaColumns    4    Это значение указывает, что QueryType запрашивает сведения о столбцах таблиц на сервере (не поддерживается при подключении до мэйнфреймов).
   //adSchemaIndexes    12    Это значение указывает, что QueryType запрашивает индекс информацию о таблицах на сервере (не поддерживается при подключении до мэйнфреймов).
   //adSchemaTables    20    Это значение указывает, что QueryType запрашивает информацию о таблицах на сервере.
   //adSchemaProviderTypes    22    Это значение указывает, что QueryType запрашивает поставщика информации о типах.    
   
   ТЗ_Загрузки = 0;
   ТЗ_Загрузки = СоздатьОбъект("ТаблицаЗначений");
   ТаблицаСотрудников.УдалитьСтроки();
   ТаблицаСотрудников.Выгрузить(ТЗ_Загрузки);
   
   //Начнем этап считывания данных из файла!!!
   НашлиНужнуюСтроку = 0;
   НомСтр = 0;
   
   rs.MoveFirst();
   Пока rs.Eof()=0 Цикл    
       
       НомПП    = СокрЛП(rs.Fields(0).Value);
       ФИО        = СокрЛП(rs.Fields(1).Value);
       Паспорт    = СокрЛП(rs.Fields(2).Value);
       СчетБНК    = СокрЛП(rs.Fields(3).Value);
       
       Если НашлиНужнуюСтроку = 0 Тогда //еще неначали, а уже приплыли!!!
           Если Врег(НомПП) = Врег("№  п/п") Тогда
               Если Врег(ФИО) = Врег("Фамилия, имя, отчество") Тогда
                   Если Врег(Паспорт) = Врег("№ Паспорта") Тогда
                       Если Врег(СчетБНК) = Врег("№ открытого счета") Тогда
                           //***********************************************
                           НашлиНужнуюСтроку = 1;
                       КонецЕсли;
                   КонецЕсли;
               КонецЕсли;
           КонецЕсли;
       Иначе
           //уже нашли, и это первая строка!!!
           Если ПустоеЗначение(НомПП) = 1 Тогда
               Если ПустоеЗначение(ФИО) = 1 Тогда
                   Если ПустоеЗначение(Паспорт) = 1 Тогда
                       Если ПустоеЗначение(СчетБНК) = 1 Тогда
                           //***********************************************
                           Прервать;
                       КонецЕсли;
                   КонецЕсли;
               КонецЕсли;
           КонецЕсли;
           //Страховка!!!
           Если ПустоеЗначение(СчетБНК) = 1 Тогда
               Прервать;
           КонецЕсли;
           
           НомСтр=НомСтр+1;
           
           L_NAME = ""; F_NAME = ""; M_NAME = "";
           РазобратьФИО(ФИО,L_NAME,F_NAME,M_NAME);
           
           ТЗ_Загрузки.НоваяСтрока();
           ТЗ_Загрузки.НомПП        = НомСтр;
           ТЗ_Загрузки.Пометка        = 1;
           ТЗ_Загрузки.Фамилия        = L_NAME;
           ТЗ_Загрузки.Имя            = F_NAME;
           ТЗ_Загрузки.Отчество    = M_NAME;
           ТЗ_Загрузки.ЗарплатныйСчет = СчетБНК;
           ТЗ_Загрузки.Сотрудники    = ПолучитьСотрудника(L_NAME,F_NAME,M_NAME);
           
       КонецЕсли;
       
       rs.MoveNext();
   КонецЦикла;
   
   //Завершено считвапние!!!
   rs.Close();
   db.Close();
   
   Рез = 1;
   
   ТЗ_Загрузки.Выгрузить(ТаблицаСотрудников);
   УстановитьФорматированиеТаблицаСотрудников();
   Если ТаблицаСотрудников.КоличествоСтрок() <> 0 Тогда
       ТаблицаСотрудников.ТекущаяСтрока(1);
   КонецЕсли;
   
   Возврат Рез;
КонецФункции    // ЗагрузитьИзXLS(БылаЗагрузка)
10 ЧеловекДуши
 
28.06.12
16:05
(8)Всем побоку...
11 ЧеловекДуши
 
28.06.12
16:08
+(8)По сути, через АДО можно так же и писать
12 CyMepku1985
 
28.06.12
16:13
Щас попробую дописать с поиском листов в книге...
13 CyMepku1985
 
03.07.12
00:12
rs.Source = "Select * from ["+имятаблицы+"] WHERE F1 = воттут";  
Воттут - переменная типа дата как правильно написать?
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.