2015-04-19 4 views
0

Как присвоить имя матрице, написанной из MATLAB в Excel, с помощью xlswrite?MATLAB данные имени xlswrite

Это эквивалентно открытию листа xls, выбирая данные и щелкните правой кнопкой мыши-> определить имя. Здесь я могу назначить строку матрице. Как я могу это сделать с MATLAB?

Другое приложение, которое я использую, считывает данные из файла xls на основе именованного диапазона.

+0

Ваше приложение читается с того же листа или вы пишете от matlab до нескольких листов excel? – brodoll

+0

Чтение и запись являются асинхронными, но параметр read ищет именованный диапазон данных. – Sumit

ответ

1

Вы не можете сделать это от функции 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. Это, кажется, работает хорошо, но если ваши массивы данных не так уж и широк, тогда вам не нужно об этом беспокоиться.

+0

Спасибо, есть ли способ вычислить аргумент '= Sheet1! $ A $ 1: $ B $ 2' автоматически на основе размера A? – Sumit

+0

@Sumit, да, это возможно, см. Редактирование в моем ответе. – Hoki

+0

Спасибо, отличная помощь! – Sumit

Смежные вопросы