|
v7: EXCEL 1C 7.7 | ☑ | ||
---|---|---|---|---|
0
mcwolf
05.08.14
✎
01:34
|
Доброго времени суток!
Столкнулся с задачей на днях при считывании пустых строк например если ексель начинается с 2 или 5 пустых строк то пишет получено строк 1 и все прекращается, если поставить нули в пустые строки то воаля все работает. Вопрос как пропустить пустые строки? //Создаем ОЛЕ подключение к Excel Excel = СоздатьОбъект("Excel.Application"); //Открываем файл Excel.Workbooks.Open(СокрЛП(ПутьФайла)); //Открываем активную книгу Книга = Excel.ActiveWorkbook; //Получааем количество строк в книге Строк = Excel.Cells.CurrentRegion.Rows.Count; //Создадим заранее объект справочника ТМЦ СпрТМЦ = СоздатьОбъект("Справочник.Номенклатура"); СпрЦены = СоздатьОбъект("Справочник.Цены"); СпрЕденицы=СоздатьОбъект("Справочник.Единицы"); СпрФирмы=СоздатьОбъект("Справочник.Фирмы"); СпрСклады=СоздатьОбъект("Справочник.МестаХранения"); СпрКатЦены = СоздатьОбъект("Справочник.КатегорииЦен"); Если СпрКатЦены.НайтиПоНаименованию("Закупочная",0) = 1 Тогда ТекКатЦены = СпрКатЦены.ТекущийЭлемент(); КонецЕсли; Если СпрКатЦены.НайтиПоНаименованию("Розничная",0) = 1 Тогда ТекКатЦены2 = СпрКатЦены.ТекущийЭлемент(); КонецЕсли; //Перебираем строки и обрабатываем данные Для х = Число(НачальнаяСтрока) По Строк Цикл //Зная типы значений в колонках и перебирая строки получаем //необходимые значения и обрабатываем их КодТМЦ = СокрЛП(Excel.Cells(х, АдресКода).Value); НаименованиеТМЦ = СокрЛП(Строка(Excel.Cells(х, АдресНаименования).Value)); ЦенаТМЦ = Число(Excel.Cells(х, АдресЗакЦены).Value); ЦенаРознТМЦ = Число(Excel.Cells(х, АдресРозЦены).Value); КоличествоТМЦ = Число(Excel.Cells(х, АдресКолво).Value); ЕденицаИзмеренияТМЦ = СокрЛП(Строка(Excel.Cells(х, АдресЕденицаИзмерения).Value)); //Сначала ищем товар по коду, если не нашли по наименованию сообщить ("======="); Если СпрФирмы.НайтиПоКоду("1") = 1 Тогда НайдФирма=СпрФирмы.ТекущийЭлемент(); КонецЕсли; Если СпрТМЦ.НайтиПоКоду(КодТМЦ) = 1 Тогда НайдТовар = СпрТМЦ.ТекущийЭлемент(); Иначеесли СпрТМЦ.НайтиПоНаименованию(НаименованиеТМЦ) = 1 Тогда НайдТовар = СпрТМЦ.ТекущийЭлемент(); Иначе сообщить ("Товар "+НаименованиеТМЦ+" не нашли, продолжаем","!"); Продолжить; Конецесли; |
|||
1
Злопчинский
05.08.14
✎
01:36
|
КоличествоСтрок как0-то по друлому типа SpecialCell(11)
|
|||
2
КонецЦикла
05.08.14
✎
01:38
|
Сказать 1С "начинай загрузку с ХХ строки"
|
|||
3
Злопчинский
05.08.14
✎
01:40
|
//******************************************************************
//взято у Василия Кушнира, RIP //Режим = 1 - открыть, обработать, закрыть файл, закрыть эксель //Режим = 2 - открыть, обработать, закрыть файл //Режим = 3 - закрыть эксель //РежимКолонок = 1 - колонки именуются "_НормализованноеЗаглавиеСтолбца" //РежимКолонок <> 1 - колонки именуются "_НомерСтолбца" // Функция глReadExcelEx(ИмяФайла,Excel,Режим=1,РежимКолонок=1) Экспорт Если ПустоеЗначение(Excel) = 1 Тогда Попытка Excel = СоздатьОбъект("Excel.Application"); Excel.DisplayAlerts = 0; Исключение Предупреждение("Excel на компьютере не установлен...?"); Возврат ПолучитьПустоеЗначение(); КонецПопытки; КонецЕсли; Если Режим = 3 Тогда Перейти ~ЗакрытьЭксель; КонецЕсли; Excel.Application.Workbooks.Open(СокрЛП(ИмяФайла)); Строк = Excel.Cells.SpecialCells(11).Row; // строка последней ячейки Столбцов= Excel.Cells.SpecialCells(11).Column; // столбец последней ячейки фТЗ = СоздатьОбъект("ТаблицаЗначений"); Для ы=1 По Столбцов Цикл ИмяКолонки = ы; Если РежимКолонок = 1 Тогда ИмяКолонки = СокрЛП(Excel.Cells(1,ы).Value); ИмяКолонки = глБВК_НормализоватьСтроку(ИмяКолонки,".,\/:*?""<>| "+СимволТабуляции+РазделительСтрок,""); КонецЕсли; фТЗ.НоваяКолонка("_"+ИмяКолонки); КонецЦикла; Для Стр = 1 По Строк Цикл Состояние(глБВК_ПолучитьРасширениеФайла(ИмяФайла,"\")+": обработано ::"+Стр+":: из ::"+Строк+"::"); фТЗ.НоваяСтрока(); Для Столб=1 По Столбцов Цикл фТЗ.УстановитьЗначение(Стр,Столб,СокрЛП(Excel.Cells(Стр,Столб).Value)); КонецЦикла; КонецЦикла; Если Режим <> 3 Тогда Excel.ActiveWorkbook.Close(); КонецЕсли; ~ЗакрытьЭксель: Если Режим <> 2 Тогда Excel.Quit(); Excel = ""; КонецЕсли; Если Режим = 3 Тогда Возврат ПолучитьПустоеЗначение(); КонецЕсли; Если РежимКолонок = 1 Тогда фТЗ.УдалитьСтроку(1); КонецЕсли; Возврат фТЗ; КонецФункции //глReadExcelEx() //---------------------------------------- |
|||
4
mcwolf
05.08.14
✎
01:44
|
(1) а как тогда последнюю определить, последняя строка 20 а пишет всего строк 48
|
|||
5
mcwolf
05.08.14
✎
01:46
|
(2) не хотелось бы ручками, до этого момента так и делал очень надоело )
|
|||
6
КонецЦикла
05.08.14
✎
01:55
|
(4) Файл совсем непредсказуем?
Я вообще запросом делал когда много было (наугад тупо 10000 строк влет), потом пропускал пустое блоком например или еще как |
|||
7
КонецЦикла
05.08.14
✎
01:55
|
В ТЗ засосать и пропустить
Можно даже пропуски в середине выловить |
|||
8
mcwolf
05.08.14
✎
02:03
|
(7) А примера посмотреть нет?
|
|||
9
КонецЦикла
05.08.14
✎
02:23
|
База =СоздатьОбъект("ODBCDatabase");
Если База.Соединение("DRIVER=Microsoft Excel Driver (*.xls); DBQ=" + СокрЛП(ИмяФайла)) = 0 Тогда Предупреждение("Ошибка открытия файла", 20); Возврат; КонецЕсли; RecordSetXLS =СоздатьОбъект("ODBCRecordSet"); RecordSetXLS.УстБД(База); ТекстЗапроса =" |SELECT * |FROM ["+Лист+"$A" + СтрНачалаЧтения + ":M10000] |"; ТЗ = RecordSetXLS.ВыполнитьИнструкцию(ТекстЗапроса); |
|||
10
FN
05.08.14
✎
02:49
|
Вместо всяких SpecialCells лучше взять UsedRange
Типа ЗагружаемаяОбласть=Лист.UsedRange; Строк = Число(ЗагружаемаяОбласть.Rows.Count); Столбцов = Число(ЗагружаемаяОбласть.Columns.Count); Для у=1 по Столбцов Цикл ТЗ.НоваяКолонка(); КонецЦикла; Для Х=1 по Строк Цикл ТЗ.НоваяСтрока(); Для у=1 по Столбцов Цикл Если спОшибки.НайтиЗначение(СокрЛП(ЗагружаемаяОбласть.Cells(х,у).Text))<>0 Тогда ТЗ.УстановитьЗначение(х,у,ЗагружаемаяОбласть.Cells(х,у).Text); Продолжить; КонецЕсли; значЕ=ЗагружаемаяОбласть.Cells(х,у).Value; ТЗ.УстановитьЗначение(х,у,значЕ); КонецЦикла; КонецЦикла; |
|||
11
FN
05.08.14
✎
02:51
|
А если нужно быстро, то так:
Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl"); Скрипт.language="javascript"; Скрипт.timeout=-1; Mas=Лист.UsedRange; Скрипт.addobject("Mas",Mas); Массив=Скрипт.eval("Массив=new VBArray(Mas.Value)"); спШирина=СоздатьОбъект("СписокЗначений"); Строк=Массив.ubound(1); Столбцов=Массив.ubound(2); Для у=1 по Столбцов Цикл ТЗ.НоваяКолонка(); КонецЦикла; Для л=Массив.lbound(1) По Массив.ubound(1) Цикл ТЗ.НоваяСтрока(); Для к=Массив.lbound(2) По Массив.ubound(2) Цикл Если Скрипт.eval("typeof(Массив.getItem("+л+","+к+"))")="unknown" тогда Продолжить; КонецЕсли; значЕ=(Массив.getItem(л,к)); ТЗ.УстановитьЗначение(л,к,значЕ); КонецЦикла; КонецЦикла; |
|||
12
mcwolf
05.08.14
✎
23:24
|
Спасибо всем за активное участие!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |