NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# 24. C#의 COM Interop을 이용하여 Microsoft Office의 Excel과 Word에 엑세스 하기

    페이지 정보

    본문

    안녕하세요. 소심비형입니다. 이제 날씨가 아침 저녁으로 선선해졌네요. 요즘 이것저것 벌려놓은 일들이 많아서 시간이 많이 부족하군요. 별로 돈되는 일도 아닌데 바쁘기만하다보니 더 힘든거 같습니다. 당장 돈이 안되는 사업인 경우에는 상대방도 적극적이지 않고... 혼자서 전전긍긍하고 있네요^^;

    19VtSQ3.jpg

     

     

    우선, COM Interop은 닷넷 프레임워크에서 CLR(Common Language Runtime)에 포함된 COM(Component Object Model) 개체를 상호 운용할 수 있게 만드는 기술을 말합니다. 이말은 Windows 운영 체제에서 공용으로 사용할 수 있는 컴포넌트가 인터페이스를 통해 닷넷과 통신할 수 있다는 의미입니다. 아래 예제처럼 Microsoft Office에서 제공하는 COM 개체를 통해 C#으로 Excel 또는 Word와 같은 작업을 쉽게 할 수 있도록 도와줍니다.

    Windows에서 제공하는 COM 개체는 많지만, 닷넷에서 사용할 수 있는 Interop 개체는 한정적입니다. 주로, Excel과 연동하여 많이 사용되고 있지만 가끔은 Word나 Visio에서도 사용됩니다. 제가 주로 일하는 산업군에서는 Excel만 사용하고 있어서 그렇게 느끼는 건지도 모르겠네요.

     

    이 샘플은 MS-PL로 마이크로소프트사에서 직접 배포하는 소스를 토대로 작성하였습니다. 이 라이센스는 가장 제한이 적은 라이센스로 사용자가 상업적 또는 비상업적인 용도로 소스 코드를 수정하거나 재배포할 수 있도록 허용합니다.

    Program.cs

    // Copyright © Microsoft Corporation. 모든 권리 보유.
    // 이 코드는 다음 라이선스의 약관에 따라 릴리스되었습니다. 
    // Microsoft Public License(MS-PL, http://opensource.org/licenses/ms-pl.html)
    //
    using System;
    using System.Collections.Generic;
    using Excel = Microsoft.Office.Interop.Excel;
    using Word = Microsoft.Office.Interop.Word;
    
    public class Account{    public int ID { get; set; }    public double Balance { get; set; }}
    public class Program
    {
        static void Main(string[] args)
        {
            var checkAccounts = new List<Account>
            {
                new Account { ID = 345, Balance = 541.27 },
                new Account { ID = 123, Balance = -127.44 }
            };
    
            DisplayInExcel(checkAccounts, (account, cell) =>
            {
                // 여러 줄로 된 이 lambda는            
                // 사용자 지정 처리 규칙을 설정합니다.            
                cell.Value = account.ID;
                cell.Offset[0, 1].Value = account.Balance; if (account.Balance < 0)
                {
                    cell.Interior.Color = 255; cell.Offset[0, 1].Interior.Color = 255;
                }
            });
    
            var word = new Word.Application();
            word.Visible = true; word.Documents.Add();
            word.Selection.PasteSpecial(Link: true, DisplayAsIcon: true);
        }
    
        public static void DisplayInExcel(IEnumerable<Account> accounts, Action<Account, Excel.Range> DisplayFunc)
        {
            var xl = new Excel.Application();
            xl.Workbooks.Add(); xl.Visible = true;
            xl.Cells[1, 1] = "ID"; 
            xl.Cells[1, 2] = " Balance";
            xl.Cells[2, 1].Select(); 
            
            foreach (var ac in accounts)
            {
                DisplayFunc(ac, xl.ActiveCell);
                xl.ActiveCell.Offset[1, 0].Select();
            }
            xl.Range["A1:B3"].Copy(); xl.Columns[1].AutoFit();
            xl.Columns[2].AutoFit();
        }
    }

     

     

    코드가 짧고 단순하기 때문에 특별히 설명할만한 내용은 없습니다. 아직 배우지는 않았지만 51라인에서 Action 대리자를 통해 반환 값이 없는 익명 형식을 정의하고 있습니다. 그리고 31라인에서 익명 메소드를 람다식으로 구현하고 있습니다. 익명 메소드는 C# 2.0에 포함되었으며 람다식은 C# 3.0에서 추가되었습니다. 지금은 대부분 익명 메소드보다는 람다식을 선호하고 있습니다. 익명 메소드는 무명 메소드로 말하기도 합니다. 아마도 대부분 무명 메소드로 부르고 있을겁니다.

    ※ 이 예제를 실행하려면 컴퓨터에 MS Office가 설치되어 있어야 합니다.

     

    이 코드에서 중요한 부분은 No-PIA(Primary Interop Assembly)모드를 사용한다는 점입니다. PIA는 COM 인터페이스에서 생성되며 디자인 타임에 유용한 형식 지원을 제공합니다. 그러나 런타임에는 프로그램의 크기를 늘리고 버전 관리 문제를 일으킬 수 있습니다. No-PIA 기능을 사용하면 디자인 타임에 PIA를 계속 사용하면서도 런타임에는 PIA를 생략할 수 있습니다. C# 컴파일러는 프로그램에서 실제로 사용하는 PIA의 작은 부분을 직접 어셈블리로 만듭니다. 더 이상 프로그램 배포에 PIA를 포함할 필요가 없습니다.

     

    다음 시간에...

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.