연습: C#의 Office 프로그래밍

C#은 Microsoft Office 프로그래밍을 개선하는 기능을 제공합니다. 유용한 C# 기능으로는 명명된 인수 및 선택적 인수, dynamic 형식의 반환 값 등이 있습니다. COM 프로그래밍에서 ref 키워드를 생략하면 인덱싱된 속성에 액세스할 수 있게 됩니다.

이 두 언어에서는 PIA(주 Interop 어셈블리)를 사용자 컴퓨터에 배포하지 않아도 COM 구성 요소와 상호 작용하는 어셈블리를 배포할 수 있도록 하는 형식 정보를 포함할 수 있습니다. 자세한 내용은 연습: 관리되는 어셈블리의 형식 포함을 참조하세요.

이 연습에서는 Office 프로그래밍과 관련해서 이러한 기능을 설명하지만 대부분 일반 프로그래밍에서도 유용합니다. 연습에서는 Excel 추가 기능 애플리케이션을 사용하여 Excel 통합 문서를 만듭니다. 그런 다음 통합 문서 링크를 포함하는 Word 문서를 만듭니다. 마지막으로 PIA 종속성을 사용 및 사용하지 않도록 설정하는 방법을 알아봅니다.

Important

VSTO(Visual Studio Tools for Office).NET Framework를 사용합니다. COM 추가 기능은 .NET Framework를 사용하여 작성할 수도 있습니다. Office 추가 기능은 최신 버전인 .NET Core 및 .NET 5 이상으로 만들 수 없습니다. .NET Core 및 .NET 5 이상은 동일한 프로세스에서 .NET Framework와 함께 작동할 수 없으며 추가 기능 로드 실패로 이어질 수 있기 때문입니다. 계속해서 .NET Framework를 사용하여 Office용 VSTO 및 COM 추가 기능을 작성할 수 있습니다. Microsoft는 .NET Core 또는 .NET 5 이상을 사용하도록 VSTO 또는 COM 추가 기능 플랫폼을 업데이트하지 않습니다. ASP.NET Core를 포함한 .NET Core 및 .NET 5 이상을 활용하여 Office 웹 추가 기능의 서버 쪽을 만들 수 있습니다.

필수 조건

이 연습을 완료하려면 Microsoft Office Excel 및 Microsoft Office Word가 컴퓨터에 설치되어 있어야 합니다.

참고 항목

일부 Visual Studio 사용자 인터페이스 요소의 경우 다음 지침에 설명된 것과 다른 이름 또는 위치가 시스템에 표시될 수 있습니다. 이러한 요소는 사용하는 Visual Studio 버전 및 설정에 따라 결정됩니다. 자세한 내용은 IDE 개인 설정을 참조하세요.

Excel 추가 기능 애플리케이션 설정

  1. Visual Studio를 시작합니다.
  2. 파일 메뉴에서 새로 만들기를 가리킨 다음, 프로젝트를 선택합니다.
  3. 설치된 템플릿 창에서 C#을 확장하고 Office를 확장한 다음 Office 제품의 버전 연도를 선택합니다.
  4. 템플릿 창에서 Excel <버전> 추가 기능을 선택합니다.
  5. 템플릿 창 위쪽의 대상 프레임워크 상자에 .NET Framework 4 이상 버전이 표시되어 있는지 확인합니다.
  6. 원하는 경우 이름 상자에 프로젝트의 이름을 입력합니다.
  7. 확인을 선택합니다.
  8. 솔루션 탐색기에 새 프로젝트가 표시됩니다.

참조 추가

  1. 솔루션 탐색기에서 프로젝트 이름을 마우스 오른쪽 단추로 클릭한 다음 참조 추가를 선택합니다. 참조 추가 대화 상자가 나타납니다.
  2. 어셈블리 탭의 구성 요소 이름 목록에서 Microsoft.Office.Interop.Excel, 버전 <version>.0.0.0(Office 제품 버전 번호에 대한 자세한 내용은 Microsoft 버전 참조)을 선택하고 Ctrl 키를 누른 상태로 Microsoft.Office.Interop.Word, version <version>.0.0.0을 선택합니다. 어셈블리가 표시되지 않으면 어셈블리를 설치해야 할 수 있습니다(방법: Office 기본 Interop 어셈블리 설치 참조).
  3. 확인을 선택합니다.

