将多个 MATLAB 图导出到 Excel?

Export multiple MATLAB plots to Excel?

我有以下 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 文件中生成第三个绘图。但是,我想在一个 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

您正在将所有图像写入相同的 sheet 和单元格 'D2'。您需要在每次循环迭代时更改单元格,以便每个图形都位于不同的位置,而不是一个在另一个之上。例如,这会在水平方向每隔三个单元格放置一个图形:

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

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

编辑:

根据您的编辑(您现在使用的是我上面给出的 link 中的一些代码),您有很多错误。您只需要启动 COM server once before your loop, and then close it after your loop. You also need to create your figure window f1 before you plot your data. Here's a rewrite using the (省略单元格修改):

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