在MATLAB中插入一个图像到excel单元格

我正在关注这篇文章,而且我只需要做一些相同的事情,但是我只想把一个图像(由n乘3的matrix表示)放入excel的单元格中。

这行不会工作,因为我的图像im是一个matrix,而不是句柄:

 print(im, '-dbitmap'); 

我需要以某种方式创build图像的句柄? 还有更好的方法吗?

最终,我想改变单元格,以便它可以适合图像(不改变图像的大小)。

print语句将graphics窗口的内容打印到一个文件中,所以你必须先画出你的图像:

 image(im); % Plot image set(gca, 'Visible', 'off', ... % Turn off axes visibility 'Position', [0 0 1 1]); % and make axes fill figure window hFigure = gcf; % Get handle to figure pos = get(hFigure, 'Position'); % Get current figure position set(hFigure, 'Position', [pos(1:2) size(im, 2) size(im, 1)]); % Set position so image % is scaled properly 

然后,您可以创build一个COM服务器 ,并将数字打印到Excel文件中,如下所示:

 excel = actxserver('Excel.Application'); % Create server object excelWorkbook = excel.Workbooks.Add(1); % Add a workbook excelSheet = excel.ActiveSheet; % Get the active sheet dpi = get(groot, 'ScreenPixelsPerInch'); % Get screen dpi print(hFigure, sprintf('-r%d', dpi), ... % Print the figure at the screen resolution '-clipboard', '-dbitmap'); % to the clipboard as a bitmap excelSheet.Range('B2').PasteSpecial(); % Paste from clipboard (top left corner % of image will be in the cell 'B2') excelSheet.Range('B2').RowHeight = ... % Set cell height to image height excelSheet.Shapes.Item(1).Height; widthScale = excelSheet.Range('B2').ColumnWidth./... % Column width (in characters) excelSheet.Range('B2').Width; % Column width (in points) excelSheet.Range('B2').ColumnWidth = ... % Set cell width to scaled image width excelSheet.Shapes.Item(1).Width.*widthScale; excelWorkbook.SaveAs('figtest.xlsx'); % Save workbook to a file excelWorkbook.Close(); % Close workbook excel.Quit(); % Quit server excel.delete(); % Delete server object 

上述尝试缩放单元格以适合整个图像。 这适用于行高,但由于某种原因列宽已closures。 在确定正确的缩放比例方面似乎有很多困难,因为列的宽度是用字符来定义的,图像的宽度是用点/英寸来定义的。 我不确定是否有一个很好的解决方法。

作为一个例子,下面是样本MATLAB图像'peppers.png'

在这里输入图像说明

我从gnovice的回答中借用了一些代码。 这对我写这个答案真的有帮助。


下面是一个在单元格B2插入peppers.png的工作示例:

 im=imread('peppers.png'); imshow(im); dpi = get(groot, 'ScreenPixelsPerInch'); % Get screen dpi print(gcf, sprintf('-r%d', dpi), ... % Print the figure at the screen resolution '-clipboard', '-dbitmap'); % to the clipboard as a bitmap excel = actxserver('Excel.Application'); % Create server object excelWorkbook = excel.Workbooks.Add(1); % Add a workbook excelSheet = excel.ActiveSheet; % Get the active sheet excelSheet.Range('B2').PasteSpecial(); % Paste from clipboard (top left corner % of image will be in the cell 'B2') %%%%%%%%%%%%%%%% My contribution %%%%%%%%%%%%%%%% excelSheet.Shapes.Item(1).LockAspectRatio='msoFalse'; %Unlocking aspect ratio excelSheet.Shapes.Item(1).Width=excelSheet.Range('B2').Width; %Adjusting width excelSheet.Shapes.Item(1).Height=excelSheet.Range('B2').Height; %Adjusting height %Uncomment the next line if you want the cell to keep the image fit in its particular %cell even if the size of the cell is changed later % excelSheet.Shapes.Item(1).Placement='xlMoveandSize'; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% excelWorkbook.SaveAs('figtest.xlsx'); % Save workbook to a file excelWorkbook.Close(); % Close workbook excel.Quit(); % Quit server excel.delete(); % Delete server object 

输出:

产量