copy graphic to Excel
Ältere Kommentare anzeigen
How can I take the code below to just copy the graphic on axes component (axes1) to clipboard. I then have code to paste it to excel. It currently copies all of my matlab screen.
axes(handles.axes1)
Z=peaks
surf(Z)
print -dmeta; %.................Copying to clipboard
Antworten (2)
Andy
am 13 Mai 2011
You could use Yair Altman's screencapture utility from the FEX: http://www.mathworks.com/matlabcentral/fileexchange/24323-screencapture-get-a-screen-capture-of-a-figure-frame-or-component
screencapture('handle',ax, 'filename', fn); % save the graph in file fn
exlSheet.Shapes.AddPicture(fn,0,1,...
20,... % distance from left of sheet
20,... % distance from top of sheet
600,... % width
400); % height
Note that you will need to have opened an actxserver connection to MATLAB. In the above, ax is the handle to your axes, fn is the file where your image is saved, and exlSheet is an Excel Sheet object.
EDIT: Here is some sample actxserve code. I have had a chance to test this and it works for me. Refer to http://www.mathworks.com/help/techdoc/ref/actxserver.html if needed.
x = 0:0.1:10;
y = sin(x);
f = figure;
ax = axes('parent',f);
plot(ax,x,y);
fn = fullfile(pwd,'myplot.bmp');
screencapture('handle',ax, 'filename', fn);
e = actxserver('Excel.application');
eW = e.Workbooks;
eF = eW.Add; % start a new file; use Open method for existing files
eS = eF.ActiveSheet;
e.Visible = 1; % Excel window won't show up by default
eS.Shapes.AddPicture(fn,0,1,...
20,... % distance from left of sheet
20,... % distance from top of sheet
400,... % width
300); % height
17 Kommentare
Jason
am 13 Mai 2011
Andy
am 13 Mai 2011
From your original post, it looks like your axes handle is stored in a handles structure. So you'll need to use:
screencapture('handle',handles.axes1,...);
Jason
am 13 Mai 2011
Andy
am 13 Mai 2011
It looks like you don't quite understand how actxserver works. I recommend reading <http://www.mathworks.com/help/techdoc/ref/actxserver.html> thoroughly. In the code I posted before, fn was the filename of the image, not of the Excel spreadsheet. (That is, it was the filename where you wanted to save the image. The exlSheet.AddPicture call was importing the image into Excel.) The exlSheet variable is an Excel Sheet object, not the Excel Application object that you have used. I'll edit my answer (I don't think I can use code markup in the comments) with some sample code.
Jason
am 13 Mai 2011
Jason
am 13 Mai 2011
Jason
am 13 Mai 2011
Andy
am 13 Mai 2011
Well,
1. This isn't so much code, it can be condensed, and it is much more powerful and flexible. You don't need to store the Workbooks object, the file eF, and the Sheet eS if you won't access them, so the code could be simplified to:
e = actxserver('Excel.application');
eS = e.Workbooks.Open('yourfile.xls').ActiveSheet.AddPicture(fn,0,1,...)
e.Visible=1;
Via actxserver, you also have complete programmatic control over Excel.
2. I'm not very familiar with the -dmeta option, but I would generally recommend against programmatically writing to the clipboard and then programmatically pulling from the clipboard as a method of copy/paste. What if this code runs, and then something else copies other data to the clipboard before your pasting code runs? That said, you could try (note: I have not tried this):
print(handles.axes1,'-dmeta');
Andy
am 13 Mai 2011
Alright, I just tried out the print command, and it only accepts figure handles (not axes handles). Your figure handle is probably handles.f (but if not, adjust the following):
print(handles.f, '-dmeta');
Jason
am 13 Mai 2011
Andy
am 13 Mai 2011
Did you create this GUI, either in GUIDE or programmatically?
Jason
am 13 Mai 2011
Andy
am 13 Mai 2011
Sorry for the delay. If you created the GUI with GUIDE and did not change the default handles, then handles.figure1 is the handle to the figure itself. You may not have been aware of it, but you do actually have access to all of the handles of the controls of your GUIDE GUI.
Jason
am 15 Mai 2011
Andy
am 16 Mai 2011
I'm not quite sure what you mean. Do you have multiple figures? If so, you can type at the command line:
figurelist = findall(0, 'type', 'figure');
If you mean you want to see all of the handles to controls in your GUI figure, then you only need to print the handles structure. (Alternatively, if you open your GUI in GUIDE, you can right click on a control, open the property inspector, and look at its Tag property.)
Jason
am 16 Mai 2011
Andy
am 16 Mai 2011
That's correct. It's a documented limitation of the print function that it cannot take as an argument, for example, just the axes handle. Yair Altman's screencapture utility that I linked to before CAN capture only the axes without copying the whole figure. I'm not at MATLAB right now, so I can't be certain, but I don't think there is a way for the screencapture utility to write to the system clipboard. That's why I suggested writing to a file and then importing the file into Excel. I really think this is the best solution, but when I'm next using MATLAB I can try to think of something that doesn't produce the intermediate file.
Laura Proctor
am 13 Mai 2011
hf = figure;
surf(peaks)
print('-dmeta',hf)
6 Kommentare
Jason
am 13 Mai 2011
Paulo Silva
am 13 Mai 2011
you do have a figure, this
hf=handles.figure1
Jason
am 13 Mai 2011
Matt Tearle
am 16 Mai 2011
The parent of axes1.
hf = get(handles.axes1,'parent');
will find it for you, if it's not called figure1.
Jason
am 17 Mai 2011
Andy
am 17 Mai 2011
Yes, that has been pointed out to you before. I have updated the code in my answer with tested code which works correctly and copies only the axes.
Kategorien
Mehr zu Creating, Deleting, and Querying Graphics Objects finden Sie in Hilfe-Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!