Excel Matlab XLS读取打开的文件并清理

Excel Matlab XLS读取打开的文件并清理,excel,matlab,resource-cleanup,Excel,Matlab,Resource Cleanup,我正在1.4 MB excel文件上使用xlsread。在运行了几次m代码之后,我开始注意到一些奇怪的行为 我无法使用双击打开excel文件(只能使用matlab) 在清除之前,每次运行m代码都会打开2个大型(30Mb)EXCEL.EXE*32文件(我调用该函数2次) 我觉得matlab没有清理它的文件句柄。我使用角对角更新的代码使用以下两行读取数据 prs = xlsread(file, 'data2','A2:C550'); elm = xlsread(file, 'element','

我正在1.4 MB excel文件上使用xlsread。在运行了几次m代码之后,我开始注意到一些奇怪的行为

  • 我无法使用双击打开excel文件(只能使用matlab)
  • 在清除之前,每次运行m代码都会打开2个大型(30Mb)EXCEL.EXE*32文件(我调用该函数2次)
我觉得matlab没有清理它的文件句柄。我使用角对角更新的代码使用以下两行读取数据

prs = xlsread(file, 'data2','A2:C550');
elm = xlsread(file, 'element','A2:C65536');
调用这两个函数后,任务管理器将显示两个大型EXCEL.EXE*32文件。我已经试过了

clear
clear all
close all
fclose('all')
fclose(0); fclose(1); fclose(2)
等等,我关闭matlab,它们仍然打开

在尝试重新启动后进行了更多的窥探,但没有结果

xlsread使用excel填充看似服务器的内容,以便使用

Excel = actxserver('excel.application');
清理工作看起来应该在这里进行

cleanUp = onCleanup(@()xlsCleanup(Excel, file));        
[numericData, textData, rawData, customOutput] = xlsreadCOM(file, sheet, range, Excel, customFun);
接着是

clear cleanUp; 
稍后在节目中。研究表明,这应该运行一个名为xlsCleanup的清理功能。将文件复制到此处以供参考

function xlsCleanup(Excel, filePath)
    try %#ok<TRYNC> - Suppress any exception
        %Turn off dialog boxes as we close the file and quit Excel.
        Excel.DisplayAlerts = 0; 
        %Explicitly close the file just in case.  The Excel API expects
        %just the filename and not the path.  This is safe because Excel
        %also does not allow opening two files with the same name in
        %different folders at the same time.
        [~, n, e] = fileparts(filePath);
        fileName = [n e];
        Excel.Workbooks.Item(fileName).Close(false);
    end
    Excel.Quit;
end

只是没有结束这个过程。我不知道除了这个功能(不能再介入)之外,还有什么可能导致这个问题,而且在网上也没有提到它的问题。请帮我解释一下这种行为。占用我所有的内存

范围参数也适用于拐角。根据以下文件:

使用语法“C1:C2”指定xlRange,其中C1和C2是两个 定义要读取区域的相对角点。例如,“D2:H4” 表示两个角D2之间的3×5矩形区域 和工作表上的H4。xlRange输入不区分大小写,并且 使用Excel A1参考样式(请参见Excel帮助)

这意味着你可以:

xlsread(file, 'element', 'A2:C65536');

仍然没有解决matlab问题的方法。这就是我用来关闭在运行我的文件几次之后仍然打开的数百万个进程的方法

在Cygwin:

ps -W | grep EXCEL | cut -c -9 | xargs /bin/kill -f
这对我有用

system('taskkill /F /IM EXCEL.EXE');

为什么不一次导入整个文件,而不是单独导入每一列?一次读取整个文件应该更快。在我的情况下,excel文件在使用
xlsread
后不会保留在taskmanager中。您是否使用类似于
fopen
?我稍后在mfile中使用了一个fopen命令,但它用于其他用途,在使用调试器时我几乎不运行它。让我重新表述一下:如果您只是重新启动,打开matlab并运行xlsread而不做任何其他操作,您是否看到这些进程中有任何进程保持打开状态?是的。所有的旧流程都是开放的。在重新启动后调用该函数会添加新进程
ps -W | grep EXCEL | cut -c -9 | xargs /bin/kill -f
system('taskkill /F /IM EXCEL.EXE');