2013-01-07 72 views
4

我在1.4 MB excel文件上使用xlsread。幾次運行我的m代碼後,我開始注意到一些奇怪的行爲。Matlab xlsread打開文件並清理

  • 我無法通過雙擊打開Excel文件(只能使用MATLAB)
  • 2 LARGE(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填充像它應該是在這裏發生

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

接着是

clear cleanUp; 
這似乎是一個服務器Excel中使用

Excel = actxserver('excel.application'); 

清理工作看起來讀取信息在程序的稍後部分中使用

。研究表明這應該運行一個叫做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); 

只是沒有結束的過程。我不知道什麼可能導致這個功能超出這個功能(不能再繼續下去),網絡上也沒有提及它的問題。請幫我解釋一下這種行爲。佔用我所有的記憶

+0

爲什麼不立即導入整個文件而不是分別導入每個列?一次讀取整個文件應該會更快。 – slayton

+0

在我的情況下,使用'xlsread'之後並不會發生excel文件留在taskmanager中。你可能使用類似'fopen'的東西嗎? –

+0

我以後在mfile中使用了fopen命令,但是它用於別的東西,而且在使用調試器時我幾乎不運行它。 –

回答

0

仍然沒有解決問題MATLAB。這是我用來關閉幾百萬個運行我的文件幾次後仍然打開的進程。

在Cygwin的:

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

範圍參數也適用於角落。從xlsread文檔:「:C2 C1」,其中C1和C2是兩個 定義區域讀取相對的角

num = xlsread(filename,sheet,xlRange) 

使用語法指定xlRange。例如,「D2:H4」 表示工作表上兩個角D2 和H4之間的3乘5矩形區域。 xlRange輸入不區分大小寫,並且 使用Excel A1參考樣式(請參閱Excel幫助)。

這意味着你可以這樣做:

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

這對我的作品。

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