Hi! I have a nice formatted table in excel and would like to save this table (meaning a cell range) as jpg file using activeX with Matlab. Is that possible?
I do already have the following code
exl = actxserver('excel.application');
exlWkbk = exl.Workbooks;
exlFile = exlWkbk.Open('myFile.xlsx');
exlSheet1 = exlFile.Sheets.Item('Sheet1');
dat_range = 'A1:F19';
rngObj = exlSheet1.Range(dat_range);
Now I would nee something like rngObj.export('myExport.jpg') but I couldn't find anything....

 채택된 답변

Guillaume
Guillaume 2019년 7월 17일
편집: Guillaume 2019년 7월 18일

3 개 추천

With activex, you can do anything you can do with excel directly (as long as excel exposes it programmatically). So if you know how to do that in excel, we can find which function to call. If it can't be done in excel, then you can't do it with matlab (through activeX at least).
I don't know of any way to export bits of excel as images but it's not something I've ever looked at. Saying that, a quick search finds ExportAsFixedFormat. It can only export to pdf or xpf, the code would be:
rngObj.ExportAsFixedFormat('xlTypePDF', fullfile(somefolder, 'somename.pdf'));
edit: As suggested by Fangjun there's the Range.CopyPicture method. This puts a picture of the range on the clipboard, which is not easy to retrieve in matlab. In particular, matlab clipboard function is unable to retrieve it. However, since you're using activeX, you also have access to .Net, so:
rngObj.CopyPicture(1, 2); %copy range to clipboard as bitmap
%the first 1 could be 2. Not sure what the difference is between xlPrinter and xlScreen
%the 2 has to be 2 to get a bitmap and not a metafile
NET.addAssembly('System.Windows.Forms'); %to be done only once per matlab session.
assert(System.Windows.Forms.Clipboard.ContainsImage, 'Clipboard does not contain an image. Cannot proceed')
bitmap = System.Windows.Forms.Clipboard.GetImage;
bitmap.Save(fullfile(somefolder, 'somename.png')); %can also use bmp or jpg as extension
If somehow, you wanted to retrieve the image from the clipboard directly in matlab, then it's a fairly complicated process. Fortunately, I recently had to implement some code to import a .Net bitmap into matlab, so I know how to do that:
%this bit same as before
NET.addAssembly('System.Windows.Forms'); %to be done only once per matlab session.
assert(System.Windows.Forms.Clipboard.ContainsImage, 'Clipboard does not contain an image. Cannot proceed')
bitmap = System.Windows.Forms.Clipboard.GetImage;
%get content of .Net bitmap in matlab:
bitmapdata = bitmap.LockBits(System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb); %lock the bitmap so we can get the bits. For simplicity lock as 24bpprgb
buffer = NET.createArray('System.Byte', bitmapdata.Stride * bitmapdata.Height); %create array to copy the bits into. Assume that Stride is positive (should be when 24bpp)
System.Runtime.InteropServices.Marshal.Copy(bitmapdata.Scan0, buffer, 0, buffer.Length); %use interop to copy the bits
bitmap.UnlockBits(bitmapdata); %release the bitmap bits
%now shuffle the bits to match matlab ordering:
img = reshape(uint8(buffer), [], bitmap.Height);
img = reshape(img(1:bitmap.Width*3, :), 3, bitmap.Width, bitmap.Height);
img = permute(img, [3, 2, 1]);
img = img(:, :, [3, 2, 1]);
imshow(img);
%phew!

댓글 수: 2

Good to know this!
That works, thank you!

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Fangjun Jiang
Fangjun Jiang 2019년 7월 17일

0 개 추천

댓글 수: 1

Guillaume
Guillaume 2019년 7월 17일
Well spotted! The trouble is that this puts the image on the clipboard (as a metafile at that) and matlab is not really able to retrieve that (clipboard doesn't know how to read it)

댓글을 달려면 로그인하십시오.

카테고리

도움말 센터File Exchange에서 Environment and Settings에 대해 자세히 알아보기

제품

태그

질문:

2019년 7월 17일

댓글:

2019년 7월 18일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by