![]() |
![]() |
![]() |
|
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 = воттут";
Воттут - переменная типа дата как правильно написать? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |