Вы не можете сделать это от функции xlswrite
насколько я знаю. Вы должны использовать COM-сервер excel из Matlab.
Пример ниже проиллюстрирован на примере Mathworks, но адаптирован к вашим потребностям. Обратите внимание, что вам не нужно будет использовать xlswrite
таким образом, вы вводите свои данные непосредственно в лист Excel.
%// First, open an Excel Server.
e = actxserver('Excel.Application');
%// Insert a new workbook.
eWorkbook = e.Workbooks.Add;
e.Visible = 1;
%// Make the first sheet active.
eSheets = e.ActiveWorkbook.Sheets;
eSheet1 = eSheets.get('Item', 1);
eSheet1.Activate;
%// Name the range you want:
e.Names.Add('TestRange' , '=Sheet1!$A$1:$B$2') ;
%// since you are here, directly put the MATLAB array into the range.
A = [1 2; 3 4];
eActivesheetRange = e.Activesheet.get('Range', 'TestRange');
eActivesheetRange.Value = A ;
%// Now, save the workbook.
eWorkbook.SaveAs('myfile.xls');
Редактировать, чтобы ответить на ваш вопрос в комментарии:
Если вы хотите, чтобы программно определить диапазон адресов, вы должны создать адрес в виде строки. Индекс строки достаточно прост, но excel activeX в Matlab не позволяет ссылаться на ячейки/столбцы/диапазоны по индексу, поэтому есть немного больше возможностей, чтобы получить адрес столбца вправо (в случае переполнения диапазонов AAA...
.
бит ниже должен позволить вам сделать это:
%// test data
A = rand(4,32);
%// input the upper left start of the range you want
sheetName = 'Sheet1' ;
startCol = 'Y' ;
startRow = 4 ;
%// calculate the end coordinates of the range
endRow = startRow + size(A,1)-1 ;
%// a bit more fiddling for the columns, as they could have many "characters"
cols = double(startCol)-64 ;
colIndex = sum(cols .* 26.^(length(cols)-1:-1:0)) ; %// index of starting column
endCol = eSheet1.Columns.Item(colIndex+size(A,2)-1).Address ;
endCol = endCol(2:strfind(endCol, ':')-1) ; %// column string reference
%// build range string in excel style
rngString = sprintf('=%s!$%s$%d:$%s$%d',sheetName,startCol,startRow,endCol,endRow) ;
myRange = eSheet1.Range(rngString) ; %// reference a range object
myRange.Value = A ; %// assign your values
%// Add the named range
e.Names.Add('TestRange' , myRange) ;
тест данные намеренно перелива из колонки Y
в колонке BD
, чтобы убедиться, что перевод адреса может обрабатывать (I), добавление символа, и (II), переполненный от Ax
до By
. Это, кажется, работает хорошо, но если ваши массивы данных не так уж и широк, тогда вам не нужно об этом беспокоиться.
Ваше приложение читается с того же листа или вы пишете от matlab до нескольких листов excel? – brodoll
Чтение и запись являются асинхронными, но параметр read ищет именованный диапазон данных. – Sumit