ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

Excel をオートメーション サーバーとして使用したスプレッドシート データの読み取り

この例では、COM オートメーション サーバーを使用して MATLAB® から別のアプリケーションにアクセスする方法を示します。Microsoft® Excel® ファイルのデータにアクセスするためのユーザー インターフェイスを作成します。アプリケーションでコンポーネント オブジェクト モデル (COM) を使用しない場合、スプレッドシートの関数と例で、Excel スプレッドシートのデータを MATLAB にインポートする代替方法を参照してください。

MATLAB とスプレッドシート プログラム間の通信を有効にするために、この例では、Excel アプリケーションを実行するオートメーション サーバーに Microsoft ActiveX® オブジェクトを作成します。これにより、MATLAB で Excel オートメーション サーバーによって提供されるインターフェイスを使ってスプレッドシートのデータにアクセスできます。最後に、この例では、Microsoft Excel ファイルのデータにアクセスするためのユーザー インターフェイスを作成します。

例示される手法

  • オートメーション サーバーを使用して、MATLAB から別のアプリケーションにアクセスする

  • Excel データをインターフェイスとプロットに使用する型に変換する操作をする

次の手法は、スプレッドシートのデータの可視化と操作をどのように行うかを示します。

  • Excel スプレッドシートの選択した列をプロットするインターフェイスの実装。

  • MATLAB の Figure の、Excel ファイルへの挿入。

完全なコード リストを確認するには、ファイル actx_excel.m をエディターで開きます。

Excel オートメーション サーバーの作成

MATLAB からスプレッドシートのデータにアクセスするための最初の手順として、関数 actxserver とプログラム ID excel.application を使用して、オートメーション サーバー プロセスで Excel アプリケーションを実行します。

exl = actxserver('excel.application');

ActiveX オブジェクト 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 ファイルが作成されます。

次の図は、リスト ボックスで入力/応答の組み合わせが選択され、座標軸にプロットされているインターフェイスを示しています。

この例を実行するには、このリンクをクリックします。

参考

関連するトピック