将多个MATLAB图导出到Excel?

时间:2017-12-11 19:49:11

标签: excel matlab plot export

我有以下MATLAB代码:

for i=1:3
    a=rand(5,1);
    b=rand(5,1);
    plot(a,b);
    xlabel('X Values');
    ylabel('Y Values');

    xlswritefig(gcf, 'Results.xlsx', 'Sheet1', 'D2') 
    % from https://www.mathworks.com/matlabcentral/fileexchange/24424-xlswritefig

end

这只会在Excel文件中生成第3个图。但是,我想在一个Excel文件中并排生成所有3个图。我怎么能这样做?

编辑:

我修改了代码以使用actxserver代替xlswritefig。但是,当代码运行时,它会生成3个显示图表的excel弹出窗口。但是,文件results1.xlsx不包含任何图表。我甚至不想在代码中使用peaks,但如果我将其排除,则Excel弹出窗口中甚至不显示任何内容。这是新代码:

cellPos = {'D2', 'J2', 'P2'};

for i=1:3
    a=rand(5,1);
    b=rand(5,1);
    plot(a,b);
    xlabel('X Values');
    ylabel('Y Values');

    f1 = figure; peaks;

    % Connect to Excel, make it visible and add a worksheet
    xl = actxserver('Excel.Application'); set(xl,'Visible',1);
    xl.Workbooks.Add(1); xls = xl.ActiveSheet;

    % Paste in the MATLAB figures
    print(f1, '-dbitmap'); xls.Range(cellPos{i}).PasteSpecial;
    xls.Shapes.Item(1).PictureFormat.CropLeft  = 30;
    xls.Shapes.Item(1).PictureFormat.CropRight  = 30;
    xls.Shapes.Item(1).Height  = 100;
    xls.Shapes.Item(1).Left = xls.Range(cellPos{i}).Left;
    excel = actxserver('Excel.Application');  % Create server object
    excelWorkbook = excel.Workbooks.Add(1);   % Add a workbook
    excelWorkbook.SaveAs('results1.xlsx');  % Save workbook to a file
    excelWorkbook.Close();                 % Close workbook
    excel.Quit();                          % Quit server
    excel.delete();                        % Delete server object     


end

1 个答案:

答案 0 :(得分:0)

您将所有图片写入同一张图片和单元格'D2'。您需要在每次循环迭代时更改单元格,以便每个图形位于不同的位置而不是一个位于另一个的顶部。例如,这会在每三个单元格中水平放置一个数字:

cellPos = {'D2', 'G2', 'J2'};
for i = 1:3
  ...
  xlswritefig(gcf, 'Results.xlsx', 'Sheet1', cellPos{i});
end

您可能还想查看this other question的答案,详细说明如何从图形创建图像并将该图像插入Excel单元格,根据需要调整图像或单元格的大小。

编辑:

根据您的编辑(您现在使用上面提到的链接中的一些代码),您会遇到很多错误。您只需要在循环之前启动COM server一次,然后在循环之后将其关闭。您还需要在绘制数据之前创建图形窗口f1 。这是使用example code here重写(省略了单元格修改):

cellPos = {'D2', 'J2', 'P2'};             % Cells to place figures in
dpi = get(groot, 'ScreenPixelsPerInch');  % Get screen dpi
excel = actxserver('Excel.Application');  % Create server object
excelWorkbook = excel.Workbooks.Add(1);   % Add a workbook
excelSheet = excel.ActiveSheet;           % Get the active sheet
for i = 1:3
    a = rand(5, 1);
    b = rand(5, 1);
    f1 = figure;
    plot(a, b);
    xlabel('X Values');
    ylabel('Y Values');
    print(f1, sprintf('-r%d', dpi), ...  % Print the figure at the screen resolution
          '-clipboard', '-dbitmap');     %   to the clipboard as a bitmap
    excelSheet.Range(cellPos{i}).PasteSpecial();  % Paste from clipboard
    % Modifications to cell size, etc.
end
excelWorkbook.SaveAs('Results.xlsx');  % Save workbook to a file
excelWorkbook.Close();                 % Close workbook
excel.Quit();                          % Quit server
excel.delete();                        % Delete server object