Microsoft Visual C#.NET에서 Microsoft Excel을 자동화하는 방법

요약

이 문서에서는 Microsoft Visual C# .NET을 사용하여 Microsoft Excel용 Automation 클라이언트를 만드는 방법을 보여 줍니다.

추가 정보

Automation은 Visual C# .NET과 같은 언어로 작성된 애플리케이션이 프로그래밍 방식으로 다른 애플리케이션을 제어할 수 있도록 허용하는 프로세스입니다. Excel에 자동화를 사용하면 새 통합 문서 만들기, 통합 문서에 데이터 추가 또는 차트 만들기와 같은 작업을 수행할 수 있습니다. Excel 및 기타 Microsoft Office 응용 프로그램을 사용하면 사용자 인터페이스를 통해 수동으로 수행할 수 있는 거의 모든 작업을 Automation을 사용하여 프로그래밍 방식으로 수행할 수 있습니다.

Excel은 개체 모델을 통해 이 프로그래밍 기능을 노출합니다. 개체 모델은 Excel의 논리적 구성 요소에 대응하는 클래스 및 메서드의 컬렉션입니다. 예를 들어 Application 개체, 통합 문서 개체 및 워크시트 개체가 있으며 각 개체에는 이러한 Excel의 기능이 포함됩니다. Visual C# .NET에서 개체 모델에 액세스하려면 형식 라이브러리에 대한 프로젝트 참조를 설정할 수 있습니다.

이 문서에서는 Visual C# .NET용 Excel 형식 라이브러리에 대한 적절한 프로젝트 참조를 설정하는 방법을 보여 줍니다. Excel을 자동화하는 샘플 코드를 제공합니다.

