gifts2017

Загрузка номенклатуры с изображениями из многоуровневых файлов Excel

Опубликовал Джамал Абдусаламов (j3d) в раздел Обработки - Обработка справочников

Идея загрузки многоуровневых прайс-листов поставщиков вместе со вложенными картинками давно не нова.
Но до конца доведенного под толстый клиент обычного приложения я видел только один.
Это Мегапрайс Жени Шекина. Вещь отличная (судя по роликам в ютубе), но я для себя написал свою.

В сети много разговоров о том, как загружать данные из многоуровневого листа экселя.

Самое тяжелое определить родителя, ибо в экселе в группировке нет родителя как такового

Во всяком случае, програмно его не получить. Можно получить только уровень элемента, а при неоднородной иерархии, когда родители и подпаки скачут как попало, обычным перебором не определить родителя текущего элемента, т.к. он может быть на несколько строк выше.

Нет смысла писать о всех возможных вариациях группировки в экселе.

У Евгения в Мегапрайсе есть некая функция определения родительской папки.

Как я понимаю, она работает так.
Цититую автора с его же слов
http://www.forum.mista.ru/topic.php?id=566936

делаешь ТЗ для заполнения
Две колонки Группа, Уровень С\читываем файл
Пока Стр для Каждого ляляля Следующий
Если
Ляляля проблелов = 1 Тогда

ТЗ.Группа = Стр.Значение ТЗ. Уровень = 1
ИначеЕсли Пробелов ляляля = 2 Тогда
ТЗ.Группа = Стр.Значение ТЗ.Уровень = 2 и т.д.
КонецЦИкла.

ВерхняяГруппа = "";
Для Каждого Стр из ТЗ ЦИкл
Если
Стр.Уровень = 1 Тогда ляляля найтигруппа

Не нашли создали
ВерхняяГруппа = СОзданнаяИлиНайденнаяГруппа
Если Уровень = 2 Тогда
лояляля - ищем.создаем
НайденнаяГруппа.РОдитель = ВерхняяГруппа;
ВерхняяГруппа = Найденнаягруппа.Ссылка;

и т.д. и т.п.

Но я, видимо, вконец непонятливый: единственное, что понял - то, что уровни надо указывать явно, а это не есть хорошо, т.к. заранее количество уровней вложенности нам неизвестно.

Поэтому пришлось написать свой алгоритм чтения многоуровневой иерархии из экселя с определением родителей.

Далее  стоял вопрос, как считать из файла картинки, и тут, я, ни секунды не колеблясь, прибегнул к помощи Александра Шкураева
http://infostart.ru/public/73687/
http://shkuraev.ru/?p=476
Его алгоритм позиционирования в таблице по координатам Shape-в очень интересен.
Ну и dll-ка его, с помощью которой можно энти Shape-ы (картинки) сохранить на диске.


После считывания картинок их надо сохранить в хранилище и тут я снова, не колеблясь ))) прибег к коду от Поручик-а
http://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 в  http://infostart.ru/public/343876/

 

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
ЗагрузкаМногоуровневогоExcellСКартинками.rar
.rar 3,72Mb
17.05.14
93
.rar 3,72Mb 93 Скачать

См. также

Contragent+ 5.0 от 2 500
Подписаться Добавить вознаграждение

Комментарии

5. Алексей Андреев (Saldor) 19.05.16 16:32


А вот такое он добавит в базу, без программирования?

Если да, то готов купить.... Добавьте из прикрепленного файла товар и скиньте мне скрин с 1с что он в базе, желательно с открытой обработкой, чтобы было видно, что этот файл добавляется ..........
Прикрепленные файлы:
Тифлани+розница+(2).xls
7. Алексей Андреев (Saldor) 19.05.16 16:59
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа