excel - 每次循环后将信息写入 Excel

标签 excel matlab file-io matrix

我有一个 6x7 矩阵(A),我正在对它进行一些操作,用于 k=1:50(循环数)。
我知道为了在 excel 文件中编写单个矩阵,我需要:

xlswrite('Filename.xls', A, 'A1')

如何在每个循环之后编写信息,这样每个循环都从 Excel 中的位置 A1+((k-1)*6+1) 开始,并且我将 Matrix(A) 的所有结果一个接一个地列出.

谢谢!

最佳答案

使用 XLSWRITE 时函数,您可以避免每次都计算 Excel 单元格范围,方法是同时指定工作表编号和范围,其中范围仅给出第一个单元格开始的位置。

如果矩阵每次迭代都改变大小,这将特别有用;我们只需使用最后一个单元格并将其移动矩阵的行数。

例子:

offset = 1;
for i=1:5
    %# generate different size matrices each loop
    A = ones(randi(4),randi(4)).*i;

    %# insert matrix in Excel inside the 1st sheet, starting at cell specifed
    xlswrite('filename.xls', A, 1, sprintf('A%d',offset));

    %# increment offset
    offset = offset + size(A,1);
end

这将创建一个包含以下内容的 Excel 文件:
1    1        
1    1        
1    1        
2    2    2    2
3    3
3    3
4            
4            
4            
4            
5    5    5    
5    5    5    
5    5    5    
5    5    5    

请注意,每次调用 XLSWRITE 时都会与 Excel 建立连接,然后关闭。这有很大的开销。

更好的方法是打开 Excel 一次,然后重复使用同一个 session 来写入所有数据,然后在完成后关闭它。但是,您必须自己调用 Office 互操作函数。

由于我上面提到的技巧现在不起作用,我将使用 "Calculate Excel Range"计算单元格范围的函数(FEX 有许多其他实现)。

这是代码(重用 previous answer 中的一些代码):
%# output file name
fName = fullfile(pwd, 'file.xls');

%# create Excel COM Server
Excel = actxserver('Excel.Application');
Excel.Visible = true;

%# delete existing file
if exist(fName, 'file'), delete(fName); end

%# create new XLS file
wb = Excel.Workbooks.Add();
wb.Sheets.Item(1).Activate();

%# iterations
offset = 0;
for i=1:50
    %# generate different size matrices each loop
    A = ones(randi(4),randi(4)).*i;

    %# calculate cell range to fit matrix (placed below previous one)
    cellRange = xlcalcrange('A1', offset,0, size(A,1),size(A,2));
    offset = offset + size(A,1);

    %# insert matrix in sheet
    Excel.Range(cellRange).Select();
    Excel.Selection.Value = num2cell(A);
end

%# save XLS file
wb.SaveAs(fName,1);
wb.Close(false);

%# close Excel
Excel.Quit();
Excel.delete();

事实上,我用 50 次迭代运行了这两个版本,并将时间与 TIC/TOC 进行了比较:
Elapsed time is 68.965848 seconds.      %# calling XLSWRITE
Elapsed time is 2.221729 seconds.       %# calling Excel COM directly

关于excel - 每次循环后将信息写入 Excel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7636567/

相关文章:

image - 莫迪斯图像处理

excel - 如果列包含给定数字 X 次,则突出显示单元格

matlab - 没有 varargin 的 inputParser

excel - 过滤精确匹配并从范围中提取标准

matlab - 如何在 MATLAB 代码中不使用 web() 的情况下发送 url 中的数据?

file - 文件系统写入缓冲区通常在几秒后被刷新?

java - 如何删除目录中上传的相同文件?

java - 如何从 USB 内存棒中删除文件?使用 File.delete() 不起作用

c# - 如何从 Excel 中解析 "cut n paste"

vba - 尝试从 VBA 字典中检索值,如果 key 未使用,则会引发错误?