Разбивать по листам, в принципе, несложно. В загруженном ТабДоке присутствует несколько областей с названиями листов.
///////////////////////////////////
// Работа с Excel через ТабДок
// Функция - Прочитать excel
//
// Параметры:
// ФайлExcel - Файл, Строка - Объект Файл или полное имя файла.
// ФункцияОбработкиСтрок - Строка, Неопределено - Шаблон выражения для обработки строковых значений ячеек.
// В шаблоне производится подстановка - вместо символа ? будет подставляться обрабатываемое значение строки.
// Если передать Неопределено или пустую строку, то обработка производиться не будет.
// МаксШирина - Число - Максимальное кол-во колонок, просматриваемых при усечении таблицы по ширине.
// ОграничиватьСверху - Булево - Убирать пустые строки сверху
// ОграничиватьСлева - Булево - Убирать пустые строки слева
// ОграничиватьСнизу - Булево - Убирать пустые строки снизу
// ОграничиватьСправа - Булево - Убирать пустые строки справа
//
// Возвращаемое значение:
// СписокЗначений - Список значений содержимого. Элементы списка в поле Значение содержат ячейки листа (объект ОбластьЯчеекТабличногоДокумента), в поле Представление - имя листа
//
Функция ПрочитатьExcel(ФайлExcel, ФункцияОбработкиСтрок = "СокрЛП(?)",
ОграничиватьСверху = Истина, ОграничиватьСлева = Истина, ОграничиватьСнизу = Истина, ОграничиватьСправа = Истина) Экспорт
Ф = НовыйФайл(ФайлExcel);
ВесьТабДок = Новый ТабличныйДокумент();
ВесьТабДок.Прочитать(Ф.ПолноеИмя, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Результат = Новый СписокЗначений;
Области = ВесьТабДок.Области;
Если Области.Количество()=0 Тогда
ВызватьИсключение("В файле нет областей");
КонецЕсли;
Для Каждого Обл Из Области Цикл
ТекТабДок = Новый ТабличныйДокумент;
ОгрОбласть = ПолучитьОграниченнуюОбласть(ВесьТабДок, Обл);
// вставим область в табдок
ОгрОбласть.Имя = Обл.Имя;
ТекТабДок.ВставитьОбласть(ОгрОбласть,
ТекТабДок.Область(1, ОгрОбласть.Лево, ОгрОбласть.Низ - ОгрОбласть.Верх + 1, ОгрОбласть.Право)
);
СократитьСтроки(ТекТабДок, ФункцияОбработкиСтрок);
Результат.Добавить(ТекТабДок, Обл.Имя);
КонецЦикла;
// зачищаем исходный таб док. хз, может лишнее
ВесьТабДок.Очистить();
ВесьТабДок = Неопределено;
Возврат Результат;
КонецФункции
Процедура СократитьСтроки(ТабДок, ФункцияОбработкиСтрок = "СокрЛП(?)")
Если ПустаяСтрока(ФункцияОбработкиСтрок) Тогда
Возврат;
КонецЕсли;
Если Ложь Тогда ТабДок = Новый ТабличныйДокумент; КонецЕсли; // фейк
Для Стр = 1 По ТабДок.ВысотаТаблицы Цикл
Для Кол = 1 По ТабДок.ШиринаСтраницы Цикл
ТекОбласть = ТабДок.Область(Стр, Кол);
ТекстОбласти = ТекОбласть.Текст;
Если Не ТекОбласть.СодержитЗначение И Не ПустаяСтрока(ТекОбласть.Текст) Тогда
Выражение = СтрЗаменить(ФункцияОбработкиСтрок, "?", "ТекстОбласти");
ТекОбласть.Текст = Вычислить(Выражение);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Функция ПолучитьОграниченнуюОбласть(ТабДок, ОбластьЯчеек,
ОграничиватьСверху = Истина, ОграничиватьСлева = Истина, ОграничиватьСнизу = Истина, ОграничиватьСправа = Истина)
Если Не ОграничиватьСверху И Не ОграничиватьСлева И Не ОграничиватьСправа И Не ОграничиватьСнизу Тогда
Возврат ОбластьЯчеек;
КонецЕсли;
Если Ложь Тогда // фейк
ТабДок = Новый ТабличныйДокумент;
ОбластьЯчеек = ТабДок.Области[0];
КонецЕсли;
Лево = Неопределено; Право = Неопределено; Верх = Неопределено; Низ = Неопределено;
МаксШирина = ТабДок.ШиринаТаблицы;
Для Стр = ОбластьЯчеек.Верх По ОбластьЯчеек.Низ Цикл
Для Кол = 1 По МаксШирина Цикл
ТекОбласть = ТабДок.Область(Стр, Кол);
Если ЭтоЗначащаяОбласть(ТекОбласть) Тогда
Лево = ?(Лево=Неопределено, Кол, Мин(Лево, Кол));
Право = ?(Право=Неопределено, Кол, Макс(Право, Кол));
Верх = ?(Верх=Неопределено, Стр, Верх);
Низ = ?(Низ=Неопределено, Стр, Макс(Низ, Стр));
КонецЕсли;
КонецЦикла;
КонецЦикла;
Результат = ТабДок.Область(
?(ОграничиватьСверху, ?(Верх=Неопределено, ОбластьЯчеек.Верх, Верх), ОбластьЯчеек.Верх),
?(ОграничиватьСлева, ?(Лево=Неопределено, ОбластьЯчеек.Лево, Лево), ОбластьЯчеек.Лево),
?(ОграничиватьСнизу, ?(Низ=Неопределено, ОбластьЯчеек.Низ, Низ), ОбластьЯчеек.Низ),
?(ОграничиватьСправа, ?(Право=Неопределено, ОбластьЯчеек.Право, Право), ОбластьЯчеек.Право)
);
Возврат Результат;
КонецФункции
Функция ЭтоЗначащаяОбласть(ОбластьЯчеек)
Возврат Не ПустаяСтрока(ОбластьЯчеек.Текст)
Или ОбластьЯчеек.Гиперссылка
Или ОбластьЯчеек.СодержитЗначение
//Или ОбластьЯчеек.ГраницаСверху.ТипЛинии<>ТипЛинииЯчейкиТабличногоДокумента.НетЛинии
//Или ОбластьЯчеек.ГраницаСнизу.ТипЛинии<>ТипЛинииЯчейкиТабличногоДокумента.НетЛинии
Или ОбластьЯчеек.ГраницаСлева.ТипЛинии<>ТипЛинииЯчейкиТабличногоДокумента.НетЛинии
Или ОбластьЯчеек.ГраницаСправа.ТипЛинии<>ТипЛинииЯчейкиТабличногоДокумента.НетЛинии
;
КонецФункции
// Функция - Текст области листа
// Предполагаем, что имеем дело с ТабДоком, обрезанным по нужным размерам.
// Параметры:
// Лист - ЭлементСпискаЗначений, ТабличныйДокумент - Где искать текст.
// Верх - Число, Неопределено - Верхняя граница области
// Лево - Число, Неопределено - Левая граница области
// Низ - Число, Неопределено - Нижняя граница области
// Право - Число, Неопределено - Правая граница области
//
// Возвращаемое значение:
// Строка - Объединенный текст указанной области. Ячейки по горизонтали разделяются символом ТАБ, строки переносятся ВК
//
Функция ТекстОбластиЛиста(Лист, Знач Верх = Неопределено, Знач Лево = Неопределено, Знач Низ = Неопределено, Знач Право = Неопределено) Экспорт
ТипЗнчЛист = ТипЗнч(Лист);
Если ТипЗнчЛист=КэшФункции.ТипТабличныйДокумент() Тогда
ТабДок = Лист;
ИначеЕсли ТипЗнчЛист=КэшФункции.ТипЭлементСпискаЗначений() Тогда
ТабДок = Лист.Значение;
Иначе
ТабДок = Новый ТабличныйДокумент; // фейк
ВызватьИсключение("Неподдерживаемый тип параметра Лист " + ТипЗнчЛист);
КонецЕсли;
Область = ТабДок.Область(Верх, Лево, Низ, Право);
Результат = "";
ГорРазд = Символы.Таб;
ВертРазд = Символы.ВК;
ОблЛево = ?(Область.Лево=0, 1, Область.Лево);
ОблПраво = ?(Область.Право=0, ТабДок.ШиринаТаблицы, Мин(Область.Право, ТабДок.ШиринаТаблицы));
ОблВерх = ?(Область.Верх=0, 1, Область.Верх);
ОблНиз = ?(Область.Низ=0, ТабДок.ВысотаТаблицы, Мин(Область.Низ, ТабДок.ВысотаТаблицы));
Для Стр=ОблВерх По ОблНиз Цикл
Для Кол=ОблЛево По ОблПраво Цикл
ТекстЯчейки = ТабДок.Область(Стр, Кол).Текст;
ЭтоПустаяЯчейка = ПустаяСтрока(ТекстЯчейки);
Если ЭтоПустаяЯчейка Тогда
ТекстЯчейки = ГорРазд;
КонецЕсли;
Если Кол=ОблПраво И Стр=ОблНиз Тогда
Разделитель = "";
ИначеЕсли Кол=ОблПраво Тогда
Разделитель = ВертРазд;
Иначе
Разделитель = ?(ЭтоПустаяЯчейка, "", ГорРазд);
КонецЕсли;
Результат = Результат + ТекстЯчейки + Разделитель;
КонецЦикла;
КонецЦикла;
Возврат Результат;
КонецФункции
Показать