chtenie_excel_v_tablicu_znachenij

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
chtenie_excel_v_tablicu_znachenij [2021/02/03 20:52]
tro создано
chtenie_excel_v_tablicu_znachenij [2021/02/18 20:58] (текущий)
tro
Строка 1: Строка 1:
-Процедура ОткрытьФайл()   +<code> 
-  +&НаКлиенте 
-ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);+Процедура ФайлExcelНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) 
 +  
 + 
 + СтандартнаяОбработка = Ложь; 
 +  
 + ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
  ДиалогВыбора.Заголовок = "Выберите файл";  ДиалогВыбора.Заголовок = "Выберите файл";
 + ДиалогВыбора.Фильтр ="Документ Excel (*.xls, *.xlsx)|*.xls;*.xlsx|";
 +
  Если ДиалогВыбора.Выбрать() Тогда  Если ДиалогВыбора.Выбрать() Тогда
  ИмяФайла = ДиалогВыбора.ПолноеИмяФайла;  ИмяФайла = ДиалогВыбора.ПолноеИмяФайла;
- Иначе  + КонецЕсли;
- Возврат +
- КонецЕсли;+
   
- Таблица = Excel_ПолучитьДанные_ADO(ИмяФайла,"Лист1",,1); +КонецПроцедуры 
- +</code>
  
-КонецПроцедуры +<code> 
 +&НаКлиенте 
 +Процедура ОбработатьExcelФайл(Команда) 
 +  
 + ОчиститьСообщения(); 
 +  
 + Если ПустаяСтрока(ИмяФайла) Тогда Возврат; КонецЕсли; 
 +  
 + //Логируем 
 + LogФайл = Новый ТекстовыйДокумент; 
 +  
 + мсооб = Новый СообщениеПользователю; 
 + мсооб.Текст = ""+ТекущаяДата()+": Начало обработки."; 
 + LogФайл.ДобавитьСтроку(мсооб.Текст); 
 + мсооб.Сообщить();
  
----- + Excel = ПодключитьсяКЭкселю(); 
-Функция Excel_ПолучитьДанные_ADO(ПутьКФайлуExcel, ИмяЛистаВФайлеExcel, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0) Экспорт + Если Excel=Неопределено Тогда Возврат; КонецЕсли;  
-  + Книга = Excel.WorkBooks.Open(ИмяФайла)
- пФайл = ПутьКФайлуExcel+ Лист = Книга.WorkSheets(1);
- пЛист = ИмяЛистаВФайлеExcel;+
   
