4

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

  • 我无法使用双击打开 excel 文件(只能使用 matlab)
  • 2 LARGE (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);

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

4

3 回答 3

1

范围参数也适用于角落。从以下文档xlsread

num = xlsread(filename,sheet,xlRange)

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

这意味着你可以这样做:

xlsread(file, 'element', 'A2:C65536');
于 2013-01-07T15:38:53.857 回答
1

这对我有用。

system('taskkill /F /IM EXCEL.EXE');
于 2014-03-13T09:12:21.210 回答
0

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

在 Cygwin 中:

ps -W | grep EXCEL | cut -c -9 | xargs /bin/kill -f
于 2013-01-30T18:33:17.513 回答