Изменение листа Excel из Matlab

можно ли открыть рабочий лист в excel из matlab и отредактировать формулы? Идея заключается в автоматизации анализа неопределенности путем создания второго листа с неопределенностью в каждой ячейке для значения из предыдущей ячейки. По сути, я хочу рассматривать ячейки как переменные и делать SQRT(SUM(Partials(xi)^2)) для каждой ячейки. Matlab не должен иметь проблем с calc, но может ли он редактировать формулы в листах?

в настоящее время процесс заключается в копировании и вставке из excel в matlab. Вот небольшая функция, которая делает неопределенность в matlab против массива уравнений:

function [f_u_total f_u] = uncertAnalysis(f, vars, vars_u)
    f_u = [];
    f_u_total = [];
    for(i=1:length(f))
        f(i)
        item = uncertAnalysisi(f(i), vars, vars_u);
        f_u = [f_u; item(1)];
        f_u_total = [f_u_total; item(1)];
    end
end


function [f_u_total f_u] = uncertAnalysisi(f, vars, vars_u)
    f_u = [];
    % take the partials and square them
    for i=1:length(vars)
        f_u = [f_u; vars(i) (diff(f, vars(i)).*vars_u(i)).^2];
    end
    % calculate the RSS
    f_u_total = (sum(f_u(:,2))).^.5;
end

кроме того, уравнения выглядят примерно так (почему я не делаю это вручную):

=(9*C!S3^2/C!V3^4*C!W3*(C!O3-
C!P3)/C!X3*C!Q3^6*C!F3^4/C!Y3^6/(C!U3^C!Z3)^6*F3^2+1/4*C!S3^2/C!V3^4*C!W3/(C!O3-
C!P3)/C!X3*C!Q3^6*C!F3^6/C!Y3^6/(C!U3^C!Z3)^6*O3^2+1/4*C!S3^2/C!V3^4*C!W3/(C!O3-
C!P3)/C!X3*C!Q3^6*C!F3^6/C!Y3^6/(C!U3^C!Z3)^6*P3^2+9*C!S3^2/C!V3^4*C!W3*(C!O3-
C!P3)/C!X3*C!Q3^4*C!F3^6/C!Y3^6/(C!U3^C!Z3)^6*Q3^2+1/C!V3^4*C!W3*(C!O3-
C!P3)/C!X3*C!Q3^6*C!F3^6/C!Y3^6/(C!U3^C!Z3)^6*S3^2+9*C!S3^2/C!V3^4*C!W3*(C!O3-
C!P3)/C!X3*C!Q3^6*C!F3^6/C!Y3^6/(C!U3^C!Z3)^6*C!Z3^2/C!U3^2*U3^2+4*C!S3^2/C!V3^6*C!W3*(C!O
3-C!P3)/C!X3*C!Q3^6*C!F3^6/C!Y3^6/(C!U3^C!Z3)^6*V3^2+1/4*C!S3^2/C!V3^4/C!W3*(C!O3-
C!P3)/C!X3*C!Q3^6*C!F3^6/C!Y3^6/(C!U3^C!Z3)^6*W3^2+1/4*C!S3^2/C!V3^4*C!W3*(C!O3-
C!P3)/C!X3^3*C!Q3^6*C!F3^6/C!Y3^6/(C!U3^C!Z3)^6*X3^2+9*C!S3^2/C!V3^4*C!W3*(C!O3-
C!P3)/C!X3*C!Q3^6*C!F3^6/C!Y3^8/(C!U3^C!Z3)^6*Y3^2+9*C!S3^2/C!V3^4*C!W3*(C!O3-
C!P3)/C!X3*C!Q3^6*C!F3^6/C!Y3^6/(C!U3^C!Z3)^6*LOG(C!U3)^2*Z3^2)^(1/2)

5 ответов


вы должны быть в состоянии сделать это через COM/ActiveX/Automation. Посмотри Внешние Интерфейсы document; есть пример того, как получить доступ к документам Excel через интерфейсы автоматизации Excel.

У меня нет опыта работы с Excel таким образом, но я знаю, что вы можете сделать почти все в Excel с помощью автоматизации и редактирования формул ячеек не так сложно.

edit: я не могу найти ссылку на объектную модель Excel, но вот еще один пример:http://support.microsoft.com/kb/301982


это не очень элегантное решение, но если вы сохраните новый .xls электронная таблица, которая является просто файлом с разделителями табуляции (или CSV), вы можете создать формулы Matlab, и когда Excel откроет документ, значения будут заполняться.

в Perl я справился с этим примерно так:

open(OUTPUT,'>tmpfile.xls');
print OUTPUT "1\t2\t=A1+B1\n";
close(OUTPUT);

и когда tmpfile.xls открывается в Excel, ячейки C1 будет отображаться как 3, который будет динамически обновляться, если A1 или B1 есть измененный.

(Я плохо разбираюсь в Matlab, поэтому у меня нет знаний о каких-либо плагинах)


EDIT: мое предыдущее предположение, что XLSWRITE не будет работать неправильно. Я просто попробовал следующее в MATLAB:

xlswrite('xltest.xls',{'1' '2' '=SUM(A1,B1)'});

и когда я открыл файл в excel, функция была на самом деле там! Ограничение на это будет заключаться в том, что вам придется использовать только функции, которые находятся в Excel.

к сожалению, я не верю XLSREAD можно прочитать формулы в MATLAB (кажется, просто получить результат).

ранее ПРЕДЛАГАЕМЫЕ ВАРИАНТЫ:

вы можете проверить электронная таблица ссылка EX программное обеспечение на веб-сайте MathWorks, хотя я немного не знаком с ним и не уверен, что даже это может сделать то, что вам нужно. Что-то еще, что вы должны посмотреть в Matlab Builder EX, который "позволяет интегрировать приложения MATLAB® в книги Excel® вашей организации в качестве макрофункций или надстроек". Звучит многообещающе...


используйте COM / ActiveX. Вы можете открыть экземпляр Excel с помощью следующей команды:

xlApp = COM.Excel.Application;

затем используйте комбинацию завершения кода и справки VBA в Excel для разработки остальных.

Не забудьте закрыть Excel с

xlApp.Quit;
delete(xlApp);

на боковой ноте могут помочь так называемые формулы CSE (Control-Shift-Enter)? См.Google.


в качестве альтернативы см. код ниже (xlswrite) для использования ActiveX из Matlab:

http://www.mathworks.com/matlabcentral/fileexchange/2855