연습: Office 프로그래밍(C# 및 Visual Basic)
Visual Studio 2010에 Microsoft Office 프로그래밍을 향상시키는 새로운 C# 및 Visual Basic 기능이 도입되었습니다.각 언어에 추가된 기능은 다른 언어에 이미 있는 기능입니다.
새로운 C# 기능에는 명명된 인수, 선택적 인수, dynamic 형식의 반환 값, COM 프로그래밍에서 ref 키워드를 생략하는 기능과 인덱싱된 속성에 액세스하는 기능 등이 있습니다.새로운 Visual Basic 기능에는 자동 구현 속성, 람다 식의 문 및 컬렉션 이니셜라이저가 있습니다.
두 언어에서 모두 형식 정보를 포함할 수 있으므로 PIA(주 Interop 어셈블리)를 사용자의 컴퓨터에 배포하지 않고도 COM 구성 요소와 상호 작용하는 어셈블리를 배포할 수 있습니다.자세한 내용은 연습: 관리되는 어셈블리의 형식 포함(C# 및 Visual Basic)을 참조하십시오.
이 연습에서는 Office 프로그래밍과 관련하여 새로운 기능을 설명하지만 이 중 많은 기능이 일반 프로그래밍에서도 유용합니다.먼저 Excel 추가 기능 응용 프로그램을 사용하여 Excel 통합 문서를 만듭니다.그런 다음 해당 통합 문서에 대한 링크를 포함하는 Word 문서를 만듭니다.마지막으로 PIA 종속성을 설정하고 해제하는 방법을 살펴봅니다.
사전 요구 사항
이 연습을 수행하려면 Microsoft Office Excel 2010 또는 2007 및 Microsoft Office Word 2010 또는 2007이 컴퓨터에 설치되어 있어야 합니다.
Windows Vista 이전의 운영 체제를 사용 중인 경우 .NET Framework 2.0이 설치되어 있어야 합니다.
[!참고]
다음 지침처럼 컴퓨터에서 Visual Studio 사용자 인터페이스 요소 일부에 대한 이름이나 위치를 다르게 표시할 수 있습니다. 이러한 요소는 사용하는 Visual Studio 버전 및 설정에 따라 결정됩니다. 자세한 내용은 Visual Studio 설정을 참조하십시오.
Excel 추가 기능 응용 프로그램을 설치하려면
Visual Studio를 시작합니다.
파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트를 클릭합니다.
설치된 템플릿 창에서 Visual Basic이나 **Visual C#**을 확장하고 Office를 확장한 다음 2010(Office 2007을 사용 중인 경우에는 2007)을 클릭합니다.
템플릿 창에서 Excel 2010 추가 기능 또는 Excel 2007 추가 기능을 클릭합니다.
템플릿 창의 맨 위에 있는 대상 프레임워크 상자에 .NET Framework 4가 표시되는지 확인합니다.
필요에 따라 이름 상자에 프로젝트 이름을 입력합니다.
확인을 클릭합니다.
솔루션 탐색기에 새 프로젝트가 나타납니다.
참조를 추가하려면
솔루션 탐색기에서 프로젝트 이름을 마우스 오른쪽 단추로 클릭하고 참조 추가를 클릭합니다.참조 추가 대화 상자가 나타납니다.
.NET 탭의 구성 요소 이름 목록에서 Microsoft.Office.Interop.Excel, 버전 14.0.0.0(Excel 2007의 경우 버전 12.0.0.0)을 선택하고 Ctrl 키를 누른 채로 Microsoft.Office.Interop.Word, 버전 14.0.0.0(Word 2007의 경우 버전 12.0.0.0)을 선택합니다.
확인을 클릭합니다.
필요한 Imports 문 또는 using 지시문을 추가하려면
솔루션 탐색기에서 ThisAddIn.vb 또는 ThisAddIn.cs 파일을 마우스 오른쪽 단추로 클릭하고 코드 보기를 클릭합니다.
다음 Imports 문(Visual Basic) 또는 using 지시문(C#)이 없는 경우 코드 파일 맨 위에 해당 내용을 추가합니다.
Imports Microsoft.Office.Interop
using System.Collections.Generic; using Excel = Microsoft.Office.Interop.Excel; using Word = Microsoft.Office.Interop.Word;
은행 계정 목록을 만들려면
솔루션 탐색기에서 프로젝트 이름을 마우스 오른쪽 단추로 클릭하고 추가를 클릭한 다음 클래스를 클릭합니다.Visual Basic을 사용 중인 경우 클래스 이름을 Account.vb로 지정하고, C#을 사용 중인 경우 클래스 이름을 Account.cs로 지정합니다.추가를 클릭합니다.
Account 클래스의 정의를 다음 코드로 바꿉니다.Visual Studio 2010에서 Visual Basic에 새로 추가된 자동 구현 속성이 클래스 정의에 사용됩니다.자세한 내용은 자동 구현 속성(Visual Basic)을 참조하십시오.
Public Class Account Property ID As Integer = -1 Property Balance As Double End Class
class Account { public int ID { get; set; } public double Balance { get; set; } }
두 계정을 포함하는 bankAccounts 목록을 만들려면 다음 코드를 ThisAddIn.vb 또는 ThisAddIn.cs의 ThisAddIn_Startup 메서드에 추가합니다.Visual Studio 2010에서 Visual Basic에 새로 추가된 컬렉션 이니셜라이저가 목록 선언에 사용됩니다.자세한 내용은 컬렉션 이니셜라이저(Visual Basic)을 참조하십시오.
Dim bankAccounts As New List(Of Account) From { New Account With { .ID = 345, .Balance = 541.27 }, New Account With { .ID = 123, .Balance = -127.44 } }
var bankAccounts = new List<Account> { new Account { ID = 345, Balance = 541.27 }, new Account { ID = 123, Balance = -127.44 } };
Excel로 데이터를 내보내려면
동일한 파일에서 다음 메서드를 ThisAddIn 클래스에 추가합니다.이 메서드는 Excel 통합 문서를 만들고 데이터를 해당 통합 문서로 내보냅니다.
Sub DisplayInExcel(ByVal accounts As IEnumerable(Of Account), ByVal DisplayAction As Action(Of Account, Excel.Range)) With Me.Application ' Add a new Excel workbook. .Workbooks.Add() .Visible = True .Range("A1").Value = "ID" .Range("B1").Value = "Balance" .Range("A2").Select() For Each ac In accounts DisplayAction(ac, .ActiveCell) .ActiveCell.Offset(1, 0).Select() Next ' Copy the results to the Clipboard. .Range("A1:B3").Copy() End With End Sub
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(); }
이 메서드에는 두 가지 새로운 C# 기능이 사용됩니다.두 기능 모두 Visual Basic에 이미 있는 기능입니다.
Add 메서드에는 특정 템플릿을 지정하기 위한 선택적 매개 변수가 있습니다.Visual C# 2010에 새로 도입된 이 선택적 매개 변수를 사용하면 매개 변수에 대한 인수를 생략하여 매개 변수의 기본값을 사용할 수 있습니다.앞의 예제에서 인수가 전달되지 않기 때문에 Add에서는 기본 템플릿을 사용하여 새 통합 문서를 만듭니다.이에 상응하는 문을 이전 버전의 C#에서 작성하려면 자리 표시자 매개 변수 excelApp.Workbooks.Add(Type.Missing)가 필요합니다.
자세한 내용은 명명된 인수와 선택적 인수(C# 프로그래밍 가이드)을 참조하십시오.
Range 개체의 Range 및 Offset 속성에는 인덱싱된 속성 기능이 사용됩니다.이 기능을 사용하면 다음과 같이 일반적인 C# 구문으로 COM 형식에서 이러한 속성을 사용할 수 있습니다.인덱싱된 속성을 통해 Range 개체의 Value 속성을 사용하면 Value2 속성을 사용할 필요가 없습니다.Value는 인덱싱된 속성이지만 인덱스는 선택적 요소입니다.다음 예제에서는 선택적 인수와 인덱싱된 속성을 함께 사용합니다.
// Visual C# 2010 provides indexed properties for COM programming. excelApp.Range["A1"].Value = "ID"; excelApp.ActiveCell.Offset[1, 0].Select();
이전 버전의 언어에서는 다음과 같은 특수한 구문이 필요합니다.
// In Visual C# 2008, you cannot access the Range, Offset, and Value // properties directly. excelApp.get_Range("A1").Value2 = "ID"; excelApp.ActiveCell.get_Offset(1, 0).Select();
인덱싱된 속성을 직접 만들 수 없습니다.이 기능으로는 기존의 인덱싱된 속성만 사용할 수 있습니다.
자세한 내용은 방법: COM Interop 프로그래밍에서 인덱싱된 속성 사용(C# 프로그래밍 가이드)을 참조하십시오.
DisplayInExcel의 끝에 다음 코드를 추가하여 내용에 맞게 열 너비를 조정합니다.
' Add the following two lines at the end of the With statement. .Columns(1).AutoFit() .Columns(2).AutoFit()
excelApp.Columns[1].AutoFit(); excelApp.Columns[2].AutoFit();
이러한 추가 부분은 Office 등의 COM 호스트에서 반환된 Object 값을 동적 형식으로 처리하는 C# 2010의 또 다른 새 기능을 보여 줍니다.Interop 형식 포함이 기본값인 True로 설정된 경우나 /link 컴파일러 옵션에서 어셈블리를 참조하는 경우 자동으로 이 기능이 실행됩니다.dynamic 형식으로 런타임에 바인딩을 사용할 수 있으며 Visual C# 2008 및 이전 버전에 필요한 명시적 캐스팅을 방지할 수 있습니다. 참고로 런타임에 바인딩은 Visual Basic에서 이미 제공하는 기능입니다.
예를 들어, excelApp.Columns[1] 반환 된 Object, 및 AutoFit Excel입니다 범위 메서드.dynamic을 사용하지 않는 경우에는 AutoFit 메서드를 호출하기 전에 excelApp.Columns[1]에서 반환된 개체를 Range의 인스턴스로 캐스팅해야 합니다.
// Casting is required in Visual C# 2008. ((Excel.Range)excelApp.Columns[1]).AutoFit(); // Casting is not required in Visual C# 2010. excelApp.Columns[1].AutoFit();
interop 형식 포함에 대한 자세한 내용은 이 항목의 뒷부분에 나오는 "PIA 참조를 찾으려면" 및 "PIA 종속성을 복원하려면" 절차를 참조하십시오.dynamic에 대한 자세한 내용은 dynamic(C# 참조) 또는 dynamic 형식 사용(C# 프로그래밍 가이드)을 참조하십시오.
DisplayInExcel을 호출하려면
ThisAddIn_StartUp 메서드의 끝에 다음 코드를 추가합니다.DisplayInExcel에 대한 호출에는 두 개의 인수가 포함됩니다.첫 번째 인수는 처리할 계정 목록의 이름입니다.두 번째 인수는 데이터 처리 방식을 정의하는 여러 줄 람다 식입니다.각 계정에 대한 ID 및 balance 값이 인접 셀에 표시되고 잔액이 0 미만이면 행이 빨간색으로 표시됩니다.여러 줄 람다 식은 Visual Basic 2000에 새로 추가된 기능입니다.자세한 내용은 람다 식(Visual Basic)을 참조하십시오.
DisplayInExcel(bankAccounts, Sub(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 Then cell.Interior.Color = RGB(255, 0, 0) cell.Offset(0, 1).Interior.Color = RGB(255, 0, 0) End If End Sub)
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 문서를 만듭니다.
Dim wordApp As New Word.Application wordApp.Visible = True wordApp.Documents.Add() wordApp.Selection.PasteSpecial(Link:=True, DisplayAsIcon:=True)
var wordApp = new Word.Application(); wordApp.Visible = true; wordApp.Documents.Add(); wordApp.Selection.PasteSpecial(Link: true, DisplayAsIcon: true);
이 코드는 새로운 C# 기능인 명명된 인수, 선택적 인수 및 COM 프로그래밍에서 ref 키워드를 생략하는 기능을 보여 줍니다.이들 모두 Visual Basic에 이미 있는 기능입니다.PasteSpecial 메서드에 선택적 참조 매개 변수로 정의 되는 매개 변수 7 개가 있습니다.Visual C# 2010 이전에는 전달할 의미 있는 값이 없는 경우에도 7개 매개 변수의 인수로 사용할 개체 변수를 정의해야 했습니다.명명된 인수와 선택적 인수를 사용하면 이름으로 액세스할 매개 변수를 지정하고 해당 매개 변수에만 인수를 전달할 수 있습니다.이 예제에서는 통합 문서에 대한 링크를 클립보드에 만들어야 하고(매개 변수 Link) 해당 링크를 Word 문서에 아이콘으로 표시해야 함(매개 변수 DisplayAsIcon)을 나타내기 위해 인수가 전달됩니다.Visual C# 2010에서는 이러한 인수에 대해 ref 키워드를 생략할 수도 있습니다.Visual C# 2008의 다음 코드 세그먼트와 Visual C# 2010에 필요한 한 줄을 비교해 보십시오.
// Call to PasteSpecial in Visual C# 2008. object iconIndex = Type.Missing; object link = true; object placement = Type.Missing; object displayAsIcon = true; object dataType = Type.Missing; object iconFileName = Type.Missing; object iconLabel = Type.Missing; wordApp.Selection.PasteSpecial(ref iconIndex, ref link, ref placement, ref displayAsIcon, ref dataType, ref iconFileName, ref iconLabel); // Call to PasteSpecial in Visual C# 2010. wordApp.Selection.PasteSpecial(Link: true, DisplayAsIcon: true);
응용 프로그램을 실행하려면
- F5 키를 눌러 응용 프로그램을 실행합니다.Excel이 시작되고 bankAccounts에 있는 두 계정의 정보를 포함하는 표가 표시됩니다.그런 다음 Excel 표에 대한 링크를 포함하는 Word 문서가 나타납니다.
완료된 프로젝트를 정리하려면
- Visual Studio의 빌드 메뉴에서 솔루션 정리를 클릭합니다.그러지 않으면 컴퓨터에서 Excel을 열 때마다 해당 추가 기능이 실행됩니다.
PIA 참조를 찾으려면
응용 프로그램을 다시 실행하되 솔루션 정리를 클릭하지 않습니다.
시작 메뉴에서 모든 프로그램을 클릭합니다.그런 다음 Microsoft Visual Studio 2010, Visual Studio Tools 및 **Visual Studio 명령 프롬프트(2010)**를 차례로 클릭합니다.
Visual Studio 명령 프롬프트(2010) 창에서 ildasm을 입력하고 Enter 키를 누릅니다.IL DASM 창이 나타납니다.
IL DASM 창의 파일 메뉴에서 열기를 클릭합니다.Visual Studio 2010을 두 번 클릭하고 프로젝트를 두 번 클릭합니다.프로젝트의 폴더를 열고 bin/Debug 폴더에서 프로젝트 이름.dll을 찾습니다.프로젝트 이름.dll을 두 번 클릭합니다.새 창에 프로젝트의 특성과 다른 모듈 및 어셈블리에 대한 참조가 표시됩니다.네임스페이스 Microsoft.Office.Interop.Excel과 Microsoft.Office.Interop.Word는 어셈블리 안에 포함되어 있습니다.기본적으로 Visual Studio 2010에서는 컴파일러가 참조된 PIA에서 어셈블리로 필요한 형식을 가져옵니다.
자세한 내용은 방법: 어셈블리 내용 보기을 참조하십시오.
MANIFEST 아이콘을 두 번 클릭합니다.프로젝트에서 참조하는 항목을 포함하는 어셈블리 목록이 표시된 창이 나타납니다.Microsoft.Office.Interop.Excel 및 Microsoft.Office.Interop.Word는 목록에 포함되어 있지 않습니다.프로젝트에 필요한 형식을 어셈블리로 가져왔기 때문에 PIA에 대한 참조가 필요하지 않습니다.따라서 배포가 훨씬 더 쉬워집니다.사용자 컴퓨터에 PIA가 없어도 되며, 응용 프로그램에서 특정 PIA 버전의 배포를 필요로 하지 않으므로 필요한 API가 모든 버전에 있는 경우 여러 버전의 Office에서 작동하도록 응용 프로그램을 디자인할 수 있습니다.
PIA 배포가 더 이상 필요하지 않으므로 이전 버전을 비롯한 여러 버전의 Office를 대상으로 하는 고급 시나리오에서 응용 프로그램을 만들 수 있습니다.단, 사용 중인 Office 버전에서 제공하지 않는 API가 코드에 사용되지 않아야 합니다.경우에 따라서는 특정 API를 이전 버전에서 사용할 수 있는지 여부를 명확히 알 수 없으므로 이전 버전의 Office는 사용하지 않는 것이 좋습니다.
[!참고]
Office 2003 이전 버전에서는 PIA를 게시하지 않았습니다.따라서 Office 2003 이전 버전에 대한 interop 어셈블리를 생성하는 유일한 방법은 COM 참조를 가져오는 것뿐입니다.
매니페스트 창과 어셈블리 창을 닫습니다.
PIA 종속성을 복원하려면
솔루션 탐색기에서 모든 파일 표시 단추를 클릭합니다.References 폴더를 확장하고 Microsoft.Office.Interop.Excel을 선택합니다.속성 창을 표시하려면 F4 키를 누릅니다.
속성 창에서 Interop 형식 포함 속성을 True에서 False로 변경합니다.
Microsoft.Office.Interop.Word에 대해 이 절차의 1단계와 2단계를 반복합니다.
C#에서는 DisplayInExcel 메서드 끝에 있는 Autofit에 대한 두 호출을 주석으로 처리합니다.
F5 키를 눌러 프로젝트가 제대로 실행되는지 확인합니다.
이전 절차의 1-3단계를 반복하여 어셈블리 창을 엽니다.이제 포함된 어셈블리의 목록에 Microsoft.Office.Interop.Word와 Microsoft.Office.Interop.Excel이 없음을 확인합니다.
MANIFEST 아이콘을 두 번 클릭하고 참조된 어셈블리의 목록을 스크롤합니다.Microsoft.Office.Interop.Word와Microsoft.Office.Interop.Excel이 둘 다 목록에 있습니다.응용 프로그램에서 Excel 및 Word PIA를 참조하고 Interop 형식 포함 속성이 False로 설정되었기 때문에 두 어셈블리가 최종 사용자의 컴퓨터에 있어야 합니다.
Visual Studio의 빌드 메뉴에서 솔루션 정리를 클릭하여 완성된 프로젝트를 정리합니다.
참고 항목
작업
방법: COM Interop 프로그래밍에서 인덱싱된 속성 사용(C# 프로그래밍 가이드)
연습: Microsoft Office 어셈블리의 형식 정보 포함(C# 및 Visual Basic)
연습: 관리되는 어셈블리의 형식 포함(C# 및 Visual Basic)
연습: Excel용 첫 응용 프로그램 수준 추가 기능 만들기
참조
개념
초기 바인딩 및 런타임에 바인딩(Visual Basic)