필요한 Import 문 또는 using 지시문 추가

솔루션 탐색기에서 ThisAddIn.cs 파일을 마우스 오른쪽 단추로 클릭한 다음 코드 보기를 선택합니다. 코드 파일의 맨 위에 다음 using 지시문(C#)이 아직 없는 경우 추가합니다.

using System.Collections.Generic;
using Excel = Microsoft.Office.Interop.Excel;
using Word = Microsoft.Office.Interop.Word;

은행 계좌 목록 만들기

솔루션 탐색기에서 프로젝트 이름을 마우스 오른쪽 단추로 클릭하고 추가를 선택한 다음 클래스를 선택합니다. 클래스 이름을 Account.cs로 지정합니다. 추가를 선택합니다. Account 클래스 정의를 다음 코드로 바꿉니다. 클래스 정의는 자동으로 구현된 속성을 사용합니다.

class Account
{
    public int ID { get; set; }
    public double Balance { get; set; }
}

두 개의 계정이 포함된 bankAccounts 목록을 만들려면 ThisAddIn.cs에서 ThisAddIn_Startup 메서드에 다음 코드를 추가합니다. 목록 선언은 컬렉션 이니셜라이저를 사용합니다.

var bankAccounts = new List<Account>
{
    new Account
    {
        ID = 345,
        Balance = 541.27
    },
    new Account
    {
        ID = 123,
        Balance = -127.44
    }
};

Excel로 데이터 내보내기

같은 파일에서 ThisAddIn 클래스에 다음 메서드를 추가합니다. 이 메서드는 Excel 통합 문서를 설정하고 데이터를 해당 통합 문서로 내보냅니다.

void DisplayInExcel(IEnumerable<Account> accounts,
           Action<Account, Excel.Range> DisplayFunc)
{
    var excelApp = this.Application;
    // Add a new Excel workbook.
    excelApp.Workbooks.Add();
    excelApp.Visible = true;
    excelApp.Range["A1"].Value = "ID";
    excelApp.Range["B1"].Value = "Balance";
    excelApp.Range["A2"].Select();

    foreach (var ac in accounts)
    {
        DisplayFunc(ac, excelApp.ActiveCell);
        excelApp.ActiveCell.Offset[1, 0].Select();
    }
    // Copy the results to the Clipboard.
    excelApp.Range["A1:B3"].Copy();
}
  • Add 메서드에는 특정 템플릿을 지정하기 위한 선택적 매개 변수가 있습니다. 선택적 매개 변수를 사용하면 매개 변수의 기본값을 사용하려는 경우 해당 매개 변수의 인수를 생략할 수 있습니다. 이전 예제에는 인수가 없으므로 Add(은)는 기본 템플릿을 사용하고 새 통합 문서를 만듭니다. 이전 버전의 C#에서 이와 동일한 문을 사용하려면 자리 표시자 인수인 excelApp.Workbooks.Add(Type.Missing)를 사용해야 했습니다. 자세한 내용은 명명된 인수 및 선택적 인수를 참조하세요.
  • 범위 개체의 RangeOffset 속성은 인덱싱된 속성 기능을 사용합니다. 이 기능을 사용하면 다음과 같은 일반적인 C# 구문을 통해 COM 형식에서 이러한 속성을 사용할 수 있습니다. 또한 인덱싱된 속성에서는 Value 개체의 Range 속성을 사용할 수 있으므로 Value2 속성을 사용할 필요가 없습니다. Value 속성은 인덱싱된 속성이지만 인덱스는 선택 사항입니다. 다음 예제에서는 선택적 인수와 인덱싱된 속성이 함께 사용됩니다.
// Visual C# 2010 provides indexed properties for COM programming.
excelApp.Range["A1"].Value = "ID";
excelApp.ActiveCell.Offset[1, 0].Select();

인덱싱된 속성을 직접 만들 수는 없습니다. 이 기능은 기존 인덱싱된 속성의 사용만을 지원합니다.

열 너비를 콘텐츠에 맞게 조정하려면 DisplayInExcel 끝에 다음 코드를 추가합니다.

excelApp.Columns[1].AutoFit();
excelApp.Columns[2].AutoFit();

여기서 추가하는 코드는 C#의 또 다른 기능, 즉 Office 등의 COM 호스트에서 반환되는 Object 값을 dynamic 형식인 것처럼 처리하는 기능을 보여 줍니다. COM 개체는 Embed Interop Types에 해당 기본값 True(이)가 있는 경우 혹은 동등하게 EmbedInteropTypes 컴파일러 옵션을 사용하여 어셈블리를 참조하는 경우 자동으로 dynamic(으)로 처리됩니다. interop 형식을 포함하는 방법에 대한 자세한 내용은 이 문서의 뒷부분에 있는 "PIA 참조 찾기" 및 "PIA 종속성 복원" 절차를 참조하세요. dynamic에 대한 자세한 내용은 dynamic 또는 dynamic 형식 사용을 참조하세요.

DisplayInExcel 호출

ThisAddIn_StartUp 메서드의 끝에 다음 코드를 추가합니다. DisplayInExcel 호출에는 두 개의 인수가 포함됩니다. 첫 번째 인수는 처리된 계정 목록의 이름입니다. 두 번째 인수는 데이터를 처리하는 방법을 정의하는 여러 줄 람다 식입니다. 각 계좌의 IDbalance 값은 인접 셀에 표시되며 잔액이 0보다 작으면 행은 빨간색으로 표시됩니다. 자세한 내용은 람다 식을 참조하세요.

DisplayInExcel(bankAccounts, (account, cell) =>
// This multiline lambda expression sets custom processing rules
// for the bankAccounts.
{
    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;
    }
});

