MATLAB에서 Excel 파일 출력 시 엑셀의 셀(열) 폭을 자동으로 조정할 수 있는 방법을 소개합니다.

본 포스트의 원문은 아래의 URL에서 확인하실 수 있습니다. 본 포스트는 원작자에게 동의를 구한 뒤 한국어로 번역하였습니다.

수행해 본 것

(MATLAB에서) Excel 파일로 출력 시 셀의 폭이 아쉬울 수 있습니다. 이것을 자동 조절되게 해보았습니다. 다만, 유감스럽지만 MATLAB측의 기능으로는 가능하지 않아보였기 때문에 MATLAB을 통해 Excel 기능을 이용하였습니다.

공식 페이지라고 할 수 있는 것은 여기를 확인하여 주십시오: Read Spreadsheet Data Using Excel as Automation Server

xlswrite를 사용하는 방법은 아래의 “왜 xlswrite는 추천하지 않는가?” 글꼭지을 읽어보셔도 좋을 것 같습니다.

LiveScript판 (MATLAB)은 GitHub: ActiveX-Excel-MATLAB1에 올라가있습니다.

셀 폭 조정? 구체적으로 어떤 것이지?

예를 들어 테이블 형식으로

data = ["fileEnsembleDatastore","ds","datastore"];
data = array2table(data)
  data1 data2 data3
1 “fileEnsembleDataStore” “ds” “datastore”

라는 데이터를 엑셀에 써보내 보겠습니다.

filename = 'undisiredFormat.xlsx';
writetable(data,filename);

엑셀에서 열어보면 약간 아쉬운 마음이 들게 됩니다.

이것을

autoFitCellWidth(filename);

처럼 데이터의 길이에 맞게 폭을 조절해보겠다는 이야기입니다.

여담: Excel에 써보내기 위한 함수

MATLAB에서 Excel 파일로 출력해주는 함수라고하면 xlswrite 함수가 가장 오래 사용되어 왔습니다만, 최근에는

와 같은 것들이 추천되고 있습니다. 같은 방식으로 csvwrite 함수도 사용을 권장하지 않는다는 메시지가 나오는 것 같습니다.

왜 xlswrite는 추천하지 않는가?

내보내기 속도가 다릅니다. 이 예에서는 100배 이상 다릅니다.

data = rand(10,10);
tic
xlswrite('test_xlswrite.xlsx',data);
toc
경과 시간은 8.999516 초 입니다.
tic
writematrix(data,'test_writematrix.xlsx');
toc
경과 시간은 0.071814 초 입니다.

확실히 다르네요.

xlswrite 함수는 Excel을 실행해야 하기 때문에 시간이 걸립니다. 게다가 불편하게도 여러 번 호출하면 매번 Excel을 시작하고 닫고를 반복하기 때문에 시간이 많이 걸립니다. 가능하면 “write”로 시작하는 함수들을 사용합시다.

셀 폭 조정

그러면 본격적으로 함수의 내용을 보는 편이 빠르겠네요. VBA에 익숙하신 분들이라면 감이 오시겠지만, 어떻습니까?

function autoFitCellWidth(filename)

    % Excel 파일의 절대 경로를 획득
    filepath = which(filename);
    
    % Excel에 대해 ActiveX를 연다
    h = actxserver('excel.application');
    wb = h.WorkBooks.Open(filepath);
    
    % UsedRange: 데이터가 들어가있는 범위의
    % EntireColumn: 열 전체를
    % AutoFit: 데이터에 맞는 폭으로 변경한다.
    wb.ActiveSheet.UsedRange.EntireColumn.AutoFit;
    
    % 지정한 파일명을 저장하고 엑셀을 닫는다.
    wb.SaveAs(filename);
    wb.Close;
    h.Quit;
    h.delete;
    % 주의: 이 쫌에서 Close/Quit/Delete 해두지 않으면 나중에 복잡해집니다.
    % (다른 앱에서 사용하고 있는데 열린다던가, 지울 수 없게 되는 이슈 등이 발생합니다)
    % 이럴 때는 PC를 재부팅해주면 괜찮아집니다.
end

ActiveSheet이나 UsedRange나 EntireColumn같은 것들은 모두 Excel 쪽의 명령어입니다. 같은 요령으로 그 밖에도 Excel을 활용할 수 있겠죠?

기타 편집 작업 예시

범위를 지정해서 동일한 작업을 한다고 하면

    range = 'A1:H5';
    wbrange = wb.ActiveSheet.get('Range',range);
    wbrange.EntireColumn.AutoFit;

이라던가 셀 폭을 결정해서 입력해주고 싶다면

    wbrange.EntireColumn.ColumnWidth = 20;

등으로 할 수 있겠네요.

그리고 셀의 배경색이나 글자 색깔을 바꾸려고한다면,

    % 셀 배경색 변경
    wb.ActiveSheet.UsedRange.Interior.Color=hex2dec('00FF00'); % 초록
    % 폰트색
    wb.ActiveSheet.UsedRange.Font.Color=hex2dec('0000FF'); % 빨강
    % 색깔은 10진수의 BGR의 조합으로 지정됩니다.
    % 빨강: 0000FF
    % 파랑: FF00FF
    % 초록: 00FF00
    % 검정: 000000
    % 하양: FFFFFF

참고

Appendix: autoFitCellWidth 함수

function autoFitCellWidth(filename)

    % Excel 파일의 절대 경로를 획득
    filepath = which(filename);
    
    % Excel에 대해 ActiveX를 연다
    h = actxserver('excel.application');
    wb = h.WorkBooks.Open(filepath);
    
    % UsedRange: 데이터가 들어가있는 범위의
    % EntireColumn: 열 전체를
    % AutoFit: 데이터에 맞는 폭으로 변경한다.
    wb.ActiveSheet.UsedRange.EntireColumn.AutoFit;
    
    % 지정한 파일명을 저장하고 엑셀을 닫는다.
    wb.SaveAs(filename);
    wb.Close;
    h.Quit;
    h.delete;
    % 주의: 이 쫌에서 Close/Quit/Delete 해두지 않으면 나중에 복잡해집니다.
    % (다른 앱에서 사용하고 있는데 열린다던가, 지울 수 없게 되는 이슈 등이 발생합니다)
    % 이럴 때는 PC를 재부팅해주면 괜찮아집니다.
end
  1. Livescript에서 markdown으로 변경하는 것은 livescript2markdown​: MATLAB’s live scripts to markdown을 사용하고 있습니다.