每次循环后将信息写入Excel

时间:2011-10-03 14:42:11

标签: excel matlab file-io matrix

我有一个6x7矩阵(A)和我正在做的一些操作k = 1:50(循环次数)。 我知道为了在excel文件中编写单个矩阵,我需要:

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

如何在每个循环之后写入信息,以便每个循环从Excel中的位置A1 +((k-1)* 6 + 1)开始,并且我将所有Matrix(A)的结果列为一个在彼此之后。

谢谢!

2 个答案:

答案 0 :(得分:3)

使用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一次,并重复使用相同的会话来编写所有数据,然后在完成后关闭它。但是,您必须自己调用Office Interop函数。

由于我上面提到的技巧现在不起作用,我将使用 "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

答案 1 :(得分:0)

我认为xlswrite将覆盖现有文件,因此您最好收集所有数据,然后一次性写入。此外,一次性写入它将更快,因为它只涉及打开和关闭Excel一次。

但是,如果你真的想把它写成一个循环,那么下面应该有效(假设你的意思是下降):

range = sprintf('A%i:G%i', (k-1)*6+[1 6]);
xlswrite('Filename.xls', A, range);

请注意,如果A更改尺寸,则不会自动调整。