Matlab xlsread打开文件并清理

时间:2013-01-07 15:33:21

标签: excel matlab resource-cleanup

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

  • 我无法使用双击打开excel文件(只能使用matlab)
  • 2个大(30Mb)EXCEL.EXE * 32个文件打开每个m代码运行清除之前(我称之为功能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

首先,它很烦人,它在没有警报的情况下捕获异常。我查了一下,但代码没有抛出异常。它似乎是行

Excel.Workbooks.Item(fileName).Close(false);

只是没有结束这个过程。我不知道是什么导致这个功能超出这个功能(不能再介入了),并且网上没有提及它的问题。请帮我解释一下这种行为。占用我所有的记忆

3 个答案:

答案 0 :(得分:1)

范围参数也适用于角落。来自xlsread的文档:

num = xlsread(filename,sheet,xlRange)
  

使用语法&#39; C1:C2&#39;指定xlRange,其中C1和C2为2   相对的角落定义了要阅读的区域。例如,&#39; D2:H4&#39;   表示两个角D2之间的3乘5的矩形区域   和工作表上的H4。 xlRange输入不区分大小写,并且   使用Excel A1参考样式(请参阅Excel帮助)。

这意味着您可以这样做:

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

答案 1 :(得分:1)

这对我有用。

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

答案 2 :(得分:0)

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

在Cygwin:

ps -W | grep EXCEL | cut -c -9 | xargs /bin/kill -f