&НаКлиенте
Процедура ОтчитатьДанныеФайла(Команда)
ТекстСообщения = "";
Если НЕ ЗначениеЗаполнено(ИсточникЗагрузки) Тогда
ТекстСообщения = ТекстСообщения + "Необходимо указать источник загрузки данных"+Символы.ПС;
КонецЕсли;
Если ПустаяСтрока(ТекстСообщения) Тогда
Режим = РежимДиалогаВопрос.ДаНет;
Ответ = Вопрос(НСтр("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),"");
НоваяСтрока[ИндетификатораКолонки.Представление] = ЗначениеЗаписи;
КонецЦикла;
КонецЦикла;
КонецЦикла;
Возврат ТаблицаРезультатов;
КонецФункции
Комментариев нет:
Отправить комментарий