|
Загрузка из нескольких книг Exel в ТЧ документа | ☑ | ||
---|---|---|---|---|
0
altaro
13.08.19
✎
23:08
|
Денька доброго. Промусолено по загрузке много. Не могу догнать, как перебрать несколько книг и загрузить все в одну ТЧ. Конфа самописная. Сейчас загрузка реализована изнутри документа в модуле формы тривиальным способом.
Сначала "ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие)" ну и потом: "" Попытка Excel = Новый COMОбъект("Excel.Application"); Excel.WorkBooks.Open(Объект.ФайлExсel); Исключение Сообщить("При открытии файла произошла ошибка! Операция прервана!"); Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки; Попытка Excel.Sheets(1).Select(); Исключение Excel.ActiveWorkbook.Close(); Excel = 0; Сообщить("Первый лист не найден!"); ОтменитьТранзакцию(); Возврат; КонецПопытки; // Вычисление количества строк и колонок в зависимости от версии Excel vExcel = Лев(Excel.Version, Найти(Excel.Version,".")-1); Если vExcel = "8" тогда КоличествоСтрок = Excel.Cells.CurrentRegion.Rows.Count; КоличествоКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count,6 ); Иначе КоличествоСтрок = Excel.Cells(1,1).SpecialCells(11).Row; КоличествоКолонок = Excel.Cells(1,1).SpecialCells(11).Column; Конецесли; МассивКолонок = Новый ТаблицаЗначений; МассивКолонок.Колонки.Добавить("НомерКолонки"); МассивКолонок.Колонки.Добавить("НазваниеКолонки"); Для КолонкаОтсчета = 2 по КоличествоКолонок Цикл ИмяКолонки = Excel.Cells(2, КолонкаОтсчета).Text; ИмяБезПробелов = СтрЗаменить(ИмяКолонки," ",""); НовСтрока = МассивКолонок.Добавить(); НовСтрока.НомерКолонки = КолонкаОтсчета; НовСтрока.НазваниеКолонки = ИмяБезПробелов; КонецЦикла; Если МассивКолонок.Количество() <> 0 и МассивКолонок.НайтиСтроки(Новый Структура("НазваниеКолонки", "Номер")).Количество() <> 0 Тогда Для СтрокаОтсчета =3 по КоличествоСтрок Цикл НСтр = Объект.Надой.Добавить(); Для каждого СтрокаМассив из МассивКолонок Цикл ТекущееЗначение = Excel.Cells(СтрокаОтсчета, СтрокаМассив.НомерКолонки).Text; ИмяКолонки = Excel.Cells(2, СтрокаМассив.НомерКолонки).Text; Если ИмяКолонки = "Номер" Тогда НСтр.Номер = Справочники.Животные.НайтиПоКоду(ТекущееЗначение,Истина); ИначеЕсли ИмяКолонки = "Станок" Тогда НСтр.Станок = ТекущееЗначение; ИначеЕсли ИмяКолонки = "Надой" Тогда НСтр.Надой = ТекущееЗначение; ИначеЕсли ИмяКолонки = "Время" Тогда НСтр.Время = ТекущееЗначение; ИначеЕсли ИмяКолонки = "Интенсивность" Тогда НСтр.Интенсивность = ТекущееЗначение; ИначеЕсли ИмяКолонки = "Мастит" Тогда НСтр.Мастит = ТекущееЗначение; КонецЕсли; КонецЦикла; КонецЦикла; Иначе Сообщить("В Excel файле не достаточно данных для заполнения документа!"); КонецЕсли; Excel.DisplayAlerts = 0; Excel.Quit(); Excel.DisplayAlerts = 1; " Грузим по одному файлу, каждый следующий перевыбираем и строки добавляются в ТЧ. Задача: выбрать папку с файлами (всего файлов десять абсолютно одинакового вида) и запихнуть в одну ТЧ последовательно все строки. Файлы небольшие, по 24 строки. К сожалению, получить файлы для загрузки в виде отличном от .xls не представляется возможным. |
|||
1
Консультант Баранов
13.08.19
✎
23:20
|
В чем проблема? Как получить файлы из папки или как написать функцию перебора загрузки файлов?
|
|||
2
altaro
13.08.19
✎
23:39
|
(1) Да все нужно.
Я так понимаю, получим список файлов на клиенте, аналогично выбору одного файла, использовав Диалог.МножественныйВыбор=Истина;? Ну и все, ступор |
|||
3
MetaDon
13.08.19
✎
23:48
|
Мас = НайтиФайлы( (СокрЛП
(Константы.КаталогВходящихДокументов.Получить ())+"\Stado1\" ,"*.xls"); Если ЗначениеЗаполнено(Мас) Тогда Для каждого Стр из Мас Цикл ... |
|||
4
altaro
13.08.19
✎
23:54
|
(3) Спс за наводку. Ща прогоню
|
|||
5
altaro
20.08.19
✎
17:14
|
Сделал немного по-другому. Перебрал все файлы в каталоге, данный запихал в ТЗ. А ТЗ уже пхаю в ТЧ. В результате все грузится хорошо и быстро. Одна из колонок в ТЗ является "ссылкой" на справочник, т.е. совпадает с наименованием в справочнике и не загружается. Нужно , чтобы из этого справочника подтягивалось соответствующее наименование и заполнялось в ТЧ.
Как правильно к ТЗ обратится по условию Можно что-то типа: Если ??? = "Номер" Тогда Объект.Номер = Справочники.Животные.НайтиПоКоду(ТекущееЗначение,Истина); Или запрос городить? |
|||
6
altaro
20.08.19
✎
17:30
|
(5) Правильно сформулирую. Сопоставить значения в одной из колонок ТЗ справочнику.
|
|||
7
altaro
21.08.19
✎
15:50
|
Собрал.
Кому нужно: Функция ПрочитатьФайл(ИмяФайла) НомерЛистаExcel = 1; xlLastCell = 11; ВыбФайл = Новый Файл(ИмяФайла); Если НЕ ВыбФайл.Существует() Тогда Сообщить("Файл не существует!"); Возврат Ложь; КонецЕсли; Попытка Excel = Новый COMОбъект("Excel.Application"); Excel.WorkBooks.Open(ИмяФайла); ExcelЛист = Excel.Sheets(НомерЛистаExcel); Исключение Сообщить("Ошибка. Возможно неверно указан номер листа книги Excel."); Возврат ложь; КонецПопытки; ТЗ = новый ТаблицаЗначений; ТЗ.Колонки.Добавить("Номер", Новый ОписаниеТипов("Число")); \\тип число, чтобы возможно было найти по коду ТЗ.Колонки.Добавить("...."); ТЗ.Колонки.Добавить("....", Новый ОписаниеТипов ("Число")); ТЗ.Колонки.Добавить("....", Новый ОписаниеТипов("Число")); ТЗ.Колонки.Добавить("...."); ТЗ.Колонки.Добавить("...."); ТЗ.Колонки.Добавить("...."); ActiveCell = Excel.ActiveCell.SpecialCells(xlLastCell); // количество активных строк: RowCount = ActiveCell.Row; //количество активных колонок: ColumnCount = ActiveCell.Column; Для Row = 3 По RowCount Цикл НовСтрока = ТЗ.Добавить(); НовСтрока.ИмяФайла = ИмяФайла; НовСтрока.Номер = ExcelЛист.Cells(Row, Column).Text; \\ нужные колонки НовСтрока. ... = ExcelЛист.Cells(Row, Column).Text; НовСтрока. ... = ExcelЛист.Cells(Row, Column).Text; НовСтрока. ... = ExcelЛист.Cells(Row, Column).Text; НовСтрока. ... = ExcelЛист.Cells(Row, Column).Text; НовСтрока. ... = ExcelЛист.Cells(Row, Column).Text; КонецЦикла; Excel.WorkBooks.Close(); Excel = 0; Возврат ТЗ; КонецФункции &НаСервере Процедура ЗагрузитьНаСервере() МассивФайлов = НайтиФайлы("C:\Обмен", "*.xls", ложь); Объект.ТЧ.Очистить(); Для каждого ТекФайл из МассивФайлов Цикл ТаблицаИзФайла = ПрочитатьФайл(ТекФайл.ПолноеИмя); Для каждого ТекСтрока из ТаблицаИзФайла Цикл \\Если ТекСтрока. ... <=100 И ТекСтрока. ... <1 тогда \\некое условие \\Возврат; \\\Иначе нСтр = Объект.ТЧ.Добавить(); ЗаполнитьЗначенияСвойств(нСтр,ТекСтрока); нСтр.Номер = Справочники.Справочник.НайтиПоКоду(ТекСтрока.Номер); КонецЕсли; КонецЦикла; КонецЦикла; КонецПроцедуры &НаКлиенте Процедура Загрузить(Команда) ЗагрузитьНаСервере(); ЗапуститьПриложение("C:\Переместить.bat"); //перемещает загруженные файлы в архив КонецПроцедуры |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |