scrivere informazioni in Excel dopo each ciclo

Ho una matrix 6×7 (A) e qualche operazione che sto facendo su di esso per k = 1: 50 (numero di loops). So che per scrivere una singola matrix in un file Excel mi serve:

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

Come è ansible scrivere le informazioni dopo each ciclo, in modo che ciascun loop inizia in posizione A1 + ((k-1) * 6 + 1) in Excel e ho tutti i risultati di Matrix (A) elencati uno dopo l'altro .

Grazie!

Quando si utilizza la function XLSWRITE , è ansible evitare di calcolare intervalli di celle di Excel each volta, specificando sia il numero di fogli che l'intervallo, in cui l'intervallo fornisce solo la prima cella da avviare.

È particolarmente utile se la matrix cambia le size di each iterazione; prendiamo semplicemente l'ultima cella utilizzata e lo spostaamo per il numero di righe della matrix.

Esempio:

 offset = 1; for i=1:5 %# generate different size matrixs 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 

questo crea un file Excel con il seguente contenuto:

 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 

Si noti che una connessione viene eseguita in Excel, quindi chiusa each volta che XLSWRITE viene chiamato. Questo ha un significativo sovraccarico.

Un approccio migliore sarebbe quello di aprire Excel una volta e riutilizzare la stessa session per scrivere tutti i tuoi dati, quindi chiudere una volta che siamo finiti. Tuttavia, dovrai call le funzioni di Office Interop.

Poiché il trucco di cui sopra non funziona ora, userò la function "Calcola Excel Range" per calcolare gli intervalli di celle (ci sono molte altre implementazioni di FEX).

Ecco il codice (riutilizzo di un codice da una risposta precedente ):

 %# 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 matrixs 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(); 

Infatti, ho eseguito entrambe le versioni con 50 iterazioni e confrontato i tempi con TIC / TOC:

 Elapsed time is 68.965848 seconds. %# calling XLSWRITE Elapsed time is 2.221729 seconds. %# calling Excel COM directly 

Penso che xlswrite sovrascriverà un file esistente, quindi è meglio raccogliere tutti i dati, quindi scrivere in una sola volta. Inoltre, la scrittura in una sola volta sarà più veloce poiché comport l'apertura e la chiusura di Excel solo una volta.

Tuttavia, se vuoi veramente scrivere in un ciclo, dovresti funzionare (se si intende andare in giù):

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

Notare che questo non si aggira automaticamente se A cambia le size.