|
|
#1 |
|
Участник
|
Не получается реализовать вставку картинки методами .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, но это не решение - так как затирает буфер пользователя. Может кто сталкивался с подобной задачей. |
|
|
|
|
#2 |
|
Участник
|
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
|
|
|
#3 |
|
Участник
|
|
|
|
|
|
#4 |
|
Участник
|
Пробовал, но к сожалению не смог этот тип достать
в объявлении типов в AX2009 Microsoft.Office. а дальше только Interop, объекта Core почему-то нет ((( Цитата:
Странно для меня гугль первой ссылкой предложил
максимум система дает добраться до X++: System.Reflection.Missing misValue X++: System.Object missing = System.Reflection.Missing; Последний раз редактировалось ex3em; 19.11.2015 в 16:43. |
|
|
|
|
#5 |
|
Участник
|
System.Reflection.Missing.Value - это статическое поле класса Missing. Чтобы получить его значение в AX 2009, придется сделать несколько лишних телодвижений: получить экземпляр Type для System.Reflection.Missing, с помощью GetField вытащить из него FieldInfo поля Value, и уже из экземпляра FieldInfo вытащить с помощью GetValue нужное значение.
|
|
|
|
|
#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. |
|
|
|
|
#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). | |
|
|
#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 |
|
|
|
|
#9 |
|
Молодой, подающий надежды
|
у меня Version = 14.0.0.0
|
|
|
|
|
#10 |
|
Участник
|
Ошибка скорее всего из-за, мягко говоря, кривой реализации работы с .NET в компиляторе AX 2009. Вместо конкретного .NET типа стоит использовать CLRObject. В этом случае, например, проверки на наличие того или иного метода .NET объекта будут выполнятся не на этапе компиляции, а на этапе выполнения. И ошибка про отсутствующий метод должна уйти (на самом деле здесь просто компилятор не может подобрать нужный метод .NET класса по указанным в коде типам фактических параметров).
|
|
|
|
| За это сообщение автора поблагодарили: ex3em (1), Logger (5). | |
|
|
#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 |
|
|
|