1.4 MB の Excel ファイルで xlsread を使用しています。m コードを数回実行した後、いくつかの奇妙な動作に気付き始めました。
- ダブルクリックで Excel ファイルを開くことができません (matlab のみ使用できます)
- 2 つの LARGE (30Mb) EXCEL.EXE*32 ファイルが m-code ごとに開き、クリア前に実行されます (関数を 2 回呼び出します)。
matlab がファイル ハンドルをクリーンアップしていないように感じました。コーナーツーコーナー読み取りを使用する更新されたコードは、次の2行を使用してデータを読み取ります
prs = xlsread(file, 'data2','A2:C550');
elm = xlsread(file, 'element','A2:C65536');
タスク マネージャーは、両方の関数が呼び出された後、2 つの大きな 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);
プロセスを終了していないだけです。この機能を超えてこれを引き起こしている可能性があることはわかりません(もう介入できません)。問題についてはウェブ上で言及されていません。この動作を説明してください。すべての記憶を奪い取る