Excel をオートメーション サーバーとして使用したスプレッドシート データの読み取り
この例では、COM オートメーション サーバーを使用して MATLAB® から別のアプリケーションにアクセスする方法を示します。Microsoft® Excel® ファイルのデータにアクセスするためのユーザー インターフェイスを作成します。アプリケーションでコンポーネント オブジェクト モデル (COM) を使用しない場合、スプレッドシートの関数と例で、Excel スプレッドシートのデータを MATLAB にインポートする代替方法を参照してください。
MATLAB とスプレッドシート プログラム間の通信を有効にするために、この例では、Excel アプリケーションを実行するオートメーション サーバーにオブジェクトを作成します。これにより、MATLAB は Excel オートメーション サーバーによって提供されるインターフェイスを介してスプレッドシートのデータにアクセスするようになります。最後に、この例では、Microsoft Excel ファイルのデータにアクセスするためのユーザー インターフェイスを作成します。
例示される手法
オートメーション サーバーを使用して、MATLAB から別のアプリケーションにアクセスする
Excel データをインターフェイスとプロットに使用する型に変換する操作をする
次の手法は、スプレッドシートのデータの可視化と操作をどのように行うかを示します。
Excel スプレッドシートの選択した列をプロットするインターフェイスの実装。
MATLAB の Figure の、Excel ファイルへの挿入。
このコードで関数 actx_excel.m
を作成します。
メモ
この例のデータ ファイル input_resp_data.xls
にアクセスするには、ドキュメンテーションをインストールする必要があります。
Excel オートメーション サーバーの作成
MATLAB からスプレッドシートのデータにアクセスするための最初の手順として、関数 actxserver
とプログラム ID excel.application
を使用して、オートメーション サーバー プロセスで Excel アプリケーションを実行します。
exl = actxserver('excel.application');
exl
オブジェクトは、Excel プログラムでサポートされる数多くのインターフェイスへのアクセスを提供します。Workbooks
インターフェイスを使って、データが含まれている Excel ファイルを開きます。
exlWkbk = exl.Workbooks;
exlFile = exlWkbk.Open([docroot '/techdoc/matlab_external/examples/input_resp_data.xls']);
ワークブックの Sheets
インターフェイスを使って、Range
オブジェクトからデータにアクセスします。このオブジェクトには、指定されたシートからのデータ範囲への参照が格納されています。この例では、列 A
の最初のセルから列 G
の最後のセルにあるすべてのデータにアクセスします。
exlSheet1 = exlFile.Sheets.Item('Sheet1'); robj = exlSheet1.Columns.End(4); % Find the end of the column numrows = robj.row; % And determine what row it is dat_range = ['A1:G' num2str(numrows)]; % Read to the last row rngObj = exlSheet1.Range(dat_range);
この時点で、Excel ファイルの sheet1
の全データセットが、Range オブジェクト インターフェイス rngObj
からアクセスされます。このオブジェクトは、MATLAB cell 配列 exlData
のデータを返します。これには数値データと文字データの両方が含まれます。
exlData = rngObj.Value;
MATLAB ワークスペースでのデータの操作
データを cell 配列に入れたことにより、MATLAB 関数を使用してデータの一部を抽出し、インターフェイスでの使用とプロット関数への受け渡しができるデータ形状に変更できるようになりました。データに関する仮定の詳細については、Excel スプレッドシート形式を参照してください。
次のコードはデータを操作します。
for ii = 1:size(exlData,2) matData(:,ii) = reshape([exlData{2:end,ii}],size(exlData(2:end,ii))); lBoxList{ii} = [exlData{1,ii}]; end
このコードは次の操作を実行します。
cell 配列から数値データを抽出します。中かっこ
{}
内のインデックス式を参照してください。インデックス操作によって返される個々の double を結合します。大かっこ
[]
内の式を参照してください。関数
reshape
を使用して、結果の形状を、データを列単位で並べる配列に変換します。exlData
データのそれぞれの列における最初のセルのテキストを抽出し、テキストを cell 配列lBoxList
に格納します。この変数を使用して、リスト ボックスの項目を生成します。
Excel スプレッドシート形式
この例では、次の図に示されるように、Excel スプレッドシートの特定の構成を想定します。
Excel ファイルの形式は以下のとおりです。
各列の最初の要素は、列に格納されているデータを識別するテキストです。これらの値が抽出され、リスト ボックスが作成されます。
最初の列
Time
は、残りのデータのすべてのプロットにおける x 軸に使用されます。各列のすべての行が MATLAB に読み取られます。
プロッターのインターフェイスの作成
この例では、入力と応答のデータのリストから選択できるインターフェイスを使用します。すべてのデータは時間の関数としてプロットされます。また、グラフにデータを追加し続けることができます。グラフにデータ プロットが追加されると、凡例にもデータが追加されます。
このインターフェイスには以下の詳細が含まれます。
グラフにデータを追加するごとに更新される凡例
座標軸からすべてのグラフを削除できるクリア ボタン
PNG ファイルとしてグラフを保存し、それを別の Excel ファイルに追加する保存ボタン
アクセスしている Excel ファイルを表示または非表示にするトグル ボタン
オートメーション サーバーを終了するための Figure の削除関数
データの選択とプロット
[Create Plot] ボタンをクリックすると、コールバック関数がリスト ボックスのクエリを行い、どの項目が選択されたかを判断し、各データを時間に対してプロットします。MATLAB は既存のデータの凡例を維持しつつ、凡例を更新して新しいデータを表示します。
function plotButtonCallback(src,evnt) iSelected = get(listBox,'Value'); grid(a,'on');hold all for p = 1:length(iSelected) switch iSelected(p) case 1 plot(a,tme,matData(:,2)) case 2 plot(a,tme,matData(:,3)) case 3 plot(a,tme,matData(:,4)) case 4 plot(a,tme,matData(:,5)) case 5 plot(a,tme,matData(:,6)) case 6 plot(a,tme,matData(:,7)) otherwise disp('Select data to plot') end end [b,c,g,lbs] = legend([lbs lBoxList(iSelected+1)]); end % plotButtonCallback
軸のクリア
プロッターは、ユーザーがリスト ボックスからデータを選択するごとに継続的にグラフを追加するように設計されています。[Clear Graph] ボタンは、座標軸を削除してリセットし、プロット データのラベルの格納に使用される変数 (凡例で使用) を削除します。
%% Callback for clear button function clearButtonCallback(src,evt) cla(a,'reset') lbs = ''; end % clearButtonCallback
Excel の表示または非表示
MATLAB プログラムは、オートメーション サーバーで実行している Excel アプリケーションのプロパティにアクセスします。このコールバックは Visible
プロパティを 1
または 0
に設定することにより、Excel ファイルの可視性を制御します。
%% Display or hide Excel file function dispButtonCallback(src,evt) exl.visible = get(src,'Value'); end % dispButtonCallback
Figure を閉じて Excel オートメーション プロセスを終了
Excel オートメーション サーバーは MATLAB とは別のプロセスで実行されるため、このプロセスは明示的に終了しなければなりません。インターフェイスを閉じた後にこのプロセスを実行し続ける必要はないため、この例では Figure の delete
関数を使い、Quit
メソッドで Excel プロセスを終了します。また、グラフの保存に使用した Excel プロセスも終了する必要があります。このプロセスを終了する方法の詳細については、Excel スプレッドシートへの MATLAB グラフの挿入を参照してください。
%% Terminate Excel processes function deleteFig(src,evt) exlWkbk.Close exlWkbk2.Close exl.Quit exl2.Quit end % deleteFig
Excel スプレッドシートへの MATLAB グラフの挿入
このインターフェイスを使って作成したグラフを Excel ファイルに保存できます。この例では、この目的のために別の Excel オートメーション サーバー プロセスを使用します。[Save Graph] プッシュ ボタンのコールバックは、イメージを作成し、それを Excel ファイルに追加します。
座標軸と凡例の両方が、画面表示どおりにグラフを印刷するように設定された非表示の Figure にコピーされます (Figure の
PaperPositionMode
プロパティはauto
に設定されています)。print
コマンドで PNG イメージを作成します。Shapes
インターフェイスを使って、イメージを Excel ワークブックに挿入します。
サーバーとインターフェイスは初期化フェーズ中にインスタンス化されます。
exl2 = actxserver('excel.application'); exlWkbk2 = exl2.Workbooks; wb = invoke(exlWkbk2,'Add'); graphSheet = invoke(wb.Sheets,'Add'); Shapes = graphSheet.Shapes;
このコードを使用して、[Save Graph] ボタンのコールバックを実装します。
function saveButtonCallback(src,evt) tempfig = figure('Visible','off','PaperPositionMode','auto'); tempfigfile = [tempname '.png']; ah = findobj(f,'type','axes'); copyobj(ah,tempfig) % Copy both graph axes and legend axes print(tempfig,'-dpng',tempfigfile); Shapes.AddPicture(tempfigfile,0,1,50,18,300,235); exl2.visible = 1; end
例の実行
例を実行するには、リスト ボックスの任意の項目を選択し、[Create Plot] ボタンをクリックします。この例で提供されるサンプル データには、3 つの入力と、関連付けられた 3 つの応答データセットが格納されています。これらすべてのデータセットは、Excel ファイルの 1 列目、つまり時間データに対してプロットされます。
[Show Excel Data File] ボタンをクリックして、Excel データ ファイルを表示します。グラフのイメージを別の Excel ファイルに保存するには、[Save Graph] ボタンをクリックします。現在のフォルダーへの書き込みアクセス権がある場合、[Save Graph] オプションを使用すると、そのフォルダーに一時的な PNG ファイルが作成されます。
次の図は、リスト ボックスで入力/応答の組み合わせが選択され、座標軸にプロットされているインターフェイスを示しています。