|
18.05.2009, 13:33 | #1 |
Участник
|
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 |
MCTS
|
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 |
Moderator
|
А вроде и просто проглатывает без явных преобразований:
X++: ws.PasteSpecial("Рисунок (PNG)"); // а два следующих false - и так по умолчанию, можно не указывать |
|
18.05.2009, 14:45 | #4 |
Боец
|
2 Eldar9x: А в этом случае рисунок вставляется прозрачный или нет? Как я понял - это основная проблема.
А просто вставить можно через: Classes\Image\clipboardCopy() Classes\Image\clipboardPaste() Это решит проблему сомнительного места ("Рисунок (PNG)"), но не решает проблему прозрачности... |
|
18.05.2009, 14:49 | #5 |
Участник
|
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 |
Moderator
|
А, может, загрузку рисунка из файла на плечи Excel переложить? У меня записался примерно следующий код VBA:
Код: Sub Macro2() Range("B2").Select ActiveSheet.Pictures.Insert "C:\0005.jpg" End Sub Код: 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 |
MCTS
|
Цитата:
2 Eldar9x: А в этом случае рисунок вставляется прозрачный или нет?
|
|
18.05.2009, 17:05 | #8 |
Moderator
|
Прозрачность можно придать в самом 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 |
MCTS
|
Цитата:
Метод "PasteSpecial" в COM-объекте класса "_Worksheet" возвратил код ошибки 0x800A03EC (<неизвестно>), который означает: Метод PasteSpecial из класса Worksheet завершен неверно.
Цитата:
Прозрачность можно придать в самом Excel'е. Надо только знать RGB цвета, который делать прозрачным. Следующий VBA-код делает прозрачным белый цвет - RGB(255,255,255):
X++: image.transparency(true, ) |
|
18.05.2009, 19:25 | #10 |
Moderator
|
Ну, в общем, у меня манипуляциями в 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 |
Участник
|
Custav по вашему примеру работает, но
делаю вместо image.captureScreen() - image.loadFile("C:\\png.png"); фон серый и непрозрачный, хотя в самом рисунке прозрачный, может - Image.loadFile() - такую фигню делает? да,уж .. при сохранении файла в *.jpg - все работает... Последний раз редактировалось PPL; 19.05.2009 в 07:18. |
|
19.05.2009, 10:32 | #12 |
Moderator
|
Мда, интересное поведение у этой прозрачности... Похоже, действительно что-то где-то глючит...
Заимствовал PNG-файл Ивана Кашперука из этого сообщения Поздравления (Репутация и Количество сообщений): Положил его в корень диска 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); } 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); } |
|