Microsoft Excel용 Automation 클라이언트 만들기

  1. Microsoft Visual Studio .NET을 시작합니다.

  2. [파일] 메뉴에서 [새로 만들기]를 클릭한 다음 [프로젝트]를 클릭합니다. Visual C# 프로젝트 형식에서 Windows 애플리케이션을 선택합니다. Form1은 기본적으로 만들어집니다.

  3. Microsoft Excel 개체 라이브러리에 대한 참조를 추가합니다. 이렇게 하려면 다음과 같이 하십시오.

    1. 프로젝트 메뉴에서 참조 추가를 클릭합니다.
    2. COM 탭에서 Microsoft Excel 개체 라이브러리를 찾아 선택을 클릭합니다.

    참고 Microsoft Office 2003에는 IA(기본 Interop 어셈블리)가 포함되어 있습니다. Microsoft Office XP에는 PIA가 포함되지 않지만 다운로드할 수 있습니다.

    1. [참조 추가] 대화 상자에서 [확인]을 클릭하여 선택 내용을 적용합니다. 선택한 라이브러리에 대한 래퍼를 생성하라는 메시지가 표시되면 [예]를 클릭합니다.
  4. 보기 메뉴에서 도구 상자를 선택하여 도구 상자를 표시한 다음 Form1에 단추를 추가합니다.

  5. Button1을 두 번 클릭합니다. 양식의 코드 창이 나타납니다.

  6. 코드 창에서 다음 코드를 바꿉 있습니다.

    private void button1_Click(object sender, System.EventArgs e)
    {
    }
    

    with:

    private void button1_Click(object sender, System.EventArgs e)
    {
    Excel.Application oXL;
    Excel._Workbook oWB;
    Excel._Worksheet oSheet;
    Excel.Range oRng;
    
    try
    {
    //Start Excel and get Application object.
    oXL = new Excel.Application();
    oXL.Visible = true;
    
    //Get a new workbook.
    oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));
    oSheet = (Excel._Worksheet)oWB.ActiveSheet;
    
    //Add table headers going cell by cell.
    oSheet.Cells[1, 1] = "First Name";
    oSheet.Cells[1, 2] = "Last Name";
    oSheet.Cells[1, 3] = "Full Name";
    oSheet.Cells[1, 4] = "Salary";
    
    //Format A1:D1 as bold, vertical alignment = center.
    oSheet.get_Range("A1", "D1").Font.Bold = true;
    oSheet.get_Range("A1", "D1").VerticalAlignment = 
    Excel.XlVAlign.xlVAlignCenter;
    
    // Create an array to multiple values at once.
    string[,] saNames = new string[5,2];
    
    saNames[ 0, 0] = "John";
    saNames[ 0, 1] = "Smith";
    saNames[ 1, 0] = "Tom";
    saNames[ 1, 1] = "Brown";
    saNames[ 2, 0] = "Sue";
    saNames[ 2, 1] = "Thomas";
    saNames[ 3, 0] = "Jane";
    saNames[ 3, 1] = "Jones";
    saNames[ 4, 0] = "Adam";
    saNames[ 4, 1] = "Johnson";
    
    //Fill A2:B6 with an array of values (First and Last Names).
         oSheet.get_Range("A2", "B6").Value2 = saNames;
    
    //Fill C2:C6 with a relative formula (=A2 & " " & B2).
    oRng = oSheet.get_Range("C2", "C6");
    oRng.Formula = "=A2 & \" \" & B2";
    
    //Fill D2:D6 with a formula(=RAND()*100000) and apply format.
    oRng = oSheet.get_Range("D2", "D6");
    oRng.Formula = "=RAND()*100000";
    oRng.NumberFormat = "$0.00";
    
    //AutoFit columns A:D.
    oRng = oSheet.get_Range("A1", "D1");
    oRng.EntireColumn.AutoFit();
    
    //Manipulate a variable number of columns for Quarterly Sales Data.
    DisplayQuarterlySales(oSheet);
    
    //Make sure Excel is visible and give the user control
    //of Microsoft Excel's lifetime.
    oXL.Visible = true;
    oXL.UserControl = true;
    }
    catch( Exception theException ) 
    {
    String errorMessage;
    errorMessage = "Error: ";
    errorMessage = String.Concat( errorMessage, theException.Message );
    errorMessage = String.Concat( errorMessage, " Line: " );
    errorMessage = String.Concat( errorMessage, theException.Source );
    
    MessageBox.Show( errorMessage, "Error" );
    }
    }
    
    private void DisplayQuarterlySales(Excel._Worksheet oWS)
    {
    Excel._Workbook oWB;
    Excel.Series oSeries;
    Excel.Range oResizeRange;
    Excel._Chart oChart;
    String sMsg;
    int iNumQtrs;
    
    //Determine how many quarters to display data for.
    for( iNumQtrs = 4; iNumQtrs >= 2; iNumQtrs--)
    {
    sMsg = "Enter sales data for ";
    sMsg = String.Concat( sMsg, iNumQtrs );
    sMsg = String.Concat( sMsg, " quarter(s)?");
    
    DialogResult iRet = MessageBox.Show( sMsg, "Quarterly Sales?", 
    MessageBoxButtons.YesNo );
    if (iRet == DialogResult.Yes)
    break;
    }
    
    sMsg = "Displaying data for ";
    sMsg = String.Concat( sMsg, iNumQtrs );
    sMsg = String.Concat( sMsg, " quarter(s)." );
    
    MessageBox.Show( sMsg, "Quarterly Sales" );
    
    //Starting at E1, fill headers for the number of columns selected.
    oResizeRange = oWS.get_Range("E1", "E1").get_Resize( Missing.Value, iNumQtrs);
    oResizeRange.Formula = "=\"Q\" & COLUMN()-4 & CHAR(10) & \"Sales\"";
    
    //Change the Orientation and WrapText properties for the headers.
    oResizeRange.Orientation = 38;
    oResizeRange.WrapText = true;
    
    //Fill the interior color of the headers.
    oResizeRange.Interior.ColorIndex = 36;
    
    //Fill the columns with a formula and apply a number format.
    oResizeRange = oWS.get_Range("E2", "E6").get_Resize( Missing.Value, iNumQtrs);
    oResizeRange.Formula = "=RAND()*100";
    oResizeRange.NumberFormat = "$0.00";
    
    //Apply borders to the Sales data and headers.
    oResizeRange = oWS.get_Range("E1", "E6").get_Resize( Missing.Value, iNumQtrs);
    oResizeRange.Borders.Weight = Excel.XlBorderWeight.xlThin;
    
    //Add a Totals formula for the sales data and apply a border.
    oResizeRange = oWS.get_Range("E8", "E8").get_Resize( Missing.Value, iNumQtrs);
    oResizeRange.Formula = "=SUM(E2:E6)";
    oResizeRange.Borders.get_Item( Excel.XlBordersIndex.xlEdgeBottom ).LineStyle 
    = Excel.XlLineStyle.xlDouble;
    oResizeRange.Borders.get_Item( Excel.XlBordersIndex.xlEdgeBottom ).Weight 
    = Excel.XlBorderWeight.xlThick;
    
    //Add a Chart for the selected data.
    oWB = (Excel._Workbook)oWS.Parent;
    oChart = (Excel._Chart)oWB.Charts.Add( Missing.Value, Missing.Value, 
    Missing.Value, Missing.Value );
    
    //Use the ChartWizard to create a new chart from the selected data.
    oResizeRange = oWS.get_Range("E2:E6", Missing.Value ).get_Resize( 
    Missing.Value, iNumQtrs);
    oChart.ChartWizard( oResizeRange, Excel.XlChartType.xl3DColumn, Missing.Value,
    Excel.XlRowCol.xlColumns, Missing.Value, Missing.Value, Missing.Value, 
    Missing.Value, Missing.Value, Missing.Value, Missing.Value );
    oSeries = (Excel.Series)oChart.SeriesCollection(1);
    oSeries.XValues = oWS.get_Range("A2", "A6");
    for( int iRet = 1; iRet <= iNumQtrs; iRet++)
    {
    oSeries = (Excel.Series)oChart.SeriesCollection(iRet);
    String seriesName;
    seriesName = "=\"Q";
    seriesName = String.Concat( seriesName, iRet );
    seriesName = String.Concat( seriesName, "\"" );
    oSeries.Name = seriesName;
    }  
    
    oChart.Location( Excel.XlChartLocation.xlLocationAsObject, oWS.Name );
    
    //Move the chart so as not to cover your data.
    oResizeRange = (Excel.Range)oWS.Rows.get_Item(10, Missing.Value );
    oWS.Shapes.Item("Chart 1").Top = (float)(double)oResizeRange.Top;
    oResizeRange = (Excel.Range)oWS.Columns.get_Item(2, Missing.Value );
    oWS.Shapes.Item("Chart 1").Left = (float)(double)oResizeRange.Left;
    }
    
    
  7. 코드 창의 맨 위로 스크롤합니다. using 지시문 목록의 끝에 다음 줄을 추가합니다.

    using Excel = Microsoft.Office.Interop.Excel;
    using System.Reflection; 
    

Automation 클라이언트 테스트

  1. F5 키를 눌러 프로그램을 빌드하고 실행합니다.
  2. 폼에서 Button1을 클릭합니다. 프로그램은 Excel을 시작하고 새 워크시트의 데이터를 채웁니다.
  3. 분기별 판매 데이터를 입력하라는 메시지가 표시되면 [예]를 클릭합니다. 분기별 데이터에 연결된 차트가 워크시트에 추가됩니다.

참조

자세한 내용은 MSDN(Microsoft Developer Network) 웹 사이트를 참조하세요.