- сли Клиент Тогда + ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column; 
-    Состояние(становка соединения с Excel"); + ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;  
-    #КонецЕсли + ИсточникКодВ1 = ОпределитьЧтоЕстьКод(СокрЛП(Лист.Cells(2,1).Value)); 
-  + НаборСтрокФайла = новый массив; 
-    //ЗаголовкиВСтроке"HDR=YES;" + СчетчикПроблемныхПозиций = 0
-    ЗаголовкиВСтроке1 "HDR=NO;"; +  
-  +  
-    СтрокаСоединения ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + СокрЛП(пФайл) +";Extended Properties=""Excel 8.0;" + ЗаголовкиВСтроке1 + "IMEX=1;"""; + //Начинаем с второй строки в первой шапка) 
-  + для Строка 2 по ВсегоСтрок цикл 
-    Connection = Новый COMОбъект("ADODB.Connection"); +  
-    Connection.ConnectionString =  СтрокаСоединения; + //Находим номенклатуру по ШК 
-  + Код_товара = СокрЛП(Лист.Cells(Строка,ЭксельНомерКолонкиСКодом).Value); 
-    Попытка +  
-        Connection.Open()+ Если не ЗначениеЗаполнено(Код_товара) И ЗначениеЗаполнено(СокрЛП(Лист.Cells(Строка,15).Value)) Тогда 
-    Исключение + мсооб = Новый СообщениеПользователю
-        Сообщить (роблемы с подключением к Excel" ); + ИмяПозиции1 = "("окрЛП(Лист.Cells(Строка,15).Value)+")"
-        Возврат Неопределено+ ИмяПозиции2 = " ("+СокрЛП(Лист.Cells(Строка,2).Value)+")"
-    КонецПопытки; + ОбщеИмяПозиции = ИмяПозиции1+ИмяПозиции2; 
-  + мсооб.Текст = ""+ТекущаяДата()+": Для позиции "+ОбщеИмяПозиции+" не указан код на PromUa"; 
-    RS Новый COMОбъект("ADODB.Recordset"); + LogФайл.ДобавитьСтроку(мсооб.Текст); 
-  + мсооб.Сообщить(); 
-    ТекстЗапроса = + Продолжить;  
-    "SELECT + ИначеЕсли не ЗначениеЗаполнено(Код_товара) Тогда  
-    |    Лист.* + Продолжить
-    |FROM + КонецЕсли; 
-    |    [" + пЛист + "$] as Лист"+  
-  +  
-    Попытка + Если ЗначениеЗаполнено(СокрЛП(ЭксельКолдПозицииДляОбработки)) И Код_товара<>СокрЛП(ЭксельКолдПозицииДляОбработки) Тогда Продолжить; КонецЕсли
-        RS.Open(ТекстЗапроса, Connection); +  
-    Исключение + НоменклатураИлиХарактеристикаПоШтрихКоду = НайтиПозициюПоШК(Код_товара);  
-        Сообщить ("Проблемы с выполнением запроса"); +  
-        Возврат Неопределено; +  
-    КонецПопытки; + //Проверяем колонку с номером группы разновидностй 
-  + ID_группы_разновидностей = СокрЛП(Лист.Cells(СтрокаксельНомерКолонкиСКодомГруппы).Value);  
-    Таблица = Новый ТаблицаЗначений; + ЭтоВторостепеннаяХарактеристика=УжеЕстьВТЗУжеОбработанных(Код_товара,ID_группы_разновидностей);  
-  +  
-    Если СтруктураКолонок = Неопределено Тогда +  НовыйГуид = ПолучитьГУИДНоменклатурыИДИХарКИ(НоменклатураИлиХарактеристикаПоШтрихКоду,ЭтоВторостепеннаяХарактеристикаод_товара,СчетчикПроблемныхПозиций,ID_группы_разновидностей,LogФайл,ОбщеИмяПозиции);  
-  +  
-        Для Счетчик = 1 По RS.Fields.Count Цикл + Если СокрЛП(строка(Лист.Cells(Строка,ЭксельНомерКолонкиСГУИД1С).Value))<>СокрЛП(строка(НовыйГуид)) Тогда  
-            Поле = RS.Fields.Item(Счетчик - 1)+ ЭксельКолВоИзмененныхЗаписией = ЭксельКолВоИзмененныхЗаписией+1;  
-            Колонка = Таблица.Колонки.Добавить("К" + Счетчик, , Поле.Name); + Лист.Cells(Строка,ЭксельНомерКолонкиСГУИД1С).Value = строкаовыйГуид)
-        КонецЦикла+ КонецЕсли; 
-  +  
-    Иначе + //Обновляем индикатор прогресса 
-  + ИндикаторОбработкиExcel = Строка
-        Для каждого КлючИЗначение Из СтруктураКолонок Цикл +  
-            Колонка Таблица.Колонки.Добавить(КлючИЗначение.Ключ); + //Заглушка если нужно остановить цикл 
-        КонецЦикла; + Если КоличествоСтрокДляОбработки>0 И Строка=(КоличествоСтрокДляОбработки+1) Тогда 
-  + ОтключитьсяОтЭкселя(Excel,ИмяФайла); 
-    КонецЕсли; + Прервать; 
-  + КонецЕсли; 
-    НомерСтроки = 0; +  
-    КолвоСтрок  = RS.RecordCount; + КонецЦикла; 
-  +  
-    Пока RS.EOF() = 0 Цикл + //сохранить и Закрываем эксель 
-  + ОтключитьсяОтЭкселя(Excel,ИмяФайла); 
-        НомерСтроки = НомерСтроки + 1; +  
-  + //Закрываем лог 
-        #Если Клиент Тогда + LogФайл.ДобавитьСтроку(""+ТекущаяДата()+": Обработка завершена"); 
-        Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КолвоСтрок)); + Если ЭксельСохранятьЛог Тогда  
-        ОбработкаПрерыванияПользователя(); + LogФайл.Записать(ЭксельПутьДляСохраненияЛога,КодировкаТекста.UTF8,Символы.ВК + Символы.ПС); 
-        #КонецЕсли + КонецЕсли
-  +  
-        Если НомерСтроки < НачСтрока Тогда + мсооб = новый СообщениеПользователю
-            RS.MoveNext()+ мсооб.Текст = "Отчет сохранен в файле: "+ЭксельПутьДляСохраненияЛога
-            Продолжить+ мсооб.Сообщить()
-        КонецЕсли+  
-  +КонецПроцедуры
-        Если КонСтрока > 0 И НомерСтроки > КонСтрока Тогда +
-            Прервать+
-        КонецЕсли; +
-  +
-        НоваяСтрока = Таблицаобавить(); +
-  +
-        Если СтруктураКолонок = Неопределено Тогда +
-  +
-            Для Счетчик = 1 По RS.Fields.Count Цикл +
-  +
-                Поле = RS.Fields.Item(Счетчик - 1); +
-                НоваяСтрока["К" + Счетчик] = Поле.Value+
-  +
-            КонецЦикла; +
-  +
-        Иначе +
-  +
-            Для каждого КлючИЗначение Из СтруктураКолонок Цикл +
-  +
-                Поле = RS.Fields.Item(КлючИЗначениеначение - 1); +
-                НоваяСтрокалючИЗначениелюч] = Поле.Value; +
-  +
-            КонецЦикла+
-  +
-        КонецЕсли+
-  +
-        // Обработка других полей +
-        RS.MoveNext(); +
-  +
-    КонецЦикла+
-  +
-    // Завершение работы +
-  +
-    RS.Close()+
-    Connection.Close(); +
-  +
-    Возврат Таблица; +
-  +
-КонецФункции+
  
 +</code>
  
