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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.05.2009, 13:33   #1  
PPL is offline
PPL
Участник
 
14 / 12 (1) ++
Регистрация: 21.02.2008
pasteSpecial приминимо к рисунку в Excel
Подскажите, как в Аксапте изобразить вставку рисунка:

ActiveSheet.PasteSpecial Format:="Рисунок (PNG)", Link:=False, _
DisplayAsIcon:=False

PasteSpecial(0) - не подходит, прозрачность рисунка теряется

Если делать в самом Excele - через функции, вставка -рисунок - нормально - прозрачный фон

Последний раз редактировалось PPL; 18.05.2009 в 14:08.
Старый 18.05.2009, 14:23   #2  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
X++:
COMExcelDocument_RU excel = new COmExcelDocument_RU();
    COMVariant          format;
    COMVAriant          link;
    COMVariant          displayAsIcon;
    COM                 ws;
    ;

    format          = COMVariant::createFromStr("Рисунок (PNG)");
    link            = COMVariant::createFromBoolean(false);
    displayAsIcon   = COMVariant::createFromBoolean(false);


    excel.newFile("", true);

    ws =  excel.getWorkSheetPb(1); // надо создать новую функцию - копию getWorkSheet

    ws.PasteSpecial(format, link, displayAsIcon);
Старый 18.05.2009, 14:38   #3  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
А вроде и просто проглатывает без явных преобразований:
X++:
ws.PasteSpecial("Рисунок (PNG)"); 
// а два следующих false - и так по умолчанию, можно не указывать
Меня больше смущает вопрос, как обеспечить "международность" слова "Рисунок"? У меня вот в англ.версии Excel в скобках потребовалось слово "Bitmap"...
Старый 18.05.2009, 14:45   #4  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1234 (44) ++++++++
Регистрация: 11.04.2008
2 Eldar9x: А в этом случае рисунок вставляется прозрачный или нет? Как я понял - это основная проблема.
А просто вставить можно через:
Classes\Image\clipboardCopy()
Classes\Image\clipboardPaste()
Это решит проблему сомнительного места ("Рисунок (PNG)"), но не решает проблему прозрачности...
Старый 18.05.2009, 14:49   #5  
PPL is offline
PPL
Участник
 
14 / 12 (1) ++
Регистрация: 21.02.2008
image.loadFile("C:\\png.png");
image.clipboardCopy();
this.range("У_П").select();
activeSheetCom = WB.activeSheet().comObject();
activeSheetCom.PasteSpecial(format, link, displayAsIcon);

Метод "PasteSpecial" в COM-объекте класса "_Worksheet" возвратил код ошибки 0x800A03EC (<неизвестно>), который означает: Метод PasteSpecial из класса Worksheet завершен неверно.

Как на VBA симитировать вставка - рисунок ? Запись макроса не делается этой функции
Старый 18.05.2009, 15:13   #6  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
А, может, загрузку рисунка из файла на плечи Excel переложить? У меня записался примерно следующий код VBA:
Код:
 
Sub Macro2()
    Range("B2").Select
    ActiveSheet.Pictures.Insert "C:\0005.jpg"
End Sub
P.S. А поскольку семейство Pictures в объектной модели Excel является скрытым (как устаревшее), то примерно то же самое можно сделать через Shapes:
Код:
 
Sub Macro3()

    ActiveSheet.Shapes.AddPicture _
        "C:\0005.jpg", msoFalse, msoTrue, _
        Range("B2").Left, Range("B2").Top, 100, 100

End Sub

Последний раз редактировалось Gustav; 18.05.2009 в 16:02.
Старый 18.05.2009, 16:01   #7  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
2 Eldar9x: А в этом случае рисунок вставляется прозрачный или нет?
нет, не прозрачный
Старый 18.05.2009, 17:05   #8  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Прозрачность можно придать в самом Excel'е. Надо только знать RGB цвета, который делать прозрачным. Следующий VBA-код делает прозрачным белый цвет - RGB(255,255,255):
Код:
 
Sub Macro4()

    Dim myPicture As Shape
    
    Set myPicture = ActiveSheet.Shapes.AddPicture _
        ("C:\0005.jpg", msoFalse, msoTrue, _
        Range("B2").Left, Range("B2").Top, 100, 100)
    
    myPicture.PictureFormat.TransparentBackground = msoTrue
    myPicture.PictureFormat.TransparencyColor = RGB(255, 255, 255)

