从并行循环中访问Excel工作簿时出错



我正在使用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(文件名,writtenIn,工作表,'B23'(;

这是随机发生的。我确实尝试过更改excel文件的文件夹,它开始工作了几个小时,但最终停止了。我确实清除了Excel中的所有加载项,并将相应的文件夹放在Excel信任位置。

  • Excel版本:2016

  • MATLAB版本:R2017a

这听起来像是一个典型的竞争条件问题,由多个进程需要独占访问同一文件引起。基本思想是,当另一个进程试图打开文件时,一个进程仍然没有关闭文件,并且有时只会出现错误,因为这些问题并不总是发生(另请参阅:Heisenbug(。

以下是关于你能做什么的几个建议(按照对我来说有意义的递减顺序(:

  • 尝试重新设计代码,以便一次只有一个进程访问(读取或写入(文件。这被称为"关键部分"。在MATLAB中实现这一点的最简单方法是在parfor之外使用xlswrite代码。如果在保留parfor的同时很难实现这一点,只需将所有中间结果保存到工作区变量中,并在计算完成后将其写入磁盘即可
  • 您可以使用与xlswrite1中相同的方法在进程之间共享ActiveX对象(我从未尝试过,也不能确定这是否可能(。从本质上讲,它不会在写入之间尝试打开和关闭文件,因此一个进程仍然没有关闭它,而另一个进程试图打开它的情况不会发生
  • 找到使用Workbook.MultiUserEditing属性的方法。这可能与之前的建议有关
  • 使用可用的最快存储。你可以使用RAM驱动器,并将Excel文件放在那里,这样你至少可以避免使用网络驱动器、HDD甚至SSD造成的任何速度减慢
  • 如果所有其他语句都失败,请用while true, try, xlswrite(...); break; catch, pause(0.01); end, end包围xlswrite语句。这减慢代码的速度,但至少它最终会完成

最新更新