Имя: Пароль:
1C
 
Размер изображения в excel
0 unTonee
 
01.12.09
20:03
Доброго времени суток!
Подскажите как узнать настоящий размер изображения (не отмасштабированный) в Excel?
Свойства Height и Width, коллекции Pictures - возвращают отмасштабированные размеры.
1 Волшебник
 
модератор
01.12.09
21:08
С таким стажем стыдно спрашивать. Найди в гугле и запости сюда ответ.
2 пента
 
01.12.09
21:19
величина мистостажа = гуглокомпетентности :)
3 unTonee
 
02.12.09
08:50
Ладно, пристыдили...
Даже больше, напишу краткое описание по перегрузке данных из excel с изображениями. Думаю многим будет полезно.
4 unTonee
 
28.12.09
10:58
Как обещал, опишу процесс загрузки картинок из эксель в ИБ.
Постановку задачи: есть файл с данными о товарах и его изображений в формате excel. Каждая строка файла это отдельный товар, вся информация по одному товару находиться  в одной строке. Предполагается, что все товары находятся на одном листе.
Необходимо перегружать в базу товары из подобных файлов.

Излагать буду кратко:

•    Подключение к Excel и отключение:

   Попытка
       Excel    = Новый COMОбъект ("Excel.Application");
       WorkBook= Excel.Workbooks.Open(ПутьКФайлу, , True);
       Sheet    = WorkBook.Worksheets(1);//Предполагаем, что картинки на первом листе.    
   Исключение
       Сообщить("Произошла ошибка: " + ОписаниеОшибки(), СтатусСообщения.Важное);
   КонецПопытки;

Процедура ЗакрытьExcel()
   Попытка
       WorkBook.Close();
       Excel.Quit();
       Sheet        = Неопределено;
       WorkBook    = Неопределено;
       Excel        = Неопределено;
   Исключение
       Сообщить("Возникла ошибка:" + ОписаниеОшибки(), СтатусСообщения.Внимание);
       Сообщить("     Загрузка невозможна!");
   КонецПопытки;
КонецПроцедуры

•    Парсинг excel-файла – поиск картинок и вывод  товара с поиском соответствия в информаицонной базе:

   ТЗ = Новый ТаблицаЗначений;
   ТЗ.Колонки.Добавить("name");
   ТЗ.Колонки.Добавить("width");
   ТЗ.Колонки.Добавить("height");
   ТЗ.Колонки.Добавить("TopLeftCell");
   ТЗ.Колонки.Добавить("ID");
   //
   //Для Каждого Изображ Из Sheet.Shapes Цикл
   //    НовСтр = ТЗ.Добавить();
   //    НовСтр.name = Изображ.name;
   //    НовСтр.width = Изображ.width;
   //    НовСтр.height = Изображ.height;
   //КонецЦикла;
   
   
   Для Каждого Img Из Sheet.Pictures Цикл
       НовСтр = ТЗ.Добавить();
       НовСтр.name        = Img.name;
       НовСтр.width        = Img.width;
       НовСтр.height        = Img.height;
       НовСтр.ID            = Img.ShapeRange.ID;
       // выделение номера строки
       TopLeftCell        = Img.TopLeftCell.Address;
       Бакс                = Найти(TopLeftCell, "$");
       TopLeftCell            = Сред(TopLeftCell, Бакс+1, СтрДлина(TopLeftCell));
       Бакс                = Найти(TopLeftCell, "$");
       TopLeftCell            = Сред(TopLeftCell, Бакс+1, СтрДлина(TopLeftCell));
       НовСтр.TopLeftCell    = Число(TopLeftCell);
   КонецЦикла;    
   
   ДлиннаСтрок = ПоследняяСтрока(Sheet); // ПОследняя строка в excel файле
   
   ФормаПрогрессора = ПолучитьОбщуюФорму("ХодВыполненияОбработкиДанных");
   ФормаПрогрессора.Значение = 0;  
   ФормаПрогрессора.КомментарийЗначения = "";
   ФормаПрогрессора.КомментарийОбработкиДанных = "Анализ строк файла Excel";
   ФормаПрогрессора.МаксимальноеЗначение = ДлиннаСтрок;
   ФормаПрогрессора.НаименованиеОбработкиДанных = "Загрузка данных из " + ИмяФайла;
   
   ФормаПрогрессора.Открыть();
   
   Для нСтр=НаименованияСоСтроки По ДлиннаСтрок Цикл        
       ФормаПрогрессора.Значение = нСтр;
       ExcelНаименование = СокрЛП(Sheet.Cells(нСтр, СтолбецНаименований).Text);
       Если ExcelНаименование <> "" Тогда
           Стр = тпСопоставление.Добавить();
           Стр.НазваниеВЭксель = ExcelНаименование;
           Стр.НСExcel    = нСтр;
           НайденнаяСтрока = ТЗ.Найти(нСтр, "TopLeftCell");
           Если НайденнаяСтрока <> Неопределено Тогда
               Стр.Изображение = НайденнаяСтрока.name;
               С = Соответствие(ExcelНаименование);
               Если С <> Неопределено Тогда
                   Стр.Найдено    = Истина;
                   Стр.Номер        = С.Номер;
                   Стр.Товар        = С.Товар;
                   Стр.Загружать    = Истина;
               КонецЕсли;
           КонецЕсли;
       КонецЕсли;
       ФормаПрогрессора.КомментарийЗначения = "Обработка строки:" + нСтр + ", товар " + ExcelНаименование;
   КонецЦикла;    
   
   ФормаПрогрессора.Закрыть();
   
   тпСопоставление.Сортировать("Изображение УБЫВ, НСExcel ВОЗР");

