|  19.11.2015, 14:55 | #1 | 
| Участник |  Excel .NET вставка картинки 
			
			Не получается реализовать вставку картинки методами .Net  пробовал через Pictures (Microsoft.Office.Interop.Excel.Pictures) X++: pictures_net.Insert(string Filename, Object Converter); перерыл интернет, не нашел что это за объект такой. Пробовал вторым параметром пихать null, System.Object - метод сваливается с ошибкой: Unknown name. (Exception from HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME)) либо Пустое значение получить нельзя. Недопустимый тип аргумента. через Shapes (Microsoft.Office.Interop.Excel.Shapes) не получилось даже скомпилировать код X++:  shapes_net.AddPicture(String Filename, MsoTriState LinkToFile, MsoTriState SaveWithDocument, Single Left, Single Top, Single Width, Single Height);
shapes_net.AddPicture(_fileName, 0, 0, 1, 1, 100,100);Единственное как получилось запихать картинку в эксельку - через буфер обмена PasteSpecial, но это не решение - так как затирает буфер пользователя. Может кто сталкивался с подобной задачей. | 
|  | 
|  19.11.2015, 15:55 | #2 | 
| Участник | 
				__________________ AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 | 
|  | 
|  19.11.2015, 16:11 | #3 | 
| Участник | |
|  | 
|  19.11.2015, 16:40 | #4 | 
| Участник | 
			
			Пробовал, но к сожалению не смог этот тип достать в объявлении типов в AX2009 Microsoft.Office. а дальше только Interop, объекта Core почему-то нет ((( Цитата: 
		
			Странно для меня гугль первой ссылкой предложил
		
	 максимум система дает добраться до X++: System.Reflection.Missing misValue X++: System.Object missing = System.Reflection.Missing; Последний раз редактировалось ex3em; 19.11.2015 в 16:43. | 
|  | 
|  19.11.2015, 17:07 | #5 | 
| Участник | 
			
			System.Reflection.Missing.Value - это статическое поле класса Missing. Чтобы получить его значение в AX 2009, придется сделать несколько лишних телодвижений: получить экземпляр Type для System.Reflection.Missing, с помощью GetField вытащить из него FieldInfo поля Value, и уже из экземпляра FieldInfo вытащить с помощью GetValue нужное значение.
		 | 
|  | 
|  19.11.2015, 17:31 | #6 | 
| Участник | Цитата: 
		
			Сообщение от makbeth
			   System.Reflection.Missing.Value - это статическое поле класса Missing. Чтобы получить его значение в AX 2009, придется сделать несколько лишних телодвижений: получить экземпляр Type для System.Reflection.Missing, с помощью GetField вытащить из него FieldInfo поля Value, и уже из экземпляра FieldInfo вытащить с помощью GetValue нужное значение. X++:     System.Reflection.FieldInfo fieldInfo;
    System.Type                 type;
    CLRObject                   miss;
    ;
    new InteropPermission(InteropKind::ClrInterop).assert();
    type      = System.Type::GetType("System.Reflection.Missing");
    fieldInfo = type.GetField("Value");
    miss      = fieldInfo.GetValue( null );
    // BP deviation documented
    pictures_net.Insert(_fileName, miss);Unknown name. (Exception from HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME)) установлен Офис 2013. Последний раз редактировалось ex3em; 19.11.2015 в 18:37. | 
|  | 
|  19.11.2015, 22:14 | #7 | 
| Молодой, подающий надежды | 
			
			код рабочий, Ax2012, Office 2013   X++: public SysExcelShape_NET addPicture(str _file, real _width, real _height, boolean _rightSide = false boolean _center = false ) { Microsoft.Office.Interop.Excel.Worksheet curWorksheet; Microsoft.Office.Interop.Excel.Shapes shapes; Microsoft.Office.Interop.Excel.Shape shape; System.Object linkToFile; System.Object saveWithDocument; System.Single left; System.Single top; System.Single width; System.Single height; real leftReal; real widthRangeReal; Microsoft.Office.Interop.Excel.Borders borders; Microsoft.Office.Interop.Excel.Border borderTop; new InteropPermission(InteropKind::ClrInterop).assert(); linkToFile = 0; saveWithDocument = 1; left = range_net.get_Left(); top = range_net.get_Top(); width = _width; height = _height; if (_rightSide) { leftReal = left; widthRangeReal = range_net.get_Width(); left = leftReal + widthRangeReal - _width; } else if (_center) { leftReal = left; widthRangeReal = range_net.get_Width(); left = leftReal + (widthRangeReal / 2) - (_width / 2); } borders = range_net.get_Borders(); borderTop = borders.get_Item(Microsoft.Office.Interop.Excel.XlBordersIndex::xlEdgeTop); curWorksheet = range_net.get_Worksheet(); shapes = curWorksheet.get_Shapes(); shape = shapes.AddPicture(_file, linkToFile, saveWithDocument, left, top, width, height); if (borderTop.get_Weight()) { shape.IncrementTop(1); } return SysExcelShape_NET::construct(version, shape); } | 
|  | |
| За это сообщение автора поблагодарили: Logger (3), ex3em (1). | |
|  20.11.2015, 11:18 | #8 | 
| Участник | 
			
			жаль не помогло (( ax2009 немного упростил пример X++:     Microsoft.Office.Interop.Excel.Shapes       shapes;
    Microsoft.Office.Interop.Excel.Shape        shape;
    System.Object                               linkToFile;
    System.Object                               saveWithDocument;
    System.Single                               lef;
    System.Single                               top;
    System.Single                               width;
    System.Single                               height;
    str                                         _file;
    ;
    
    new InteropPermission(InteropKind::ClrInterop).assert();
    
    lef                 = 10.0;
    top                 = 10.0;
    width               = 100.0;
    height              = 100.0;
    
    linkToFile          = 0;
    saveWithDocument    = 1;
    
//    shapes = worksheet_net.get_Shapes();
    shape.Copy(); //просто поставил, чтобы убедиться что на сам объект компилятор не ругается
    shapes.SelectAll(); //просто поставил, чтобы убедиться что на сам объект компилятор не ругается
    shape  = shapes.AddPicture(_file,  //ругается тут ((
                               linkToFile,
                               saveWithDocument,
                               lef,
                               top,
                               width,
                               height);Класс Microsoft.Office.Interop.Excel.Shapes не содержит эту функцию. хотя в редакторе в списке ф-ций этот метод есть и описание и кол-во переменных совпадает. Может кривая библиотека? Прописана такая Microsoft.Office.Interop.Excel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c, processorArchitecture=MSIL | 
|  | 
|  20.11.2015, 11:37 | #9 | 
| Молодой, подающий надежды | 
			
			у меня Version = 14.0.0.0
		 | 
|  | 
|  20.11.2015, 12:10 | #10 | 
| Участник | 
			
			Ошибка скорее всего из-за, мягко говоря, кривой реализации работы с .NET в компиляторе AX 2009. Вместо конкретного .NET типа стоит использовать CLRObject. В этом случае, например, проверки на наличие того или иного метода .NET объекта будут выполнятся не на этапе компиляции, а на этапе выполнения. И ошибка про отсутствующий метод должна уйти (на самом деле здесь просто компилятор не может подобрать нужный метод .NET класса по указанным в коде типам фактических параметров).
		 | 
|  | |
| За это сообщение автора поблагодарили: ex3em (1), Logger (5). | |
|  23.11.2015, 10:11 | #11 | 
| Участник | Цитата: 
		
			Сообщение от makbeth
			   Ошибка скорее всего из-за, мягко говоря, кривой реализации работы с .NET в компиляторе AX 2009. Вместо конкретного .NET типа стоит использовать CLRObject. В этом случае, например, проверки на наличие того или иного метода .NET объекта будут выполнятся не на этапе компиляции, а на этапе выполнения. И ошибка про отсутствующий метод должна уйти (на самом деле здесь просто компилятор не может подобрать нужный метод .NET класса по указанным в коде типам фактических параметров). Смог заставить работать это дело через CLRObject в самописном классе SysExcelShapes_NET (делал по аналогии с классами SysExcel *** _NET) сделал метод addPicture Код:     CLRObject                   ms2;
    ;
    ms2 = shapes_net;
    ms2.AddPicture(_fileName, 0, 1, 10.0, 10.0, 100.0, 100.0); | 
|  | 
| Теги | 
| clrobject | 
|  | 
| 
 |