4

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);

プロセスを終了していないだけです。この機能を超えてこれを引き起こしている可能性があることはわかりません(もう介入できません)。問題についてはウェブ上で言及されていません。この動作を説明してください。すべての記憶を奪い取る

4

3 に答える 3

1

これは私にとってはうまくいきます。

system('taskkill /F /IM EXCEL.EXE');
于 2014-03-13T09:12:21.210 に答える
1

範囲パラメータはコーナーでも機能します。のドキュメントからxlsread:

num = xlsread(filename,sheet,xlRange)

構文 'C1:C2' を使用して xlRange を指定します。ここで、C1 と C2 は、読み取る領域を定義する 2 つの対角です。たとえば、'D2:H4' は、ワークシート上の 2 つのコーナー D2 と H4 の間の 3 行 5 列の四角形領域を表します。xlRange 入力では大文字と小文字が区別されず、Excel A1 参照スタイルが使用されます (Excel ヘルプを参照)。

つまり、次のことができます。

xlsread(file, 'element', 'A2:C65536');
于 2013-01-07T15:38:53.857 に答える
0

matlabの問題に対する解決策はまだありません。これは、ファイルを数回実行した後に開いたままになっている100万のプロセスを閉じるために使用しているものです。

Cygwinの場合:

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