вторник, 23 сентября 2014 г.

Получение данных из Excel

Функция проверена годами



&НаКлиенте
Процедура ОтчитатьДанныеФайла(Команда)

   
ТекстСообщения = "";

    Если НЕ
ЗначениеЗаполнено(ИсточникЗагрузки) Тогда
       
ТекстСообщения = ТекстСообщения + "Необходимо указать источник загрузки данных"+Символы.ПС;
    КонецЕсли;

    Если
ПустаяСтрока(ТекстСообщения) Тогда

       
Режим = РежимДиалогаВопрос.ДаНет;
       
Ответ = Вопрос(НСтр("ru = 'Продолжить выполнение операции?';"
       
+ " en = 'Do you want to continue?'"), Режим, 0);
        Если
Ответ = КодВозвратаДиалога.Нет Тогда
            Возврат;
        КонецЕсли;

       
ОтчитатьДанныеФайлаНаСервере();
    Иначе
       
Сообщить(ТекстСообщения, СтатусСообщения.Важное);
    КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ОтчитатьДанныеФайлаНаСервере()

   
МодульОбъекта = РеквизитФормыВЗначение("Объект");

   
ОбрабатываемыеКолонки = Новый СписокЗначений;
   
ОбрабатываемыеКолонки.Добавить(НомерКолонкиКод, "Код");
   
ОбрабатываемыеКолонки.Добавить(НомерКолонкиАртикул, "Артикул");

   
ТаблицаЕксель = МодульОбъекта.ОбработкаИмпортаФайлаЕксель(ИсточникЗагрузки, НачальнаяСтрока, КонечнаяСтрока, ,ОбрабатываемыеКолонки);

КонецПроцедуры

&НаСервере
//Обработка импорта файла Ексель
// СтруктураКолонок, должен содержать
//      Представление: "Наименование колонки";
//      Значение: "Номер колонки"
//          если номер колонки не указан или передан служебный символ "#", будет создана просто пустая колонка
//
Функция ОбработкаИмпортаФайлаЕксель(ИмяФайла, НачСтрока=1, КонСтрока=0, НомерЛиста=0, СтруктураКолонок) Экспорт

    Если НЕ
ЗначениеЗаполнено(ИмяФайла) Тогда
       
#Если Клиент Тогда
           
Предупреждение("Необходимо указать путь к файлу",3);
       
#КонецЕсли
       
Возврат Неопределено;
    КонецЕсли;

    Если НЕ
ЗначениеЗаполнено(СтруктураКолонок) Тогда
       
#Если Клиент Тогда
           
Предупреждение("Необходимо указать структуру колонок",3);
       
#КонецЕсли
       
Возврат Неопределено;
    КонецЕсли;

   
//Разбор листов
   
СписокИспользуемыхЛистов = Новый СписокЗначений;
   
КнигаExcel = ПолучитьCOMОбъект(ИмяФайла);
   
//есть несколько вариантов исчисления:
    //1.Номер последней загружаемой строки. Если не указан, то ищется как последнее
    //  не пустой код производителя, тоесть не пустое последнее значение. А номер Листа определен
   
Если (ЗначениеЗаполнено(НомерЛиста))
    И    (НЕ
ЗначениеЗаполнено(КонСтрока))  Тогда
       
//пользователь указал лист но неуказал КонСтрока
       
Лист = КнигаExcel.Worksheets(НомерЛиста);
       
ИспользуемыйДиапазон = Лист.UsedRange;
       
ПоследняяЯчейка      = ИспользуемыйДиапазон.SpecialCells(11); //последня правая нижняя ячейка
       
Если ((ИспользуемыйДиапазон.Address<>ПоследняяЯчейка.Address) ИЛИ  (ПоследняяЯчейка.Text<>"")) Тогда
           
СписокИспользуемыхЛистов.Добавить(ИспользуемыйДиапазон.Rows.Count(),Лист.Name);
        Иначе
           
#Если Клиент Тогда
           
Предупреждение("Не могу опредилить конечную строку");
           
#КонецЕсли
           