Определение, где заканчивается excel-лист – его последняя строка.

Функция ПоследняяСтрока(Sheet)
   Стр = Sheet.UsedRange.Address;    
   ПозРазделителя = Найти(Стр, ":");
   Если ПозРазделителя > 0 Тогда      
       Стр = Сред(Стр, ПозРазделителя, СтрДлина(Стр));
       Стр = СтрЗаменить(Стр, "$", "");
       Стр = СтрЗаменить(Стр, "I", "");        
       Стр = СтрЗаменить(Стр, ":", "");        
       Возврат Число(Стр);    
   Иначе
       Возврат -1;
   КонецЕсли;
КонецФункции


Процедура выгрузка изображений и прописывание их в справочнике товаров:
Процедура КнопкаВыполнитьНажатие(Кнопка)
   Каталог=КаталогИБ()+"Фото";
   ПроверитьКаталог(Каталог);
   
   //Каталог = "C:\Temp\";
   
   ФормаПрогрессора = ПолучитьОбщуюФорму("ХодВыполненияОбработкиДанных");
   ФормаПрогрессора.Значение = 0;
   ФормаПрогрессора.КомментарийЗначения = "";
   ФормаПрогрессора.КомментарийОбработкиДанных = "Выгрузка изображений из Excel";
   ФормаПрогрессора.МаксимальноеЗначение = Sheet.Pictures.Count;
   ФормаПрогрессора.НаименованиеОбработкиДанных = "Выгрузка данных из " + ИмяФайла;
   
   ФормаПрогрессора.Открыть();    
       
   // Обход всей коллекции картинок Excel
   // и сохранение картинок у которых стоит флаг соответствие и загружать
   Для Каждого Img Из Sheet.Pictures Цикл
       ПоискСтрокаСопоставление = тпСопоставление.Найти(Img.Name, "Изображение");
       ФормаПрогрессора.Значение = Img.Index;
       ФормаПрогрессора.КомментарийЗначения = "Картинка " + Img.Name;
       Если ПоискСтрокаСопоставление <> Неопределено И ПоискСтрокаСопоставление.Загружать И ПоискСтрокаСопоставление.Найдено Тогда
           НомерОбъект = ПоискСтрокаСопоставление.Номер.ПолучитьОбъект();            

           НовИмя = Каталог+Формат(НомерОбъект.Код, "ЧГ=0")+".jpg";
           
           Найденное = ТЗ.Найти(Img.Name, "name");
                       
           //Если Найденное <> Неопределено Тогда
           //    Сообщить("Img.name:"+Img.name);
           //    Img.height = Найденное.height;
           //    Img.width  = Найденное.width;
           //КонецЕсли;
           
           str = Sheet.Name;
           Img.Select();
           pixH = Excel.Selection.Height;
           pixW = Excel.Selection.Width;
           Excel.Selection.Copy();
           Chart = Excel.Charts.Add();
           
           Excel.ActiveChart.Location(2,str);
           
           ExACName = Excel.ActiveChart.Name;
           ExACName = СокрЛП(СтрЗаменить(ExACName, str, ""));
           Excel.ActiveSheet.Shapes(ExACName).Height = pixH * 1.001;
           Excel.ActiveSheet.Shapes(ExACName).Width = pixW * 1.001;        
           Excel.ActiveChart.Paste();          
           Excel.ActiveChart.Export(НовИмя, "jpg");        
           Excel.ActiveSheet.Shapes(ExACName).Delete();
           
           НомерОбъект.Фото = НовИмя;            
           НомерОбъект.Записать();
       КонецЕсли;
       
       ОбработкаПрерыванияПользователя();                        
   КонецЦикла;
   
   ФормаПрогрессора.Закрыть();
   
   ЗакрытьExcel();
КонецПроцедуры


p.s. если кому интересно пишите вышлю обработку целиком на мыло.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.