Функция сохранения картинок из книги Excel в каталог с определением координат на листе

12.11.17

Интеграция - Загрузка и выгрузка в Excel

Разбор файла *.xlsx как Web-архива, выгрузка изображений без потери качества, с определением положения изображений.

Возникла необходимость написать парсер для чтения прайс-листов поставщиков, с чтением картинок. Среди публикаций нашел вот эту Сохранение картинки из MS Excel в файл без использования внешних компонент - в ней описано, как скопировать изображение во временный  лист Excel, на котором создается  диаграмма, в которую заливается  картинка с последующим экспортом диаграммы в файл. Работает отлично, за исключением того, что диаграмма сохраняется с двумя разрешениями - для  печати  и как на экране, а очень хотелось получить изображение с исходным  разрешением именно таким, в котором картинка  была  помещена в  книгу (для файла, в котором не было сжатия изображений). 

Способа работы через коллекцию Shapes я не нашел, зато есть способ сохранить файл как Web-архив, открыть его архиватором и получить нужные изображения в виде набора файлов с именами "Image1", "Image2" и так далее. Правда не совсем ясно, какое изображение в какой ячейке находится и в каком конкретно порядке они выгружены.

Нужные данные для случая, когда книга состоит из одного листа содержатся в файлах "drawing1.xml" и "drawing1.xml.rels" внутри web-архива. Картинки лежат в папке "xl/media/" архива.

Приведенная ниже функция сохраняет все данные в каталог временных файлов 1с, но можно указать любое другое нужное место.

 

