Имя: Пароль:
1C
1C 7.7
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
Спасибо всем за активное участие!
Основная теорема систематики: Новые системы плодят новые проблемы.