如何使用xlswrite为从MATLAB写入Excel的矩阵指定名称?
这相当于打开xls表,选择数据并右键单击 - >定义名称。在这里,我可以为矩阵分配一个字符串。我怎样才能从MATLAB做到这一点?
我使用的另一个应用程序根据命名范围读取xls文件中的数据。
答案 0 :(得分:1)
据我所知,你不能从函数xlswrite
做到这一点。您必须在Matlab中使用excel COM服务器。
以下示例源自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');
编辑以在评论中回答您的问题:
如果要以编程方式定义范围地址,则必须将地址构建为字符串。 行索引很容易,但是matlab中的excel activeX不允许通过索引引用单元格/列/范围,所以有更多的东西可以使列的地址正确(如果你在{{1}上溢出范围。
下面的内容可以让你这样做:
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
,以确保地址转换可以处理(i)添加字符,以及(ii)从BD
溢出到Ax
。这看起来效果很好,但如果您的数据阵列不是那么宽,那么无论如何都不用担心它。