从Matlab修改Excel工作表

时间:2009-02-23 19:32:05

标签: excel matlab worksheet-function

是否可以在matlab中打开Excel中的工作表并编辑公式?这个想法是通过创建第二张表来自动化不确定性分析,其中每个单元格中的不确定性来自前一个单元格的值。基本上,我想将单元格视为变量,并为每个单元格执行SQRT(SUM(Partials(xi)^ 2))。 matlab应该没有问题,但它可以编辑表格中的公式吗?

目前的过程是从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 个答案:

答案 0 :(得分:5)

您应该可以通过COM / ActiveX / Automation来完成。查看External Interfaces文档;有一个如何通过Excel的自动化界面访问Excel文档的示例。

我以这种方式操作Excel几乎没有经验,但我知道你可以通过自动化在Excel中做任何事情,编辑单元格公式听起来并不那么难。

编辑:我找不到Excel对象模型的引用,但这是另一个例子:http://support.microsoft.com/kb/301982

答案 1 :(得分:2)

编辑:我先前假设XLSWRITE不起作用是错误的。我刚刚在MATLAB中尝试了以下内容:

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

当我在excel中打开文件时,该功能实际上就在那里!对此的限制是您必须只使用Excel中的函数。

不幸的是,我不相信XLSREAD可以将公式读入MATLAB(它似乎只是得到了结果)。

以前建议的选项:

您可能想要查看MathWorks网站上的Spreadsheet Link EX软件,虽然我对它有点不熟悉,但我不确定是否可以满足您的需求。您应该研究的其他内容是MATLAB Builder EX,它“允许您将MATLAB®应用程序作为宏函数或加载项集成到组织的Excel®工作簿中”。听起来很有希望......

答案 2 :(得分:2)

这不是一个非常优雅的解决方案,但如果您保存一个新的.xls电子表格,它只是一个制表符分隔(或CSV)文件,您可以让Matlab生成公式,当Excel打开文档时,值将填充。

在Perl中,我处理过类似的事情:

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

在Excel中打开tmpfile.xls时,单元格C1将显示为3,如果A1B1发生更改,则会动态更新。

(我对Matlab并不擅长,所以我不知道任何插件)

答案 3 :(得分:2)

使用COM / ActiveX。您可以通过以下命令打开Excel实例:

xlApp = COM.Excel.Application;

然后在Excel中使用代码完成和VBA帮助的组合来完成剩下的工作。

请记得使用

关闭Excel
xlApp.Quit;
delete(xlApp);

另外,所谓的CSE(Control-Shift-Enter)公式可能会有所帮助吗?请参阅Google

答案 4 :(得分:1)

作为替代方案,请参阅下面的代码(xlswrite)以使用Matlab中的ActiveX:

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