В сети много разговоров о том, как загружать данные из многоуровневого листа экселя.
Самое тяжелое определить родителя, ибо в экселе в группировке нет родителя как такового
Во всяком случае, програмно его не получить. Можно получить только уровень элемента, а при неоднородной иерархии, когда родители и подпаки скачут как попало, обычным перебором не определить родителя текущего элемента, т.к. он может быть на несколько строк выше.
Нет смысла писать о всех возможных вариациях группировки в экселе.
У Евгения в Мегапрайсе есть некая функция определения родительской папки.
Как я понимаю, она работает так.
Цититую автора с его же слов
http://www.forum.mista.ru/topic.php?id=566936
делаешь ТЗ для заполнения
Две колонки Группа, Уровень С\читываем файл
Пока Стр для Каждого ляляля Следующий
Если Ляляля проблелов = 1 Тогда
ТЗ.Группа = Стр.Значение ТЗ. Уровень = 1
ИначеЕсли Пробелов ляляля = 2 Тогда
ТЗ.Группа = Стр.Значение ТЗ.Уровень = 2 и т.д.
КонецЦИкла.
ВерхняяГруппа = "";
Для Каждого Стр из ТЗ ЦИкл
Если Стр.Уровень = 1 Тогда ляляля найтигруппа
Не нашли создали
ВерхняяГруппа = СОзданнаяИлиНайденнаяГруппа
Если Уровень = 2 Тогда
лояляля - ищем.создаем
НайденнаяГруппа.РОдитель = ВерхняяГруппа;
ВерхняяГруппа = Найденнаягруппа.Ссылка;
и т.д. и т.п.
Но я, видимо, вконец непонятливый: единственное, что понял - то, что уровни надо указывать явно, а это не есть хорошо, т.к. заранее количество уровней вложенности нам неизвестно.
Поэтому пришлось написать свой алгоритм чтения многоуровневой иерархии из экселя с определением родителей.
Далее стоял вопрос, как считать из файла картинки, и тут, я, ни секунды не колеблясь, прибегнул к помощи Александра Шкураева
//infostart.ru/public/73687/
http://shkuraev.ru/?p=476
Его алгоритм позиционирования в таблице по координатам Shape-в очень интересен.
Ну и dll-ка его, с помощью которой можно энти Shape-ы (картинки) сохранить на диске.
После считывания картинок их надо сохранить в хранилище и тут я снова, не колеблясь ))) прибег к коду от Поручик-а
//infostart.ru/public/19932/
Хотя, положа руку на сердце, больше всего в разработке Поручика понравилось, как он dll-ку сохранил в виде двоичных данных в макете и при необходимости распаковывал в нужную папку.
Многое, конечно же, пришлось кодить самому и с нуля (особенно долго пришлось повозиться с определением родителя в экселевской группировке). Но, конечно же, если бы не "подсказки" вышеуказанных коллег, то работы было бы гораздо больше.
Поэтому, спасибо, друзья!
Итак, с гордостью представляю Вам моего франкенштейна, склепанного из моего кода с вкраплениями кода Саши Шкураева и Поручика.
Во вложенном архиве сама обработка, образец многоуровневого файла-прайса с картинками и внешняя компонента 1CGClipboard.dll (в сущности, она не нужна, т.к. лежит в обработке в макете).
Работа с обработкой очень проста.
1. Надо определиться, есть ли в нашем прайсе столбец с картинками и штрихкодами. В зависмости от этого надо проставить флажки "ИспользоватьШтрихКоды" и "ЗагружатьИзображения"
2. Далее надо указать номера столбцов и номер первой строки таблицы, с которой начинать считывать данные.
3. Потом надо выбрать каталог временного хранения изображений и группу номенклатуры, в которую будет подгружена новая
4. Выбираем файл таблицу. Если надо то можно выбрать лист таблицы (по умолчанию будет 1-й)
5. Нажимаем кнопку "Предварительный просмотр"
Ждем. Любуемся полученной таблицей "Товары" и ссылками на изображения во временном каталоге (их кстати, при необходимости, можно менять или добавлять прямо в таблице)
6. Нажимаем кнопку "Загрузить" и получаем всю номенклатуру с полным сохранением иерархии и изображениями
P.S. Само собой, все возможные виды группировок в экселе моя обработка не поддерживает, но я работал на самом рапространенном шаблоне. Работает на 8.1, но думаю, не стоит говорить, как в конфигураторе сконрвертить и в 8.2 / 8.3
Надеюсь моя работа поможет кому нибудь еще.
с уважением,
Джамал Абдусаламов
P.P.S 14.05.2015
Прошел год успешного пользования обработкой. Заметил небольшой косяк. Компонента 1CGClipboard.dll требует регистрации в системе что не всегда возможно, плюс она не работает на последних версиях мелкософтовского офиса.
поэтому порылся в сети и нашел способ сохранять средствами самого Excell-а.
Вкратце все выглядит так.
Картинки как и ранее мы находим методом Shape-ов
так же копируем их в clipboard методом Copy()
но затем не используем внешнюю компоненту а создаем внутри книги объект диаграмму затем Paste()-руем в нее наш рисунок и методом Export() выгружаем на диск
вот фрагменты кода
// СТАРЫЙ СПОСОБ СОХРАНЕНИЯ
//ИскомаяКартинка.Copy();
//Если ОчиститьОтНедопустимыхСимволов(СтрокаТЗ.Артикул) = "" Тогда
ИмяКартинки = КаталогКартинок + "\" + Новый УникальныйИдентификатор() + "_pic_" + СчетчикКартинок + ".jpg";
//Иначе
// ИмяКартинки = КаталогКартинок + "\" + ОчиститьОтНедопустимыхСимволов(СтрокаТЗ.Артикул) + "_pic_" + СчетчикКартинок + ".jpg";
//КонецЕсли;
//БуферОбмена.СохранитьИзБуфера(ИмяКартинки);
// ЛИБО ВОТ ЕЩЕ
//GraphicObject.ScaleHeight(1,1); // Истинный размер по высоте.
//GraphicObject.ScaleWidth(1,1); // Истинный размер по ширине.
//GraphicObject.Copy();
//Chart = EXCELApplication.ActiveSheet.ChartObjects().Add(0, 0, GraphicObject.Width, GraphicObject.Height).Chart();
//Chart.Paste();
//Chart.Export(ПолноеИмяФК);
//Chart = Неопределено;
// ИЛИ ЕЩЕ ИМ СЕЙЧАС ПОЛЬЗУЮСЬ НО ТРЕБУЕТ ДОПИЛА ПО ЧАСТИ ЗАКРЫТИЯ ДОКА БЕЗ СОХРАНЕНИЯ
//НЕ СТАЛ ЗАМОРАЧИВАТЬСЯ
//НУЖНО БЫЛО СРОЧНО ОДИН ПРАЙС ПОДРУЗИТЬ ПОТОМУ ПРОСТО ЗАГРУЗИЛ А ПОТОМ В ДИСПЕТЧЕРЕ ЗАДАЧ УДАЛИЛ
//ПРОЦЕСС EXCELL
//Ссылка на картинку
Картинка = ИскомаяКартинка;
// промежуточная книга для хранения диаграммы - контейнера картинки
Excel.Application.Workbooks.Add(1);
ИмяЛистаXLS = Excel.ActiveSheet.Name;
//Создание диаграммы, которая будет являться контейнером для картинки
//Расположение новой диаграммы - как объект на созданном ранее новом листе, являющемся в данный момент активным
//Размеры диаграммы слегка превышают размер картинки
ДиаграммаXLS = Excel.ActiveSheet.ChartObjects().Add(0, 0, Картинка.Width * 1.01, Картинка.Height * 1.01);
//Копирование картинки в буфер
Картинка.Copy();
//Заполняем диаграмму картинкой из буфера
ДиаграммаXLS.Chart.Paste();
//Сохраняем диаграмму во временном файле
ДиаграммаXLS.Chart.Export(ИмяКартинки);
ДиаграммаXLS = Неопределено;
В общем, дерзайте.
Эту обработку уже взял на вооружение StalkerAkella в //infostart.ru/public/343876/