【发布时间】:2018-07-29 22:21:38
【问题描述】:
我正在使用 MATLAB 写入包含宏的 Excel 文件,然后重新评估该文件并使用 xlsread 提取宏结果。该代码仅适用于一名工人。但是,如果我使用 parfor 并使用第二个 worker,MATLAB 会给出如下错误消息。严格来说,我为第二个工人创建了第二个 Excel 文件,并使用t = getCurrentTask(); t.ID; 指示工人处理他们安排的 Excel 文件。
使用 xlswrite 时出错(第 226 行)
调用错误,调度异常: 资料来源:微软 Excel 说明:Microsoft Excel 无法访问该文件 'C:\用户-----\D0481000'。有几种 可能的原因: • 文件名或路径不存在。 • 该文件正被另一个程序使用。 • 您尝试保存的工作簿与当前打开的工作簿同名。 帮助文件:xlmain11.chm 帮助上下文 ID:0
extractFromExcelExpress 中的错误(第 249 行) xlswrite(filename,writtenIn,sheet,'B23');
这是随机发生的。我确实尝试更改 excel 文件的文件夹,它开始工作了几个小时,但最终停止了。我确实清除了 Excel 中的所有加载项,并将相应的文件夹放入了 excel 信任位置。
Excel 版本:2016
MATLAB 版本:R2017a
【问题讨论】:
-
您正试图从多个工作人员同时打开(并写入)同一个文件...这将导致错误,原因与尝试手动执行此操作的原因相同
-
谢谢狼!但是,我确定我使用的是 't = getCurrentTask(); t.ID;'确保每个工作人员只处理同一个文件。
-
这正是我的观点,如果所有工作人员都在写入单个文件,那么您会遇到冲突,正如 Dev-iL 的回答中所述...这里真正的解决方案是在 MATLAB 中重写宏 -由于
xlsread和xlswrite的速度非常慢,因此这将加速很多次,在问题上抛出parfor不是答案。 -
再次感谢 Wolfie。我想我在上一条评论中犯了一个错字。在 parfor 内部的每个进程中,我使用 t = getCurrentTask(); t.ID;找出哪个工人正在处理这个过程。说 t.ID==2,然后是工人 2 工作,然后我让工人 2 使用文件 #2。
-
我认为您关于更改宏的建议是一个很好的建议。这有点超出我的经验,但我会在有时间的时候尝试一下!再次感谢!
标签: excel matlab parallel-processing activex file-access