F5 키를 눌러 프로그램을 실행합니다. 그러면 계좌의 데이터가 포함된 Excel 워크시트가 표시됩니다.

Word 문서 추가

ThisAddIn_StartUp 메서드 끝에 다음 코드를 추가하여 Excel 통합 문서에 대한 링크가 포함된 Word 문서를 만듭니다.

var wordApp = new Word.Application();
wordApp.Visible = true;
wordApp.Documents.Add();
wordApp.Selection.PasteSpecial(Link: true, DisplayAsIcon: true);

이 코드는 C#의 몇 가지 기능, 즉 COM 프로그래밍, 명명된 인수 및 선택적 인수에서 ref 키워드를 생략하는 기능을 보여 줍니다. PasteSpecial 메서드에는 7개의 매개 변수가 있으며 모두 선택적 참조 매개 변수입니다. 명명된 인수와 선택적 인수를 사용하면 액세스할 매개 변수를 이름으로 지정하고 해당 매개 변수에만 인수를 보낼 수 있습니다. 이 예제에서 인수는 클립보드(매개 변수 Link)에 통합 문서에 대한 링크를 만들고 Word 문서에 해당 링크를 아이콘(매개 변수 DisplayAsIcon)으로 표시함을 나타냅니다. 또한 C#을 사용하면 이러한 인수에 대한 ref 키워드를 생략할 수 있습니다.

애플리케이션 실행

F5 키를 눌러 애플리케이션을 실행합니다. Excel이 시작되고 bankAccounts의 두 계좌 정보가 포함된 표가 표시됩니다. 그런 후에 Excel 표의 링크가 포함된 Word 문서가 표시됩니다.

완료된 프로젝트 정리

Visual Studio의 빌드 메뉴에서 솔루션 정리를 선택합니다. 그렇지 않으면 컴퓨터에서 Excel을 열 때마다 추가 기능이 실행됩니다.

