【问题标题】:Modify an Excel sheet from Matlab从 Matlab 修改 Excel 工作表
【发布时间】:2009-02-23 19:32:05
【问题描述】:

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

目前的过程是从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)

【问题讨论】:

  • 我不得不问,你为什么要使用 Excel 呢?它并不是真正用于像这样的科学数据分析。您最好将数据导出到文本文件,导入 MATLAB,计算结果,然后保存为文本并重新导入 Excel。
  • David,它是我们实验室(机械工程实验室)的“标准”。我同意,如果可以的话,我想把事情纯粹放在 matlab 中。不过,我必须说,excel确实有它的优点。例如,在您获取数据时对工作表进行“编程”可以提供一些不错的实时计算/可视化。

标签: excel matlab worksheet-function


【解决方案1】:

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

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

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

【讨论】:

【解决方案2】:

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

在 Perl 中,我是这样处理的:

打开(输出,'>tmpfile.xls'); 打印输出“1\t2\t=A1+B1\n”; 关闭(输出);

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

(我不擅长 Matlab,所以我对任何类型的插件一无所知)

【讨论】:

  • 澄清一下,您可以将其保存为 xls,这样会保留方程式而不是值?
  • 没错。这绝对是 janky,但 Excel 会自动翻译并维护公式。如有疑问,请打开它,然后将其保存为“真实”的 .xls :)(不过,我觉得这很糟糕)
  • 大声笑,确实是'janky'。但这可能是获取公式的最简单方法。
  • 另外,澄清一下,甚至没有真正需要将其保存为 .xls,这主要是为了使用 Excel 双击打开(在 Windows 中)。 Excel 将打开文件而不管扩展名如何,但您可能必须指定其编码。
  • Ty kyle,采取了一些“fedangling”来让它不保存值。
【解决方案3】:

编辑:我之前认为XLSWRITE 不起作用的假设是错误的。我刚刚在 MATLAB 中尝试了以下操作:

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

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

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

以前建议的选项:

您可能想查看 MathWorks 网站上的 Spreadsheet Link EX 软件,尽管我对它有点陌生,并且不确定它是否能满足您的需求。您应该研究的其他内容是MATLAB Builder EX,它“让您可以将 MATLAB® 应用程序作为宏函数或插件集成到您组织的 Excel® 工作簿中”。听起来很有希望...

【讨论】:

  • 似乎与我在 LabView 中使用的一些 XLS 读取方法相似...嗯。查看链接,ty
  • 我认为这些肯定会奏效,不过有点价格障碍。如果我找不到免费选项,我想我会选择第二个。 ty +1
【解决方案4】:

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

xlApp = COM.Excel.Application;

然后结合使用代码完成和 Excel 本身中的 VBA 帮助来解决其余部分。

记得用

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

顺便说一句,所谓的 CSE(Control-Shift-Enter)公式可能会有所帮助吗?见Google

【讨论】:

  • 你不需要在你的第一个命令之前有什么东西来启动 COM 吗?如果你这样做,命令是什么?
  • 是不是和 xlApp = actxserver('Excel.Application'); 一样?
【解决方案5】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多