Функция ВыгрузитьКартинки(Путь) Экспорт // Путь к исходному файлу Excel
        
    АрхивныеДанные = Новый ТаблицаЗначений;
    АрхивныеДанные.Колонки.Добавить("ИД"); // rId - внутренний идентификатор
    АрхивныеДанные.Колонки.Добавить("НомерСтроки",Новый ОписаниеТипов("Число"));
    АрхивныеДанные.Колонки.Добавить("НомерКолонки",Новый ОписаниеТипов("Число"));
    АрхивныеДанные.Колонки.Добавить("ИмяФайла");
    АрхивныеДанные.Колонки.Добавить("КороткоеИмяФайла"); //  Image1 ...
        
    ИмяФайлаПутей = "";
    ИмяФайлаКоординат = "";
    
    Читалка = Новый ЧтениеZipФайла(Путь);
    ВотВамКаталог = ПолучитьИмяВременногоФайла();
    Для Каждого Эл Из Читалка.Элементы Цикл
        Если Эл.Путь = "xl/media/" Тогда  //  это  папка  с  картинками -  элемент  - картинка
            Читалка.Извлечь(Эл,ВотВамКаталог,РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
            НС = АрхивныеДанные.Добавить();
            НС.КороткоеИмяФайла = Эл.Имя;
            НС.ИмяФайла = ВотВамКаталог + "\" + Эл.Имя;
        ИначеЕсли Эл.ПолноеИмя = "xl/drawings/drawing1.xml" Тогда  
            Читалка.Извлечь(Эл,ВотВамКаталог,РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
            ИмяФайлаКоординат = ВотВамКаталог + "\" + Эл.Имя;
        ИначеЕсли Эл.ПолноеИмя = "xl/drawings/_rels/drawing1.xml.rels" Тогда
            Читалка.Извлечь(Эл,ВотВамКаталог,РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
            ИмяФайлаПутей = ВотВамКаталог + "\" + Эл.Имя;
        КонецЕсли;    
    КонецЦикла;          
    
    //ИмяФайлаПутей
    ЧтениеФайлаXML = Новый ЧтениеXML;
    ЧтениеФайлаXML.ОткрытьФайл(ИмяФайлаПутей);
    Пока ЧтениеФайлаXML.Прочитать() Цикл
        
        Если ЧтениеФайлаXML.Имя = "Relationship" Тогда
            ИД = "";
            КороткоеИмя = "";
            Пока ЧтениеФайлаXML.СледующийАтрибут()  Цикл
                Если ЧтениеФайлаXML.Имя = "Id" Тогда
                    Ид = ЧтениеФайлаXML.Значение;
                ИначеЕсли ЧтениеФайлаXML.Имя = "Target"    Тогда
                    КороткоеИмя = ЧтениеФайлаXML.Значение;            // ../media/image3.jpeg    
                    ПозНачала = Найти(КороткоеИмя,"/image");
                    Если ПозНачала > 0 Тогда
                        КороткоеИмя = Сред(КороткоеИмя,ПозНачала + 1,СтрДлина(КороткоеИмя) - ПозНачала);
                    КонецЕсли;
                КонецЕсли;    
            КонецЦикла;    
            Если ЗначениеЗаполнено(КороткоеИмя) И ЗначениеЗаполнено(ИД) Тогда
                СтрокаДанных = АрхивныеДанные.Найти(КороткоеИмя,"КороткоеИмяФайла");
                Если СтрокаДанных <> Неопределено Тогда
                    СтрокаДанных.ИД = ИД;
                КонецЕсли;    
            КонецЕсли;    
        КонецЕсли;    
                    
    КонецЦикла;
    
    //ИмяФайлаКоординат
    ЗаголовокНачалоУзла = "xdr:twoCellAnchor";
    ЗаголовокНачалоУзла1 = "xdr:oneCellAnchor";
    ЗаголовокНачалоКоординат = "xdr:from";
    ЗаголовокНачалаКоординатКолонка = "xdr:col";
    ЗаголовокНачалаКоординатСтрока = "xdr:row";
    ЗаголовокНачалаИдентификатора  = "a:blip";
    ИмяАтрибутаИдентификатора  = "r:embed";
    //Заголовок
    
    ЧтениеФайлаXML = Новый ЧтениеXML;
    ЧтениеФайлаXML.ОткрытьФайл(ИмяФайлаКоординат);
    
    ПутьЧтения = "";
    
    Пока ЧтениеФайлаXML.Прочитать() Цикл
        
        Если ЧтениеФайлаXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И (ЧтениеФайлаXML.Имя = ЗаголовокНачалоУзла Или ЧтениеФайлаXML.Имя = ЗаголовокНачалоУзла1) Тогда
            ПутьЧтения = "Узел";
            Данные = Новый Структура("Столбец,Строчка,Ид");
        ИначеЕсли ЧтениеФайлаXML.ТипУзла = ТипУзлаXML.КонецЭлемента И (ЧтениеФайлаXML.Имя = ЗаголовокНачалоУзла Или ЧтениеФайлаXML.Имя = ЗаголовокНачалоУзла1) Тогда
            СтрокиДанных = АрхивныеДанные.НайтиСтроки(Новый Структура("Ид",Данные.Ид));
            
            СтрокаДляЗаполнения = Неопределено;
            Для Каждого Стр Из СтрокиДанных Цикл
                Если Не ЗначениеЗаполнено(Стр.НомерСтроки) Тогда
                    СтрокаДляЗаполнения = Стр;
                    Прервать;
                КонецЕсли;    
            КонецЦикла;    
            
            Если СтрокаДляЗаполнения = Неопределено Тогда
                СтрокаДляЗаполнения = АрхивныеДанные.Добавить();
                ЗаполнитьЗначенияСвойств(СтрокаДляЗаполнения,СтрокиДанных[0],,"НомерСтроки,НомерКолонки");
            КонецЕсли;    
                
            СтрокаДляЗаполнения.НомерСтроки = Данные.Строчка;
            СтрокаДляЗаполнения.НомерКолонки = Данные.Столбец;
            ПутьЧтения = "";
        КонецЕсли;    
        
        Если ЧтениеФайлаXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеФайлаXML.Имя = ЗаголовокНачалоКоординат И Найти(ПутьЧтения,"Узел") > 0 Тогда
            ПутьЧтения = ПутьЧтения + "Координаты";
        ИначеЕсли ЧтениеФайлаXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеФайлаXML.Имя = ЗаголовокНачалоКоординат Тогда
            ПутьЧтения = СтрЗаменить(ПутьЧтения,"Координаты","");    
        КонецЕсли;    
        
        Если ЧтениеФайлаXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеФайлаXML.Имя = ЗаголовокНачалаКоординатСтрока И Найти(ПутьЧтения,"Координаты") > 0 Тогда
            ЧтениеФайлаXML.Прочитать();
            Данные.Вставить("Строчка",Число(ЧтениеФайлаXML.Значение));
        КонецЕсли;    
        
        Если ЧтениеФайлаXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеФайлаXML.Имя = ЗаголовокНачалаКоординатКолонка И Найти(ПутьЧтения,"Координаты") > 0 Тогда
            ЧтениеФайлаXML.Прочитать();
            Данные.Вставить("Столбец",Число(ЧтениеФайлаXML.Значение));
        КонецЕсли;    
            
        Если ЧтениеФайлаXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеФайлаXML.Имя = ЗаголовокНачалаИдентификатора И Найти(ПутьЧтения,"Узел") > 0 Тогда
            Данные.Вставить("Ид",ЧтениеФайлаXML.ПолучитьАтрибут(ИмяАтрибутаИдентификатора));        
        КонецЕсли;    
        
    КонецЦикла;
    
    Возврат АрхивныеДанные;
    
КонецФункции   

 

См. также

SALE! 20%

Загрузка и выгрузка в Excel Оптовая торговля Печатные формы Бухгалтер Пользователь Платформа 1С v8.3 Управляемые формы Платформа 1C v8.2 Конфигурации 1cv8 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная обработка для загрузки документов из Excel в 1С одним нажатием. Не требует указания параметров (номера колонок, номер первой строки таблицы и т.д.) и предварительной настройки. Просто выбираете файл Excel, документ 1С и нажимаете кнопку "Загрузить". Обработка сама находит таблицу в файле Excel, необходимые для загрузки данные в ней (номенклатура, количество, НДС, цена, сумма) и загружает ее в 1С. Вместе с номенклатурой может найти контрагента, номер и дату документа, штрих-коды, серии ГТД, страну и т.д. Распознает документы ЛЮБОЙ ФОРМЫ (УПД, ТОРГ-12, заказ, отчет комиссионера и т.д.). Не требует MS Office. Для поиска таблиц используются методы эвристического поиска. Загружает только то, что нужно, т.е. пропускает повторы шапки таблицы, заголовки, промежуточные итоги, подписи и т.д. Содержит модуль работы с электронной почтой и api-загрузчик отчетов о продажах маркетплейсов.

5000 4000 руб.

09.11.2016    222649    957    891    

965

Загрузка и выгрузка в Excel Маркетплейсы Программист Бухгалтер Пользователь Платформа 1С v8.3 Бухгалтерский учет 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Управленческий учет Платные (руб)

Реальный помощник, с помощью которого Вы сделаете необходимые документы для Wildberries, OZON, ЯндексМаркет, Мегамаркет, Aliexpress, "Детский мир", МагнитЭкспресс (бывш.Казань-Экспресс), "Леруа Мерлен", ЭНФАНТА (Акушерство), ЛаМода, Летуаль, "Твой дом" в документы "Отчет комиссионера (агента) о продажах" и другие, может работать в "Бухгалтерия 3", "Бухгалтерия 3 КОРП", УТ 11, УНФ, КА 2, ERP. Возможность подключить любые маркетплейсы. Анализ продаж ОЗОН. 30 дней БЕСПЛАТНОГО пользования!

1800 руб.

12.08.2021    33720    297    65    

142

Маркетплейсы Загрузка и выгрузка в Excel Программист Пользователь Платформа 1С v8.3 1С:Управление торговлей 10 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 Управленческий учет Платные (руб)

Загрузка данных отчета о реализации товаров из сервиса Яндекс.Маркета «Беру» в 1С из Отчетов Excel для конфигурации: Бухгалтерия предприятия, редакция 3.0; Управление торговлей, редакция 11; Управление торговлей, редакция 10.3 и Управление нашей фирмой, редакция 3.0 в документ «Отчет комиссионера о продажах».

4800 руб.

09.12.2020    23933    230    1    

95

Загрузка и выгрузка в Excel Маркетплейсы Программист Бухгалтер Пользователь Платформа 1С v8.3 1С:Управление торговлей 10 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Загрузка данных отчета о реализации товаров из сервиса СберМегаМаркет для конфигурации: Бухгалтерия предприятия, редакция 3.0; Управление торговлей, редакция 11; Управление торговлей, редакция 10.3 и Управление нашей фирмой, редакция 3.0 в документ "Отчет комиссионера (агента) о продажах".

4800 руб.

07.06.2022    16276    97    0    

77

Загрузка и выгрузка в Excel Логистика, склад и ТМЦ Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Бухгалтер Пользователь Платформа 1С v8.3 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

Эволюция не стоит на месте - новая удобная версия функциональной обработки для Вашего бизнеса! Что же Вы получаете? Удобный и интуитивно понятный интерфейс с 3-мя этапами работы. 2 режима - автоматический и ручной. Чтение XLSX, XLSM, CSV, XML/YML форматов без офиса, на любом сервере! Визуальное связывание колонок файла и реквизитов простым перетаскиванием колонок. Создание или обновление номенклатуры с иерархией, характеристик, доп. реквизитов, упаковок, загрузка практически неограниченного количества картинок на одну номенклатуру (с возможностью загрузки в несколько потоков одновременно), с хранением в томах или в базе. Загрузка номенклатуры поставщиков или поиск по их данным номенклатуры. Загрузка доп. реквизитов в характеристики. Загрузка штрихкодов с генерацией новых. Создание элементов справочников и ПВХ "на лету" для выбранных реквизитов. (Обновление от 10.07.2024, версия 9.8 - 9.11)

14400 руб.

20.11.2015    153477    373    376    

507

SALE! 30%

Загрузка и выгрузка в Excel Документооборот и делопроизводство (СЭД) Учет документов Распознавание документов и образов Бухгалтер Пользователь Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление холдингом 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная программа для распознавания ЛЮБЫХ СКАНОВ ИЛИ ФОТО ТОВАРНЫХ ДОКУМЕНТОВ в 1С. Не требует указания параметров и предварительной настройки. Просто выбираете файл (PDF, JPG, DOC, XLS, HTML и т.д.) выбираете документ 1С и нажимаете кнопку "Распознать и загрузить".

6000 5520 руб.

04.06.2019    103640    303    173    

318
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. user826326 6 14.11.17 10:00 Сейчас в теме
Спасибо, очень полезная статья.
2. Vladimir_D 121 29.11.22 12:00 Сейчас в теме
Приветствую.
Крайне полезная информация - мне пригодилась, но я не понял почему у меня имена путей с другим разделителем?
Я не гордый, я поправлю. Но вдруг у заказчика будет другой путь?
Вероятно надо сделать проверку на оба слеша. Жать конфа еще не в совместимости 22 и регулярные выражения нельзя использовать.
Прикрепленные файлы:
Оставьте свое сообщение