我正在使用MATLAB写入其中包含宏的Excel文件,然后重新评估该文件并使用xlsread
提取宏结果。该代码仅适用于一名工人。但是,如果我使用parfor
并使用第二个工作程序,MATLAB会给出如下错误消息。为严格起见,我为第二个工作人员创建了第二个Excel文件,并使用t = getCurrentTask(); t.ID;
指示工作人员处理他们安排的excel文件。
使用xlswrite时出错(第226行)
调用错误,调度异常: 资料来源:Microsoft Excel 说明:Microsoft Excel无法访问该文件 'C:\ Users ----- \ D0481000'。有几种 可能的原因: •文件名或路径不存在。 •该文件正在被另一个程序使用。 •您要保存的工作簿与当前打开的工作簿具有相同的名称。 帮助文件:xlmain11.chm 帮助上下文ID:0
extractFromExcelExpress中的错误(第249行) xlswrite(filename,writeIn,sheet,'B23');
这是随机发生的。我确实尝试过更改excel文件的文件夹,它开始工作了几个小时,但最终停止了。我确实清除了Excel中的所有加载项,并且确实将相应的文件夹放在excel信任位置。
Excel版本:2016
MATLAB版本:R2017a
答案 0 :(得分:0)
这听起来像是典型的竞争状况问题,由多个进程需要互斥访问同一文件引起。基本思想是,当另一个进程试图打开该文件时,一个进程仍未关闭文件,并且您有时会出现错误,因为这些问题并不总是会发生(另请参见:{{3} }。
以下是关于您可以做什么的一些建议(以对我有意义的顺序递减):
xlswrite
代码放在parfor
之外。如果在保留parfor
的同时很难实现这一点,只需将所有中间结果保存到工作区变量中,然后在完成计算后将其写入磁盘。xlswrite1
属性的方法。这可能与先前的建议有关。Workbook.MultiUserEditing
,然后将Excel文件放在此处,这样至少可以避免由于使用网络驱动器,HDD甚至是SSD而导致的速度变慢。xlswrite
语句前后加上while true, try, xlswrite(...); break; catch, pause(0.01); end, end
。这 会降低代码速度,但至少最终会完成代码。