Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
|
chtenie_excel_v_tablicu_znachenij [2021/02/03 20:52] tro создано |
chtenie_excel_v_tablicu_znachenij [2021/02/18 20:58] (текущий) tro |
||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| - | Процедура | + | < |
| - | + | & | |
| - | ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); | + | Процедура ФайлExcelНачалоВыбора(Элемент, |
| + | |||
| + | |||
| + | СтандартнаяОбработка = Ложь; | ||
| + | |||
| + | ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); | ||
| ДиалогВыбора.Заголовок = " | ДиалогВыбора.Заголовок = " | ||
| + | ДиалогВыбора.Фильтр =" | ||
| + | |||
| Если ДиалогВыбора.Выбрать() Тогда | Если ДиалогВыбора.Выбрать() Тогда | ||
| ИмяФайла = ДиалогВыбора.ПолноеИмяФайла; | ИмяФайла = ДиалогВыбора.ПолноеИмяФайла; | ||
| - | Иначе | + | КонецЕсли; |
| - | Возврат | + | |
| - | КонецЕсли; | + | |
| - | Таблица = Excel_ПолучитьДанные_ADO(ИмяФайла," | + | КонецПроцедуры |
| - | + | </ | |
| - | КонецПроцедуры | + | < |
| + | &НаКлиенте | ||
| + | Процедура ОбработатьExcelФайл(Команда) | ||
| + | |||
| + | ОчиститьСообщения(); | ||
| + | |||
| + | Если ПустаяСтрока(ИмяФайла) Тогда Возврат; | ||
| + | |||
| + | // | ||
| + | LogФайл = Новый ТекстовыйДокумент; | ||
| + | |||
| + | мсооб = Новый СообщениеПользователю; | ||
| + | мсооб.Текст = "" | ||
| + | LogФайл.ДобавитьСтроку(мсооб.Текст); | ||
| + | мсооб.Сообщить(); | ||
| - | ---- | + | Excel = ПодключитьсяКЭкселю(); |
| - | Функция Excel_ПолучитьДанные_ADO(ПутьКФайлуExcel, ИмяЛистаВФайлеExcel, СтруктураКолонок | + | Если Excel=Неопределено |
| - | + | Книга = Excel.WorkBooks.Open(ИмяФайла); | |
| - | пФайл = ПутьКФайлуExcel; | + | Лист = Книга.WorkSheets(1); |
| - | пЛист = ИмяЛистаВФайлеExcel; | + | |
| - | #Если Клиент Тогда | + | ВсегоКолонок = Лист.Cells(1, |
| - | Состояние("Установка соединения с Excel" | + | ВсегоСтрок = Лист.Cells(1, |
| - | #КонецЕсли | + | ИсточникКодВ1 = ОпределитьЧтоЕстьКод(СокрЛП(Лист.Cells(2, |
| - | + | НаборСтрокФайла = новый массив; | |
| - | //ЗаголовкиВСтроке1 = " | + | СчетчикПроблемныхПозиций = 0; |
| - | ЗаголовкиВСтроке1 = " | + | |
| - | + | ||
| - | | + | //Начинаем с второй строки |
| - | + | для | |
| - | Connection = Новый COMОбъект(" | + | |
| - | Connection.ConnectionString = СтрокаСоединения; | + | //Находим номенклатуру по ШК |
| - | + | Код_товара = СокрЛП(Лист.Cells(Строка,ЭксельНомерКолонкиСКодом).Value); | |
| - | Попытка | + | |
| - | Connection.Open(); | + | Если не ЗначениеЗаполнено(Код_товара) И ЗначениеЗаполнено(СокрЛП(Лист.Cells(Строка, |
| - | | + | мсооб = Новый СообщениеПользователю; |
| - | Сообщить ("Проблемы с подключением к Excel" ); | + | ИмяПозиции1 = " |
| - | Возврат Неопределено; | + | ИмяПозиции2 = " ("+СокрЛП(Лист.Cells(Строка, |
| - | КонецПопытки; | + | ОбщеИмяПозиции = ИмяПозиции1+ИмяПозиции2; |
| - | + | мсооб.Текст = "" | |
| - | RS = Новый COMОбъект("ADODB.Recordset"); | + | LogФайл.ДобавитьСтроку(мсооб.Текст); |
| - | + | мсооб.Сообщить(); | |
| - | ТекстЗапроса | + | Продолжить; |
| - | | + | ИначеЕсли не ЗначениеЗаполнено(Код_товара) Тогда |
| - | | Лист.* | + | Продолжить; |
| - | |FROM | + | КонецЕсли; |
| - | | [" + пЛист + "$] as Лист"; | + | |
| - | + | ||
| - | | + | Если ЗначениеЗаполнено(СокрЛП(ЭксельКолдПозицииДляОбработки)) И Код_товара<> |
| - | RS.Open(ТекстЗапроса, | + | |
| - | Исключение | + | НоменклатураИлиХарактеристикаПоШтрихКоду = НайтиПозициюПоШК(Код_товара); |
| - | | + | |
| - | Возврат Неопределено; | + | |
| - | КонецПопытки; | + | //Проверяем |
| - | + | ID_группы_разновидностей = СокрЛП(Лист.Cells(Строка,ЭксельНомерКолонкиСКодомГруппы).Value); | |
| - | | + | ЭтоВторостепеннаяХарактеристика=УжеЕстьВТЗУжеОбработанных(Код_товара, |
| - | + | ||
| - | Если СтруктураКолонок | + | |
| - | + | ||
| - | Для Счетчик = 1 По RS.Fields.Count Цикл | + | Если |
| - | Поле = RS.Fields.Item(Счетчик - 1); | + | ЭксельКолВоИзмененныхЗаписией = ЭксельКолВоИзмененныхЗаписией+1; |
| - | | + | Лист.Cells(Строка, |
| - | | + | КонецЕсли; |
| - | + | ||
| - | Иначе | + | //Обновляем индикатор прогресса |
| - | + | ИндикаторОбработкиExcel = Строка; | |
| - | Для каждого КлючИЗначение Из СтруктураКолонок Цикл | + | |
| - | | + | // |
| - | КонецЦикла; | + | Если |
| - | + | ОтключитьсяОтЭкселя(Excel, | |
| - | КонецЕсли; | + | Прервать; |
| - | + | КонецЕсли; | |
| - | НомерСтроки = 0; | + | |
| - | КолвоСтрок = RS.RecordCount; | + | КонецЦикла; |
| - | + | ||
| - | | + | // |
| - | + | ОтключитьсяОтЭкселя(Excel, | |
| - | | + | |
| - | + | //Закрываем лог | |
| - | #Если Клиент Тогда | + | LogФайл.ДобавитьСтроку("" |
| - | Состояние("Чтение файла: " + Формат(НомерСтроки) + " | + | Если ЭксельСохранятьЛог Тогда |
| - | ОбработкаПрерыванияПользователя(); | + | LogФайл.Записать(ЭксельПутьДляСохраненияЛога,КодировкаТекста.UTF8, |
| - | #КонецЕсли | + | КонецЕсли; |
| - | + | ||
| - | Если | + | мсооб = новый СообщениеПользователю; |
| - | RS.MoveNext(); | + | мсооб.Текст = " |
| - | | + | мсооб.Сообщить(); |
| - | | + | |
| - | + | КонецПроцедуры | |
| - | Если КонСтрока | + | |
| - | Прервать; | + | |
| - | КонецЕсли; | + | |
| - | + | ||
| - | НоваяСтрока | + | |
| - | + | ||
| - | Если СтруктураКолонок = Неопределено Тогда | + | |
| - | + | ||
| - | Для Счетчик = 1 По RS.Fields.Count Цикл | + | |
| - | + | ||
| - | Поле = RS.Fields.Item(Счетчик | + | |
| - | НоваяСтрока[" | + | |
| - | + | ||
| - | КонецЦикла; | + | |
| - | + | ||
| - | Иначе | + | |
| - | + | ||
| - | Для каждого КлючИЗначение Из СтруктураКолонок Цикл | + | |
| - | + | ||
| - | Поле = RS.Fields.Item(КлючИЗначение.Значение - 1); | + | |
| - | НоваяСтрока[КлючИЗначение.Ключ] = Поле.Value; | + | |
| - | + | ||
| - | КонецЦикла; | + | |
| - | + | ||
| - | | + | |
| - | + | ||
| - | // Обработка других полей | + | |
| - | RS.MoveNext(); | + | |
| - | + | ||
| - | | + | |
| - | + | ||
| - | // Завершение | + | |
| - | + | ||
| - | RS.Close(); | + | |
| - | | + | |
| - | + | ||
| - | Возврат Таблица; | + | |
| - | + | ||
| - | КонецФункции | + | |
| + | </ | ||
| - | ---- | + | < |
| - | Функция | + | & |
| - | + | Функция ПодключитьсяКЭкселю() | |
| - | # | + | |
| - | Состояние(" | + | Excel = Неопределено; |
| - | # | + | |
| - | + | Попытка | |
| - | Если XLSОбъект = Неопределено Тогда | + | Excel |
| - | | + | Исключение |
| - | | + | Сообщить(" |
| - | XLSОбъект.DisplayAlerts = Ложь; | + | Сообщить(ОписаниеОшибки()); |
| - | КонецЕсли; | + | |
| - | + | Excel.DisplayAlerts | |
| - | Попытка | + | Excel.ActiveWorkbook.Close(); |
| - | Book = XLSОбъект.Workbooks.Open(пФайл, | + | Excel.DisplayAlerts |
| - | | + | Excel.Application.Quit(); |
| - | Сообщить ("Проблемы с подключением к Excel" ); | + | Excel |
| - | Возврат Неопределено; | + | Возврат |
| - | КонецПопытки; | + | КонецПопытки; |
| - | + | ||
| - | Лист = Book.Sheets(1); | + | Возврат |
| - | КолвоКолонок = Лист.Cells(1, | + | |
| - | КолвоСтрок | + | |
| - | + | ||
| - | Таблица = Новый ТаблицаЗначений; | + | |
| - | + | ||
| - | Если СтруктураКолонок = Неопределено Тогда | + | |
| - | + | ||
| - | Для Счетчик = 1 По КолвоКолонок Цикл | + | |
| - | Колонка = Таблица.Колонки.Добавить(" | + | |
| - | | + | |
| - | + | ||
| - | Иначе | + | |
| - | + | ||
| - | Для каждого КлючИЗначение Из СтруктураКолонок Цикл | + | |
| - | Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ); | + | |
| - | КонецЦикла; | + | |
| - | + | ||
| - | КонецЕсли; | + | |
| - | + | ||
| - | НачСтрока = ?(НачСтрока = 0, 1, НачСтрока); | + | |
| - | | + | |
| - | | + | |
| - | + | ||
| - | Для НомерСтроки | + | |
| - | + | ||
| - | #Если Клиент Тогда | + | |
| - | Состояние(" | + | |
| - | | + | |
| - | # | + | |
| - | + | ||
| - | НоваяСтрока = Таблица.Добавить(); | + | |
| - | + | ||
| - | Если СтруктураКолонок | + | |
| - | + | ||
| - | Для НомерКолонки = 1 По КолвоКолонок Цикл | + | |
| - | + | ||
| - | Поле = Лист.Cells(НомерСтроки, | + | |
| - | НоваяСтрока[" | + | |
| - | + | ||
| - | | + | |
| - | + | ||
| - | Иначе | + | |
| - | + | ||
| - | Для каждого КлючИЗначение Из СтруктураКолонок Цикл | + | |
| - | + | ||
| - | | + | |
| - | | + | |
| - | + | ||
| - | КонецЦикла; | + | |
| - | + | ||
| - | КонецЕсли; | + | |
| - | + | ||
| - | КонецЦикла; | + | |
| - | + | ||
| - | XLSОбъект.Application.Quit(); | + | |
| - | | + | |
| - | + | ||
| КонецФункции | КонецФункции | ||
| + | </ | ||
| - | ---- | + | < |
| + | & | ||
| + | Процедура ОтключитьсяОтЭкселя(Excel, | ||
| + | |||
| + | Если Excel<> | ||
| + | |||
| + | ПолныйПутьНовоеИмяФайла = СгенерироватьНовоеИмяФайла(ИмяФайла); | ||
| + | Excel.ActiveWorkBook.SaveAs(ПолныйПутьНовоеИмяФайла); | ||
| + | |||
| + | Excel.DisplayAlerts = 0; | ||
| + | Excel.ActiveWorkbook.Close(); | ||
| + | Excel.DisplayAlerts = 1; | ||
| + | Excel.Application.Quit(); | ||
| + | Excel = Неопределено; | ||
| + | ХранилищеТЗ = ""; | ||
| + | |||
| + | мсооб = Новый СообщениеПользователю; | ||
| + | мсооб.Текст = "" | ||
| + | мсооб.Сообщить(); | ||
| + | |||
| + | КонецЕсли; | ||
| + | |||
| + | КонецПроцедуры | ||
| - | Функция Excel_ПолучитьДанные_COMArray(пФайл, | + | </code> |
| - | + | ||
| - | #Если Клиент Тогда | + | |
| - | Состояние(" | + | |
| - | # | + | |
| - | + | ||
| - | Если XLSОбъект = Неопределено Тогда | + | |
| - | XLSОбъект = Новый COMОбъект(" | + | |
| - | XLSОбъект.Visible | + | |
| - | XLSОбъект.DisplayAlerts = Ложь; | + | |
| - | КонецЕсли; | + | |
| - | + | ||
| - | Попытка | + | |
| - | Book = XLSОбъект.Workbooks.Open(пФайл, | + | |
| - | Исключение | + | |
| - | Сообщить (" | + | |
| - | Возврат Неопределено; | + | |
| - | КонецПопытки; | + | |
| - | + | ||
| - | Лист = Book.Sheets(1); | + | |
| - | КолвоКолонок = Лист.Cells(1, | + | |
| - | КолвоСтрок | + | |
| - | + | ||
| - | Таблица = Новый ТаблицаЗначений; | + | |
| - | + | ||
| - | Если СтруктураКолонок = Неопределено Тогда | + | |
| - | + | ||
| - | Для Счетчик = 1 По КолвоКолонок Цикл | + | |
| - | Колонка = Таблица.Колонки.Добавить(" | + | |
| - | КонецЦикла; | + | |
| - | + | ||
| - | Иначе | + | |
| - | + | ||
| - | МаксимальныйНомерКолонки = 0; | + | |
| - | Для каждого КлючИЗначение Из СтруктураКолонок Цикл | + | |
| - | Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ); | + | |
| - | МаксимальныйНомерКолонки = Макс(МаксимальныйНомерКолонки, | + | |
| - | КонецЦикла; | + | |
| - | + | ||
| - | КолвоКолонок = Мин(КолвоКолонок, | + | |
| - | + | ||
| - | КонецЕсли; | + | |
| - | + | ||
| - | НачСтрока = ? | + | |
| - | КонСтрока = ? | + | |
| - | КонСтрока = Мин(КонСтрока, | + | |
| - | + | ||
| - | | + | |
| - | Массив = Лист.Range(Лист.Cells(НачСтрока, | + | |
| - | КолвоСтрок | + | |
| - | + | ||
| - | Для НомерСтроки = 1 По КолвоСтрок Цикл | + | |
| - | + | ||
| - | #Если Клиент Тогда | + | |
| - | Состояние(" | + | |
| - | ОбработкаПрерыванияПользователя(); | + | |
| - | # | + | |
| - | + | ||
| - | НоваяСтрока = Таблица.Добавить(); | + | |
| - | + | ||
| - | Если СтруктураКолонок = Неопределено Тогда | + | |
| - | + | ||
| - | Для НомерКолонки = 1 По КолвоКолонок Цикл | + | |
| - | + | ||
| - | НоваяСтрока[" | + | |
| - | + | ||
| - | КонецЦикла; | + | |
| - | + | ||
| - | Иначе | + | |
| - | + | ||
| - | Для каждого КлючИЗначение Из СтруктураКолонок Цикл | + | |
| - | + | ||
| - | НоваяСтрока[КлючИЗначение.Ключ] = Массив.GetValue(КлючИЗначение.Значение, | + | |
| - | + | ||
| - | КонецЦикла; | + | |
| - | + | ||
| - | КонецЕсли; | + | |
| - | + | ||
| - | КонецЦикла; | + | |
| - | + | ||
| - | XLSОбъект.Application.Quit(); | + | |
| - | Возврат Таблица; | + | |
| - | + | ||
| - | КонецФункции | + | |
| + | < | ||
| + | & | ||
| + | Функция СгенерироватьНовоеИмяФайла(СтароеИмя) | ||
| + | |||
| + | толькоимя = СтрНайти(СтароеИмя," | ||
| - | ---- | + | НовоеИмя = Лев(СтароеИмя,толькоимя)+"_new.xlsx"; |
| - | + | ||
| - | + | Возврат НовоеИмя; | |
| - | Функция Excel_ПолучитьСписокЛистов(пФайл, XLSОбъект = Неопределено) Экспорт | + | |
| - | + | ||
| - | Если XLSОбъект = Неопределено Тогда | + | |
| - | XLSОбъект = Новый COMОбъект("Excel.Application"); | + | |
| - | | + | |
| - | XLSОбъект.DisplayAlerts = Ложь; | + | |
| - | КонецЕсли; | + | |
| - | + | ||
| - | Попытка | + | |
| - | Book = XLSОбъект.Workbooks.Open(пФайл, | + | |
| - | Исключение | + | |
| - | Возврат Новый СписокЗначений; | + | |
| - | КонецПопытки; | + | |
| - | + | ||
| - | СписокЛистов = Новый СписокЗначений; | + | |
| - | Для каждого Лист Из XLSОбъект.Sheets Цикл | + | |
| - | СписокЛистов.Добавить(Лист.Name); | + | |
| - | КонецЦикла; | + | |
| - | + | ||
| - | XLSОбъект.Application.Quit(); | + | |
| - | Возврат СписокЛистов; | + | |
| - | + | ||
| КонецФункции | КонецФункции | ||
| + | </ | ||