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 |
|
|