Использование MATLAB для записи значений String в электронную таблицу Excel по протоколу ActiveX .. обнаружена проблема - PullRequest
1 голос
/ 11 апреля 2019

Я использую MATLAB 2017a и в прошлом использовал xlswrite для выполнения этой операции.Проблема, с которой я столкнулся, была со скоростью выполнения, и я искал лучший путь.Итак, я решил использовать actxserver и записывать данные, используя get(obj) из MATLAB и Range.Value из ActiveX.Вот как выглядит код:

e = actxserver('Excel.Application);
eWorkbook = e.Workbooks.Add;
e.Visible = 1;
eSheets = e.ActiveWorkbook.Sheets;
eSheet1 = eSheets.get('Item',1);
eSheet1.Activate;
A = ["Str1";"Str2";"Str3";];
eActivesheetRange = get(e.Activesheet, 'Range', 'A1:A3');
eActivesheetRange.Value = A;

Этот безобидный бит кода не выполняется и не выдает предупреждение или сообщение об ошибке. Nothin '.На мой взгляд, eActivesheetRange оценивается как Range("A1:A3") на стороне ActiveX.Интересно, что если я заменю

A = ["Str1";"Str2";"Str3";];

на

A = char(["Str1";"Str2";"Str3";]);

, тогда программа записывает массив A char в каждую ячейку в диапазоне eActivesheetRange.

Есть лиспособ вызова cells() с использованием соединения MATLAB Range.Value?cells().Value сможет решить эту проблему?

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Я не думаю, что запись в Excel с использованием ActiveX способна правильно обрабатывать типы string. В этом случае вы можете заставить его работать, просто преобразовав ваш строковый массив в массив ячеек из символьных векторов , используя cellstr. Изменение последней строки кода на следующее работает для меня (в R2016b):

eActivesheetRange.Value = cellstr(A);

Замена последних двух строк на следующие также работает:

e.Activesheet.Range('A1:A3').Value = cellstr(A);
0 голосов
/ 17 апреля 2019

Решением этой проблемы является, конечно, петля for.

   alphacolumn=char(97:117);

% iterate through data array

for i=1:21
        str=string(alphacolumn(i))+2;
        str2=string(alphacolumn(i))+202;
        write1=char(str+":"+str2);
   if ~isreal(tsc{i,1})
        T = (tsc{i,1});
for j = 1:length(T)
        rrange = xl.ActiveWorkbook.Activesheet.Range(char(string(alphacolumn(i)) + string(j+1)));
            xlcompatiblestring1 = char(string(T(j,:,:)));
    rrange.Value= xlcompatiblestring1;

end
   else
        tsci=tsc{i,1};            
% write data to xl target file
        %xlswrite(xlfilepath,tsci,write1);
        xlActivesheetRange = get(xl.Activesheet,'Range',write1);
        xlActivesheetRange.Value = tsci;
   end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...