이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

Excel을 자동화 서버로 사용하여 스프레드시트 데이터 읽기

이 예제에서는 COM 자동화 서버를 사용하여 MATLAB®에서 다른 응용 프로그램에 액세스하는 방법을 보여줍니다. 또한 Microsoft® Excel® 파일에 있는 데이터에 액세스하는 사용자 인터페이스를 만듭니다. 응용 프로그램에서 COM(Component Object Model)을 사용하지 않을 경우 Excel 스프레드시트 데이터를 MATLAB으로 가져오는 데 대한 대안으로, 스프레드시트에 나와 있는 함수와 예제를 살펴보십시오.

MATLAB과 스프레드시트 프로그램 사이의 통신을 활성화하기 위해, 이 예제에서는 Excel 응용 프로그램을 실행하는 자동화 서버에 Microsoft ActiveX® 객체를 만듭니다. 그러면 MATLAB이 Excel 자동화 서버에서 제공되는 인터페이스를 통해 스프레드시트에 있는 데이터에 액세스합니다. 마지막으로, 이 예제에서는 Microsoft Excel 파일에 있는 데이터에 액세스하는 사용자 인터페이스를 만듭니다.

예제에서 보여주는 기술

  • 자동화 서버를 사용하여 MATLAB에서 다른 응용 프로그램에 액세스

  • Excel 데이터를 인터페이스와 플로팅에 사용되는 유형으로 조작하는 방법

다음 기술은 스프레드시트 데이터를 시각화하고 조작하는 방법을 보여줍니다.

  • Excel 스프레드시트에서 선택한 열을 플로팅할 수 있는 인터페이스 구현.

  • Excel 파일에 MATLAB Figure 삽입.

전체 코드 목록을 보려면 편집기에서 파일 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 객체의 데이터에 액세스할 수 있습니다. 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);

이때 범위 객체 인터페이스 rngObj를 통해 Excel 파일의 sheet1에서 전체 데이터 세트에 액세스합니다. 이 객체는 숫자형 데이터와 문자형 데이터를 모두 포함하는 MATLAB 셀형 배열 exlData에 있는 데이터를 반환합니다.

exlData = rngObj.Value;

MATLAB 작업 공간에 있는 데이터 조작하기

데이터가 셀형 배열에 있으므로, 이제 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

이 코드는 다음 작업을 수행합니다.

  • 셀형 배열에서 숫자형 데이터를 추출합니다. 중괄호 {} 안에 있는 인덱싱 표현식을 확인하십시오.

  • 인덱싱 연산에 의해 반환된 각 double형 값을 결합합니다. 대괄호 [] 안에 있는 표현식을 확인하십시오.

  • reshape 함수를 사용하여 열에 있는 데이터를 정렬하는 배열로 결과의 형태를 변경합니다.

  • exlData 데이터의 각 열의 첫 번째 셀에 있는 텍스트를 추출하여 셀형 배열 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 파일의 첫 번째 열에 대해 플로팅됩니다.

Show Excel Data File 버튼을 클릭하여 Excel 데이터 파일을 표시합니다. 그래프의 이미지를 다른 Excel 파일에 저장하려면 Save Graph 버튼을 클릭하십시오. 현재 폴더에 대한 쓰기 권한이 있는 경우 Save Graph 옵션을 선택하면 현재 폴더에 임시 PNG 파일이 생성됩니다.

다음 이미지는 목록 상자에서 입력값/응답 변수 쌍을 선택하고 좌표축에 플로팅한 인터페이스를 나타낸 것입니다.

이 예제를 실행하려면 이 링크를 클릭하십시오.

참고 항목

관련 항목