----- +<code> 
-Функция Excel_ПолучитьДанные_COM(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0, XLSОбъект = Неопределено) Экспорт +&НаКлиенте 
-  +Функция ПодключитьсяКЭкселю() 
-    #Если Клиент Тогда +  
-    Состояние("Открытие Excel"); + Excel = Неопределено; 
-    #КонецЕсли +  
-  + Попытка 
-    Если XLSОбъект = Неопределено Тогда + Excel = Новый COMОбъект("Excel.Application"); 
-        XLSОбъект = Новый COMОбъект("Excel.Application"); + Исключение 
-        XLSОбъект.Visible       = Ложь; + Сообщить("Ошибка при открытии файла с помощью Excel! Возможно не устанволен Эксель на этом ПК"); 
-        XLSОбъект.DisplayAlerts = Ложь; + Сообщить(ОписаниеОшибки()); 
-    КонецЕсли; +  
-  + Excel.DisplayAlerts = 0;  
-    Попытка + Excel.ActiveWorkbook.Close(); 
-        Book = XLSОбъект.Workbooks.Open(пФайл, , Истина); + Excel.DisplayAlerts 1
-    Исключение + Excel.Application.Quit(); 
-        Сообщить ("Проблемы с подключением к Excel" ); + Excel = Неопределено; 
-        Возврат Неопределено+ Возврат Excel
-    КонецПопытки; + КонецПопытки; 
-  +  
-    Лист = Book.Sheets(1); + Возврат Excel
-    КолвоКолонок = Лист.Cells(1,1).SpecialCells(11).Column; +
-    КолвоСтрок   = Лист.Cells(1,1).SpecialCells(11).Row; +
-  +
-    Таблица = Новый ТаблицаЗначений; +
-  +
-    Если СтруктураКолонок = Неопределено Тогда +
-  +
-        Для Счетчик = 1 По КолвоКолонок Цикл +
-            Колонка = Таблица.Колонки.Добавить("К" + Счетчик); +
-        КонецЦикла; +
-  +
-    Иначе +
-  +
-        Для каждого КлючИЗначение Из СтруктураКолонок Цикл +
-            Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ); +
-        КонецЦикла; +
-  +
-    КонецЕсли+
-  +
-    НачСтрока = ?(НачСтрока = 0, 1, НачСтрока); +
-    КонСтрока = ?(КонСтрока = 0, КолвоСтрок, КонСтрока)+
-    КонСтрока = Мин(КонСтрока, КолвоСтрок); +
-  +
-    Для НомерСтроки НачСтрока По КонСтрока Цикл +
-  +
-        #Если Клиент Тогда +
-        Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КонСтрока))+
-        ОбработкаПрерыванияПользователя(); +
-        #КонецЕсли +
-  +
-        НоваяСтрока = Таблица.Добавить(); +
-  +
-        Если СтруктураКолонок = Неопределено Тогда +
-  +
-            Для НомерКолонки = 1 По КолвоКолонок Цикл +
-  +
-                Поле = Лист.Cells(НомерСтроки, НомерКолонки)+
-                НоваяСтрока["К" + Формат(НомерКолонки, "ЧГ=0")] = Поле.Value+
-  +
-            КонецЦикла; +
-  +
-        Иначе +
-  +
-            Для каждого КлючИЗначение Из СтруктураКолонок Цикл +
-  +
-                Поле = Лист.Cells(НомерСтроки, КлючИЗначение.Значение)+
-                НоваяСтрока[КлючИЗначение.Ключ] = Поле.Value; +
-  +
-            КонецЦикла; +
-  +
-        КонецЕсли; +
-  +
-    КонецЦикла; +
-  +
-    XLSОбъект.Application.Quit(); +
-    Возврат Таблица+
- +
 КонецФункции КонецФункции
  
 +</code>
  