Возврат Неопределено;
        КонецЕсли;
    ИначеЕсли (НЕ
ЗначениеЗаполнено(НомерЛиста))
    И         (
ЗначениеЗаполнено(КонСтрока))   Тогда
       
//по всех листах но с определенными КонСтрока
       
Для  ИндексЛиста = 1 По КнигаExcel.Worksheets.Count Цикл
           
Лист=КнигаExcel.Worksheets(ИндексЛиста);
           
СписокИспользуемыхЛистов.Добавить(КонСтрока,Лист.Name);
        КонецЦикла;
    ИначеЕсли (НЕ
ЗначениеЗаполнено(НомерЛиста))
    И         (НЕ
ЗначениеЗаполнено(КонСтрока))   Тогда
       
//по всех листах и нужно в каждом из них найти КонСТрока
       
Для  ИндексЛиста = 1 По КнигаExcel.Worksheets.Count Цикл
           
Лист = КнигаExcel.Worksheets(ИндексЛиста);
           
ИспользуемыйДиапазон = Лист.UsedRange;
           
ПоследняяЯчейка      = ИспользуемыйДиапазон.SpecialCells(11);
            Если ((
ИспользуемыйДиапазон.Address<>ПоследняяЯчейка.Address) ИЛИ  (ПоследняяЯчейка.Text<>"")) Тогда
               
СписокИспользуемыхЛистов.Добавить(ИспользуемыйДиапазон.Rows.Count(),Лист.Name);
            КонецЕсли;
        КонецЦикла;
    ИначеЕсли (
ЗначениеЗаполнено(НомерЛиста))
    И         (
ЗначениеЗаполнено(КонСтрока))   Тогда
       
//пользователь указал и Лист и КонСтрочку
       
Лист = КнигаExcel.Worksheets(НомерЛиста);
       
СписокИспользуемыхЛистов.Добавить(КонСтрока,Лист.Name);
    КонецЕсли;

   
// по п. 1) КвоЛистов=СписокИспользуемыхЛистов.РазмерСписка();
    // по п. 2) КвоСтрок=СписокИспользуемыхЛистов.Получить(ИмяЛиста);
   
КонСтрокаДляПрогреса = 0;
    Для Каждого
НомераКонСтроки Из СписокИспользуемыхЛистов Цикл
       
КонСтрокаДляПрогреса = КонСтрокаДляПрогреса + НомераКонСтроки.Значение;
    КонецЦикла;


   
ТаблицаРезультатов = Новый ТаблицаЗначений;
   
ТаблицаРезультатов.Колонки.Добавить("Лист");

    Для Каждого
СтрокаКолонки Из СтруктураКолонок Цикл
       
Инд = СтрокаКолонки.Представление;
       
ТаблицаРезультатов.Колонки.Добавить(Инд, Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(155)));
    КонецЦикла;


    Для Каждого
НомераКонСтроки Из СписокИспользуемыхЛистов Цикл
       
НомерЛиста = НомераКонСтроки.Представление;
       
КонСтрока  = НомераКонСтроки.Значение;

       
СостояниеПрогреса = 0;

        Для
НомерОбработанойСтроки = НачСтрока По КонСтрока Цикл

           
СостояниеПрогреса = СостояниеПрогреса + 1;

           
НоваяСтрока = ТаблицаРезультатов.Добавить();
           
НоваяСтрока.Лист = НомерЛиста;

            Для Каждого
ИндетификатораКолонки Из СтруктураКолонок Цикл
               
iCount         = ИндетификатораКолонки.Значение;

                Если (НЕ
ЗначениеЗаполнено(iCount))
                    ИЛИ (
iCount = "#") Тогда
                   
//это структура пустой колонки
                   
Продолжить;
                КонецЕсли;

               
ЗначениеЗаписи = СтрЗаменить(СокрЛП(КнигаExcel.Sheets(НомерЛиста).Cells(НомерОбработанойСтроки,iCount).Value),Символ(160),"");
               
НоваяСтрока[ИндетификатораКолонки.Представление] = ЗначениеЗаписи;
            КонецЦикла;

        КонецЦикла;
    КонецЦикла;

    Возврат
ТаблицаРезультатов;
КонецФункции

Комментариев нет:

Отправить комментарий