Ну что ж, приступим.
Казалось бы задача проста:
Есть два или более однотипных файлов в эксель (в моем случае это инструкции на каждый пост производства которые надо последовательно слепить в одну большую инструкцию на всю сборочную линию) надо их последовательно слить в один длинный файл. Первое что приходит в голову - сделать новый файл (новую книгу эксель) и последовательно скопировать туда открытые исходные файлы. Но по ходу хождения по "граблям" оказалось несколько тонкостей о которых я бы и хотел рассказать, во-первых, что бы я этого больше никогда не забыл, а во-вторых мне бы хотелось помочь всем тем кто столкнется с подобной задачей.
Решение:
1. Создаем экземпляр эксель, книгу, лист (это понятно)
2. Если в нашем файле эксель есть картинки, как например у меня, вписанные в ячейки, то если не скопировать формат колонок в наш новый лист эксель, их покорежит. Поэтому копируем формат колонок из листа приемника в лист источник.
Процедура ФорматироватьШиринуКолонок(ЛистИсточник, ЛистПриемник)
КоординатыИсточник = КоординатыОбласти(ЛистИсточник);
ДиапазонИсточник = ДиапазонОбласти(ЛистИсточник,КоординатыИсточник);
КопироватьШиринуСтолбцовДиапазона(ЛистПриемник, КоординатыИсточник, ДиапазонИсточник);
КонецПроцедуры
Функция КоординатыОбласти(Лист)
НачальнаяКолонка = 1;
НачальнаяСтрока = 1;
КонечнаяКолонка = Лист.Cells.CurrentRegion.Columns.Count;
КонечнаяСтрока = Лист.UsedRange.Rows.Count;
СтруктураКоординат = Новый Структура("НачальнаяКолонка,НачальнаяСтрока,КонечнаяКолонка,КонечнаяСтрока",
НачальнаяКолонка,НачальнаяСтрока,КонечнаяКолонка,КонечнаяСтрока);
Возврат СтруктураКоординат;
КонецФункции
Функция ДиапазонОбласти(Лист, Координаты)
Диапазон = Лист.Range(Лист.Cells(Координаты.НачальнаяСтрока, Координаты.НачальнаяКолонка),
Лист.Cells(Координаты.КонечнаяСтрока, Координаты.КонечнаяКолонка));
Возврат Диапазон;
КонецФункции // ()
Процедура КопироватьШиринуСтолбцовДиапазона(ЛистПриемник, Координаты, Диапазон)
Диапазон.Copy(); //записали в буфер
ЛистПриемник.Range(ЛистПриемник.Cells(Координаты.НачальнаяСтрока, Координаты.НачальнаяКолонка),
ЛистПриемник.Cells(Координаты.НачальнаяСтрока+Координаты.КонечнаяСтрока-1,
// цифра 8 означает сохранить ширину столбцов как в источнике.
Координаты.НачальнаяКолонка+Координаты.КонечнаяКолонка-1)).PasteSpecial(8);
КонецПроцедуры
3. Осталось дело за малым - скопировать лист.
Для этого мы обязательно должны:
- Активировать лист источник
Процедура АктивироватьЛист(Лист)
Лист.Activate();
КонецПроцедуры
- Выделить диапазон копирования
Процедура ВыделитьДиапазон(Лист, НачальнаяСтрока, КонечнаяСтрока)
ДиапазонСтрок = Лист.Rows("" + Строка(НачальнаяСтрока) + ":" + Строка(КонечнаяСтрока));
ДиапазонСтрок.Select();
КонецПроцедуры
- Копировать выделение в буфер
Процедура КопироватьВыделениеВБуфер(Эксель)
Эксель.Selection.Copy();
КонецПроцедуры
- Активировать лист приемник
- Выделить диапазон вставки
- И собственно вставить
Процедура ВставитьВыделенное(Эксель)
Эксель.Selection.Insert(-4121);
КонецПроцедуры
- не забудем выделение снять
Процедура СнятьВыделение(Эксель)
Эксель.Selection.Cells(1).Select();
КонецПроцедуры
Вся процедура выглядит так
Процедура СкопироватьЛистЭксельВКонец(Эксель, ЛистИсточник, ЛистПриемник, КоличествоСтрокОтступа, ЛистФормата = Ложь)
//Получим координаты областей
КоординатыИсточника = КоординатыОбласти(ЛистИсточник);
КоординатыПриемника = КоординатыОбласти(ЛистПриемник);
//Для выделения диапазона строк сначала обязательно надо активировать лист в котором производится выделение
АктивироватьЛист(ЛистИсточник);
ВыделитьДиапазон(ЛистИсточник, КоординатыИсточника.НачальнаяСтрока, КоординатыИсточника.КонечнаяСтрока);
КопироватьВыделениеВБуфер(Эксель);
АктивироватьЛист(ЛистПриемник);
//При создании новой книги в ней присутствуют 3 пустых строки
//Что бы была только одна для первого копируемого листа установим начальную строку
Если ЛистФормата Тогда
НомерСтрокиНачалаВставки = 1;
Иначе
НомерСтрокиНачалаВставки = КоординатыПриемника.КонечнаяСтрока + КоличествоСтрокОтступа + 1;
КонецЕсли;
НомерСтрокиКонцаВставки = НомерСтрокиНачалаВставки + КоординатыИсточника.КонечнаяСтрока;
ВыделитьДиапазон(ЛистПриемник, НомерСтрокиНачалаВставки, НомерСтрокиКонцаВставки);
ВставитьВыделенное(Эксель);
СнятьВыделение(Эксель);
КонецПроцедуры
Вот собственно и все. Как говорится: "Ловкость рук и никакого мошейничества".
Прикладываю обработку слияния файлов, которую при необходимости вы легко сможете применять в любой своей конфигурации. Все что ей нужно - дать на вход массив путей ваших однотипных файлов эксель, а на выходе получить их квинтэссенцию. Либо просто заполнить табличную часть путями к файлам