-----+<code> 
 +&НаКлиенте 
 +Процедура ОтключитьсяОтЭкселя(Excel,ИмяФайла) 
 +  
 + Если Excel<>Неопределено Тогда  
 +  
 + ПолныйПутьНовоеИмяФайла = СгенерироватьНовоеИмяФайла(ИмяФайла); 
 + Excel.ActiveWorkBook.SaveAs(ПолныйПутьНовоеИмяФайла); 
 +  
 + Excel.DisplayAlerts = 0;  
 + Excel.ActiveWorkbook.Close(); 
 + Excel.DisplayAlerts = 1; 
 + Excel.Application.Quit(); 
 + Excel = Неопределено; 
 + ХранилищеТЗ = ""; 
 +  
 + мсооб = Новый СообщениеПользователю; 
 + мсооб.Текст = ""+ТекущаяДата()+": Загрузка завершена.Новый файл сохранен по адресу: "+ПолныйПутьНовоеИмяФайла; 
 + мсооб.Сообщить(); 
 +  
 + КонецЕсли; 
 +  
 +КонецПроцедуры
  
-Функция Excel_ПолучитьДанные_COMArray(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0, XLSОбъект = Неопределено) Экспорт +</code>
-  +
-    #Если Клиент Тогда +
-    Состояние("Открытие Excel"); +
-    #КонецЕсли +
-  +
-    Если XLSОбъект = Неопределено Тогда +
-        XLSОбъект = Новый COMОбъект("Excel.Application"); +
-        XLSОбъект.Visible       = Ложь; +
-        XLSОбъект.DisplayAlerts = Ложь; +
-    КонецЕсли; +
-  +
-    Попытка +
-        Book = XLSОбъект.Workbooks.Open(пФайл, , Истина); +
-    Исключение +
-        Сообщить ("Проблемы с подключением к Excel" ); +
-        Возврат Неопределено; +
-    КонецПопытки; +
-  +
-    Лист = Book.Sheets(1); +
-    КолвоКолонок = Лист.Cells(1,1).SpecialCells(11).Column; +
-    КолвоСтрок   = Лист.Cells(1,1).SpecialCells(11).Row; +
-  +
-    Таблица = Новый ТаблицаЗначений; +
-  +
-    Если СтруктураКолонок = Неопределено Тогда +
-  +
-        Для Счетчик = 1 По КолвоКолонок Цикл +
-            Колонка = Таблица.Колонки.Добавить("К" + Счетчик); +
-        КонецЦикла; +
-  +
-    Иначе +
-  +
-        МаксимальныйНомерКолонки = 0; +
-        Для каждого КлючИЗначение Из СтруктураКолонок Цикл +
-            Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ); +
-            МаксимальныйНомерКолонки = Макс(МаксимальныйНомерКолонки, КлючИЗначение.Значение); +
-        КонецЦикла; +
-  +
-        КолвоКолонок = Мин(КолвоКолонок, МаксимальныйНомерКолонки); +
-  +
-    КонецЕсли; +
-  +
-    НачСтрока = ?(НачСтрока = 0, 1, НачСтрока); +
-    КонСтрока = ?(КонСтрока = 0, КолвоСтрок, КонСтрока); +
-    КонСтрока = Мин(КонСтрока, КолвоСтрок); +
-  +
-    // Массив типа COMSafeArray +
-    Массив = Лист.Range(Лист.Cells(НачСтрока, 1), Лист.Cells(КонСтрока, КолвоКолонок)).Value; +
-    КолвоСтрок   = Массив.GetUpperBound(1); +
-  +
-    Для НомерСтроки = 1 По КолвоСтрок Цикл +
-  +
-        #Если Клиент Тогда +
-        Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КолвоСтрок)); +
-        ОбработкаПрерыванияПользователя(); +
-        #КонецЕсли +
-  +
-        НоваяСтрока = Таблица.Добавить(); +
-  +
-        Если СтруктураКолонок = Неопределено Тогда +
-  +
-            Для НомерКолонки = 1 По КолвоКолонок Цикл +
-  +
-                НоваяСтрока["К" + Формат(НомерКолонки, "ЧГ=0")] = Массив.GetValue(НомерКолонки, НомерСтроки); +
-  +
-            КонецЦикла; +
-  +
-        Иначе +
-  +
-            Для каждого КлючИЗначение Из СтруктураКолонок Цикл +
-  +
-                НоваяСтрока[КлючИЗначение.Ключ] = Массив.GetValue(КлючИЗначение.Значение, НомерСтроки); +
-  +
-            КонецЦикла; +
-  +
-        КонецЕсли; +
-  +
-    КонецЦикла; +
-  +
-    XLSОбъект.Application.Quit(); +
-    Возврат Таблица; +
-  +
-КонецФункции+
  
 +<code>
 +&НаКлиенте
 +Функция СгенерироватьНовоеИмяФайла(СтароеИмя)
 +
 +толькоимя = СтрНайти(СтароеИмя,".xlsx")-1;
  
