我有以下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
答案 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