End Sub
Старый 18.05.2009, 18:13   #9  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
Метод "PasteSpecial" в COM-объекте класса "_Worksheet" возвратил код ошибки 0x800A03EC (<неизвестно>), который означает: Метод PasteSpecial из класса Worksheet завершен неверно.
скорее всего буфер пуст. Я делал так: открыл картинку в paint, скопировал рисунок., потом вызвал вышеуказанный код.
Цитата:
Прозрачность можно придать в самом Excel'е. Надо только знать RGB цвета, который делать прозрачным. Следующий VBA-код делает прозрачным белый цвет - RGB(255,255,255):
Можно еще так:
X++:
image.transparency(true, )
Старый 18.05.2009, 19:25   #10  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Ну, в общем, у меня манипуляциями в Excel прозрачность получилась. Взял свой пример отсюда Быстрый способ вывода данных в Excel с картинками и добавил фрагмент сегодняшнего дня. Через области белого цвета будет видна сетка таблицы.
X++:
static void Job98_Transparent(Args _args)
{
    ComExcelDocument_RU doc = new ComExcelDocument_RU();
    Image   image = new Image();

    COM     xlApp;
    COM     wbook;
    COM     activeSheet;
    COM     range;
    int     i, timeStart;

    COM     shape;
    COM     pf;
    ;

    timeStart = timenow();

    doc.NewFile('',false);
    wbook = doc.getComDocument();

    xlApp = wbook.Parent();
    activeSheet = xlApp.ActiveSheet();

    range = activeSheet.Range('B1');

    xlApp.ScreenUpdating(false);
    for (i=1;i<=400;i++)
    {
        image.captureScreen(0+(i-1)*2, 0+(i-1)*2, 300+(i-1)*2, 100+(i-1)*2);
        //image.transparent(true, 255, 255, 255);

        image.clipboardCopy();

        range.RowHeight(78);

        range.pasteSpecial(0);

// 18.05.2009 ПРОЗРАЧНОСТЬ -->
        shape = xlApp.Selection();
        shape = shape.ShapeRange();

        pf = shape.PictureFormat();
        pf.TransparentBackground(-1);
        pf.TransparencyColor(WinAPI::RGB2int(255,255,255));
// 18.05.2009 <--

        range = range.Offset(1,0);
    }
    xlApp.ScreenUpdating(true);

    doc.visible(true);

    box::info(strFmt('Всего секунд: %1', timenow()-timeStart));
}
Старый 19.05.2009, 07:05   #11  
PPL is offline
PPL
Участник
 
14 / 12 (1) ++
Регистрация: 21.02.2008
Custav по вашему примеру работает, но
делаю вместо image.captureScreen() - image.loadFile("C:\\png.png");
фон серый и непрозрачный, хотя в самом рисунке прозрачный, может - Image.loadFile() - такую фигню делает?

да,уж .. при сохранении файла в *.jpg - все работает...

Последний раз редактировалось PPL; 19.05.2009 в 07:18.
Старый 19.05.2009, 10:32   #12  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Мда, интересное поведение у этой прозрачности... Похоже, действительно что-то где-то глючит...

Заимствовал PNG-файл Ивана Кашперука из этого сообщения Поздравления (Репутация и Количество сообщений):
Название: Andre_2000.PNG
Просмотров: 1637

Размер: 6.5 Кб

Положил его в корень диска C. Как видно, цвет фона у него голубой (Excel во время записи макроса показал RGB 226, 240, 255 ). Однако, наш код, использующий белый цвет (RGB 255, 255, 255), правильно (почему??) установил прозрачность (у меня, во всяком случае, это так).
X++:
static void Job198_2(Args _args)
{
    ComExcelDocument_RU doc = new ComExcelDocument_RU();
    Image   image = new Image();

    COM     xlApp;
    COM     wbook;
    COM     activeSheet;
    COM     range;

    COM     shape;
    COM     pf;
    ;
    doc.NewFile('',false);
    wbook = doc.getComDocument();

    xlApp = wbook.Parent();
    activeSheet = xlApp.ActiveSheet();

    range = activeSheet.Range('B10');

    //image.captureScreen(0+(i-1)*2, 0+(i-1)*2, 300+(i-1)*2, 100+(i-1)*2);
    image.loadFile(@'C:\Andre_2000.PNG'); //

    image.clipboardCopy();

    range.pasteSpecial(0);

// 18.05.2009 ПРОЗРАЧНОСТЬ -->
    shape = xlApp.Selection();
    shape = shape.ShapeRange();
    pf = shape.PictureFormat();
    pf.TransparentBackground(-1);
    pf.TransparencyColor(WinAPI::RGB2int(255,255,255)); // белый
    //pf.TransparencyColor(WinAPI::RGB2int(226,240,255)); // голубой
// 18.05.2009 <--

    doc.visible(true);
}
А вот использование вышеупомянутого (законного!) голубого окончилось неудачей - фон не стал прозрачным. В то же время, как я уже говорил, можно всё переложить на плечи Excel и при чтении из файла:
X++:
static void Job198_2(Args _args)
{
    ComExcelDocument_RU doc = new ComExcelDocument_RU();
    Image   image = new Image();

    COM     xlApp;
    COM     wbook;
    COM     activeSheet;
    COM     range;

    COM     shape;
    COM     pf;
    ;
    doc.NewFile('',false);
    wbook = doc.getComDocument();

    xlApp = wbook.Parent();
    activeSheet = xlApp.ActiveSheet();

    shape = activeSheet.Pictures();
    shape = shape.Insert(@'C:\Andre_2000.PNG'); //
    shape = shape.ShapeRange();

    range = activeSheet.Range('B10');
    shape.Top(range.Top());
    shape.Left(range.Left());

    pf = shape.PictureFormat();
    pf.TransparentBackground(-1);
    pf.TransparencyColor(WinAPI::RGB2int(226,240,255)); // голубой

    shape.Select();

    doc.visible(true);
}
Теги
excel, рисунок

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент) Gustav DAX: База знаний и проекты 79 13.02.2014 13:18
[Excel] - Несколько версий Excel на машине клиента Андре DAX: Программирование 11 07.08.2007 13:45
Вызов Item() для коллекций Excel Владимир Максимов DAX: Программирование 15 17.08.2006 19:47

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 12:01.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.