----- +НовоеИмя = Лев(СтароеИмя,толькоимя)+"_new.xlsx"; 
- +  
- +Возврат НовоеИмя;  
-Функция Excel_ПолучитьСписокЛистов(пФайл, XLSОбъект = Неопределено) Экспорт +
-  +
-    Если XLSОбъект = Неопределено Тогда +
-        XLSОбъект = Новый COMОбъект("Excel.Application")+
-        XLSОбъект.Visible       = Ложь; +
-        XLSОбъект.DisplayAlerts = Ложь; +
-    КонецЕсли; +
-  +
-    Попытка +
-        Book = XLSОбъект.Workbooks.Open(пФайл, , Истина); +
-    Исключение +
-        Возврат Новый СписокЗначений; +
-    КонецПопытки; +
-  +
-    СписокЛистов = Новый СписокЗначений; +
-    Для каждого Лист Из XLSОбъект.Sheets Цикл +
-        СписокЛистов.Добавить(Лист.Name); +
-    КонецЦикла; +
-  +
-    XLSОбъект.Application.Quit(); +
-    Возврат СписокЛистов+
- +
 КонецФункции КонецФункции
 +</code>
  • /sites/data/attic/chtenie_excel_v_tablicu_znachenij.1612385542.txt.gz
  • Последнее изменение: 2021/02/03 20:52
  • tro