Изменить лист Excel из Matlab - PullRequest
       19

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

7 голосов
/ 23 февраля 2009

Можно ли открыть рабочий лист в 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 ]

5 голосов
/ 23 февраля 2009

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

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

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

2 голосов
/ 25 февраля 2009

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

xlApp = COM.Excel.Application;

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

Не забудьте закрыть Excel с помощью

xlApp.Quit;
delete(xlApp);

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

2 голосов
/ 23 февраля 2009

Это не очень элегантное решение, но если вы сохраните новую электронную таблицу .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, поэтому не знаю никаких плагинов)

2 голосов
/ 23 февраля 2009

РЕДАКТИРОВАТЬ: мое предыдущее предположение, что XLSWRITE не будет работать, было неправильно. Я просто попробовал следующее в MATLAB:

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

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

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

ПРЕДЛАГАЕМЫЕ ПРЕДЛАГАЕМЫЕ ВАРИАНТЫ:

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

1 голос
/ 02 июня 2009

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

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

...