PIA 참조 찾기

  1. 애플리케이션을 다시 실행하지만 솔루션 정리는 선택하지 마세요.
  2. 시작을 선택합니다. Microsoft Visual Studio <버전>(을)를 찾고 개발자 명령 프롬프트를 엽니다.
  3. Visual Studio용 개발자 명령 프롬프트 창에 ildasm을 입력하고 Enter 키를 누릅니다. IL DASM 창이 나타납니다.
  4. IL DASM 창의 파일 메뉴에서 파일>열기를 선택합니다. Visual Studio <버전>(을)를 두 번 클릭한 다음 프로젝트를 두 번 클릭합니다. 프로젝트 폴더를 열고 프로젝트 이름.dll에서 bin/Debug 폴더를 확인한 후 프로젝트 이름.dll을 두 번 클릭합니다. 새 창에 프로젝트 특성과 기타 모듈 및 어셈블리에 대한 참조가 표시됩니다. 어셈블리에는 네임스페이스 Microsoft.Office.Interop.ExcelMicrosoft.Office.Interop.Word(이)가 포함되어 있습니다. 기본적으로 Visual Studio에서 컴파일러는 필요한 형식을 참조된 PIA에서 어셈블리로 가져옵니다. 자세한 내용은 방법: 어셈블리 내용 보기를 참조하세요.
  5. MANIFEST 아이콘을 두 번 클릭합니다. 프로젝트가 참조하는 항목이 들어 있는 어셈블리 목록이 포함된 창이 표시됩니다. 목록에 Microsoft.Office.Interop.ExcelMicrosoft.Office.Interop.Word(이)가 없습니다. 프로젝트에 필요한 형식을 어셈블리로 가져왔기 때문에 PIA에 대한 참조를 설치할 필요가 없습니다. 형식을 어셈블리로 가져오면 배포가 더 쉬워집니다. PIA는 사용자의 컴퓨터에 있을 필요가 없습니다. 애플리케이션은 특정 버전의 PIA를 배포할 필요가 없습니다. 필요한 API가 모든 버전에 있는 경우 애플리케이션은 여러 버전의 Office에서 작동할 수 있습니다. PIA를 배포할 필요가 없으므로 이전 버전을 비롯한 여러 Office 버전에서 사용 가능한 애플리케이션을 고급 시나리오에서 만들 수 있습니다. 코드는 작업 중인 Office 버전에서 사용할 수 없는 API를 사용할 수 없습니다. 특정 API를 이전 버전에서 사용할 수 있는지 여부가 항상 명확하지는 않습니다. 이전 버전의 Office를 사용하는 것은 권장되지 않습니다.
  6. 매니페스트 창과 어셈블리 창을 닫습니다.

PIA 종속성 복원

  1. 솔루션 탐색기에서 모든 파일 표시 단추를 선택합니다. References 폴더를 선택한 다음 Microsoft.Office.Interop.Excel을 선택합니다. F4 키를 눌러 속성 창을 표시합니다.
  2. 속성 창에서 Interop 형식 포함 속성을 True에서 False로 변경합니다.
  3. Microsoft.Office.Interop.Word에 대해 이 절차의 1-2단계를 반복합니다.
  4. C#에서 Autofit 메서드 끝의 DisplayInExcel에 대한 두 호출을 주석 처리합니다.
  5. F5 키를 눌러 프로젝트가 제대로 실행되는지 확인합니다.
  6. 이전 절차의 1-3 단계를 반복하여 어셈블리 창을 엽니다. Microsoft.Office.Interop.WordMicrosoft.Office.Interop.Excel이 포함된 어셈블리 목록에 더 이상 표시되지 않습니다.
  7. MANIFEST 아이콘을 두 번 클릭하고 참조되는 어셈블리 목록을 스크롤합니다. Microsoft.Office.Interop.WordMicrosoft.Office.Interop.Excel이 모두 목록에 있음을 확인할 수 있습니다. 애플리케이션은 Excel 및 Word PIA를 참조하고 Embed Interop Types 속성이 False이기 때문에 두 어셈블리가 모두 최종 사용자의 컴퓨터에 있어야 합니다.
  8. Visual Studio의 빌드 메뉴에서 솔루션 정리를 선택하여 완료된 프로젝트를 정리합니다.

참고 항목