0

コンピュータに Matlab r2010a をインストールしました

関数 xlsread を使用して、1 つの *.xls または *.xlsx ファイルからデータをロードする必要があります。それは大きな課題ではありません。問題はxlsread.m、読み込みプロセスのパーセンテージを示すフラグ (整数) を取得するように変更する方法です。

どうもありがとう。

これまでのところ、私はこれを作成しました:半分までカウントするステップ変数を入れてからxlsread、少し時間がかかる呼び出しを行い、ロードプロセスの後、49.5% のカウンターが最後までカウントされます。

最高ではありませんが、これは私が持っているものです

file = 'example.xls';

h = waitbar(0, ['Loading data from ' file], ...
            'Name', 'Loading',...
            'CreateCancelBtn',...
            'setappdata(gcbf, ''canceling'', 1)');

steps = 200;

for step = 1 : steps

    %# Check for Cancel button press

    if getappdata(h, 'canceling')
        okCancel = 1;
        break
    end

    pause(0.01);         %# Delay time for wait bar progres

    if step == steps/2
        [data, txt] = xlsread(file);
    end

    %# Process status report

    waitbar(step/steps, h, sprintf(['Loading data from file... %3.2f%%'], step*100/steps));
end

set(h, 'CloseRequestFcn', 'closereq')
close(h)
4

1 に答える 1

1

XLSREAD 関数を使用すると、読み取るセルの範囲を指定できます。したがって、進行状況バーを「インクリメント」するたびに、データをバッチで読み取ることができます (たとえば、テーブルの最初の 50 行を読み取り、次に次の 50 行を読み取るなど)。

これは、テーブル全体を一度に読み取るよりも遅くなることに注意してください。これは、関数が呼び出されるたびに Excel COM に接続して破棄する必要があるためです (説明と考えられる解決策については、この投稿を参照してください)。


編集:

簡単な例を次に示します。

%# path to excel file to read
fname = fullfile(pwd,'test.xls');

%# get number of rows/columns in table
Excel = actxserver('Excel.Application');    %# open Excel COM Server
wb = Excel.Workbooks.Open(fname, 0, true);  %# open XLS file for reading
sheet = Excel.Worksheets.get('item',1);     %# activate first sheet
numRows = sheet.Range('A1').End('xlDown').Row;
numCols = sheet.Range('A1').End('xlToRight').Column;
wb.Close(false);                            %# close XLS file
Excel.Quit();                               %# cleanup
Excel.delete();
clear Excel wb sheet;

%# read rows in steps, and show progress-bar
numSteps = 20;
idx = fix(linspace(0,numRows,numSteps+1));
num = cell(numSteps,1);
h = waitbar(0, 'Reading excel file');
for i=1:numSteps
    %# update progress-bar
    waitbar(i / numSteps);

    %# range of cells to read
    cellRange = sprintf('%c%d:%c%d', ...
        'A', idx(i)+1, char('A'+numCols-1), idx(i+1));
    num{i} = xlsread(fname, 1, cellRange);
end
close(h)

%# merge all cells into a matrix
num = cell2mat(num);

スクリーンショット

これは、Excel ファイルに数値データのテーブルが含まれていることを前提としています。独自のファイルに自由に適応させてください。

于 2012-06-21T06:25:35.550 に答える