AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.11.2015, 14:55   #1  
ex3em is offline
ex3em
Участник
 
38 / 19 (1) ++
Регистрация: 22.07.2008
:( 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);
компилятор ругается на некорректный синтаксис. Дело похоже в 2-ом и 3-ем параметрах MsoTriState - что это за тип так и не нашел (

Единственное как получилось запихать картинку в эксельку - через буфер обмена PasteSpecial, но это не решение - так как затирает буфер пользователя.
Может кто сталкивался с подобной задачей.
Старый 19.11.2015, 15:55   #2  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 362 (14) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
Странно для меня гугль первой ссылкой предложил -

How to insert a picture in excel from C# App
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0
Старый 19.11.2015, 16:11   #3  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
305 / 873 (30) +++++++
Регистрация: 23.10.2012
Цитата:
Сообщение от ex3em Посмотреть сообщение
параметрах MsoTriState - что это за тип так и не нашел
Это Microsoft.Office.Core.MsoTriState
Старый 19.11.2015, 16:40   #4  
ex3em is offline
ex3em
Участник
 
38 / 19 (1) ++
Регистрация: 22.07.2008
Цитата:
Сообщение от Товарищ ♂uatr Посмотреть сообщение
Это Microsoft.Office.Core.MsoTriState
Пробовал, но к сожалению не смог этот тип достать
в объявлении типов в AX2009 Microsoft.Office. а дальше только Interop,
объекта Core почему-то нет (((

Цитата:
Странно для меня гугль первой ссылкой предложил
создать объект object misValue = System.Reflection.Missing.Value; тоже не могу
максимум система дает добраться до
X++:
System.Reflection.Missing   misValue
ни так
X++:
    System.Object               missing = System.Reflection.Missing;

Последний раз редактировалось ex3em; 19.11.2015 в 16:43.
Старый 19.11.2015, 17:07   #5  
makbeth is offline
makbeth
Участник
Аватар для makbeth
КОРУС Консалтинг
 
43 / 52 (2) ++++
Регистрация: 15.05.2007
Адрес: Санкт-Петербург
System.Reflection.Missing.Value - это статическое поле класса Missing. Чтобы получить его значение в AX 2009, придется сделать несколько лишних телодвижений: получить экземпляр Type для System.Reflection.Missing, с помощью GetField вытащить из него FieldInfo поля Value, и уже из экземпляра FieldInfo вытащить с помощью GetValue нужное значение.
Старый 19.11.2015, 17:31   #6  
ex3em is offline
ex3em
Участник
 
38 / 19 (1) ++
Регистрация: 22.07.2008
Цитата:
Сообщение от 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);
ошибка Exception::CLRError
Unknown name. (Exception from HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME))
установлен Офис 2013.

Последний раз редактировалось ex3em; 19.11.2015 в 18:37.
Старый 19.11.2015, 22:14   #7  
pedrozzz is offline
pedrozzz
Молодой, подающий надежды
Аватар для pedrozzz
MCBMSS
Лучший по профессии 2015
 
164 / 218 (8) ++++++
Регистрация: 18.02.2010
Адрес: Краснодар
код рабочий, 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  
ex3em is offline
ex3em
Участник
 
38 / 19 (1) ++
Регистрация: 22.07.2008
жаль не помогло (( 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);
компилятор ругается на AddPicture
Класс 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  
pedrozzz is offline
pedrozzz
Молодой, подающий надежды
Аватар для pedrozzz
MCBMSS
Лучший по профессии 2015
 
164 / 218 (8) ++++++
Регистрация: 18.02.2010
Адрес: Краснодар
Цитата:
Сообщение от ex3em Посмотреть сообщение
Может кривая библиотека?
Прописана такая
Microsoft.Office.Interop.Excel,
Version=15.0.0.0,
Culture=neutral,
PublicKeyToken=71e9bce111e9429c,
processorArchitecture=MSIL
у меня Version = 14.0.0.0
__________________
Кононов Пётр
Старый 20.11.2015, 12:10   #10  
makbeth is offline
makbeth
Участник
Аватар для makbeth
КОРУС Консалтинг
 
43 / 52 (2) ++++
Регистрация: 15.05.2007
Адрес: Санкт-Петербург
Ошибка скорее всего из-за, мягко говоря, кривой реализации работы с .NET в компиляторе AX 2009. Вместо конкретного .NET типа стоит использовать CLRObject. В этом случае, например, проверки на наличие того или иного метода .NET объекта будут выполнятся не на этапе компиляции, а на этапе выполнения. И ошибка про отсутствующий метод должна уйти (на самом деле здесь просто компилятор не может подобрать нужный метод .NET класса по указанным в коде типам фактических параметров).
За это сообщение автора поблагодарили: ex3em (1), Logger (5).
Старый 23.11.2015, 10:11   #11  
ex3em is offline
ex3em
Участник
 
38 / 19 (1) ++
Регистрация: 22.07.2008
Цитата:
Сообщение от 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

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Взаимодействие с Excel через .NET (семейство классов SysExcel) gl00mie DAX: Программирование 102 11.08.2022 17:09
Глюк(?) при импорте в Excel через .Net Loengrinchik DAX: Программирование 1 14.08.2015 10:55
atinkerersnotebook: Walkthrough & Tutorial Summary Blog bot DAX Blogs 1 09.09.2013 09:11
fed: Net requirements update in MRP Module and Working Set of MRP Blog bot DAX Blogs 14 08.05.2012 13:09
AX.NET: интеграция .NET-приложений с Аксаптой и (будущие) возможности облачных вычислений gl00mie DAX: Программирование 2 23.04.2010 00:47

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:54.