본문 바로가기

IT/Visual Studio

[C#] 엑셀 제어


Excel Object Library를 이용하는 방법에 대하여 살펴보도록 하자.

  

우선, Reference - COM 탭에서 해당 Excel 라이브러리를 등록하여주자.

 

시스템마다 다르겠지만 Microsoft Excel 11.0 Object Library 이런 이름일 것이다.

 

 

이를 추가해주면 이제 Excel.Application과 같은 클래스를 사용할 수 있게 된다.

 

 

        private Excel.Application exlApp = null;
        private Excel.Workbook exlWorkBook = null;
        private Excel.Worksheet exlWorkSheet = null;
        private Excel.Sheets exlSheets = null;
        private Excel.Range exlRange = null;
       
        private string strExcelFile;
        private bool bConnectExcel=false;

 

        private void Init_Excel()
        {
            strExcelFile = Application.StartupPath + @"\EXCEL\REPORT.xls";
            exlApp = new Excel.Application();
            try
            {
                exlWorkBook = (Excel.Workbook)(exlApp.Workbooks.Open(strExcelFile, Type.Missing, Type.Missing,
                               Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                               Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing));
                bConnectExcel = true;
            }
            catch(Exception)
            {
                bConnectExcel = false;               
            }

            if(!bConnectExcel)
            {
                MessageBox.Show("해당 Excel파일을 열수 없습니다.!!");
                Application.Exit();
            }

            exlSheets = exlWorkBook.Sheets;
            exlWorkSheet = (Excel.Worksheet)exlSheets.get_Item("레포트3");

            //exlApp.Visible = true; // 해당 Excel화일 보여주기

            tsslblCurConnect.Text = "Excel File 연결성공!!";
        }

 

 

위코드는 특정 Excel화일을 열고 있는 모습이다.

 

여기에서

 

exlWorkSheet = (Excel.Worksheet)exlSheets.get_Item("레포트3");

 

이부분이 해당 Sheet이름을 설정하는 부분인데.. Sheet이름을 알고있다면 위와같이 써주어도 되고

모르면 숫자로 써넣어도 된다.

 

exlWorkSheet = (Excel.Worksheet)exlSheets.get_Item(1);

 

이것은 해당 Excel화일의 첫번째 Sheet를 설정한 모습이다.

 

 

여기까지 설정하였다면 값을 가져오는건 쉽다.

 

        SearchExcel("A2");
        public void SearchExcel(string strPCell)
        {
            exlRange = (Excel.Range)exlWorkSheet.get_Range(strPCell, Type.Missing);
            MessageBox.Show((string)exlRange.Text);
        }

 

단순히 위와같이 특정 셀의 값을 get_Range()로 가져오면 끝이다.

 

 

자, 이제 Excel화일을 닫아주는 부분을 한번 보자.

 

        public void CloseExcel()
        {
            if(exlWorkBook != null)
            {
                exlWorkBook.Close(true, strExcelFile, Type.Missing);
                exlWorkBook = null;
            }

            if(exlApp !=null)
            {
                exlApp.Quit();
                exlApp = null;
            }

            // 엑셀종료
            System.Diagnostics.Process[] excelProcess;
            excelProcess = System.Diagnostics.Process.GetProcessesByName("EXCEL");

            foreach (System.Diagnostics.Process process in excelProcess)
            {
                process.Kill();
            }

        }

 

WorkBook, ExcelApplication을 닫아주고 개체를 해제하는모습인데..

한가지 주의할점은 해당 Excel 프로세스가 계속 남아있게 된다는 것이다.

 

하여, 프로세스에 남아있는 이 EXCEL.exe를 없애 주는 작업도 빼먹지 말고 해주자...

 

 

 

마지막으로 해당 특정 셀에 값을 써넣는 것을 한번 보자.

 

        private void btnInsertData_Click(object sender, EventArgs e)
        {
            InsertExcel(5,5,"5555");
        }

        public void InsertExcel(int intPRow, int intPColumn, string strValue)
        {
            exlRange = (Excel.Range)exlWorkSheet.get_Range("A1", Type.Missing);

            if (intPColumn <= 0)
            {
                MessageBox.Show("Colomn을 0보다 큰값으로 주세요!!");
                return;
            }

            if (intPRow <= 0)
            {
                MessageBox.Show("Row를 0보다 큰값으로 주세요!!");
                return;
            }
            exlRange.Cells.set_Item(intPRow, intPColumn, strValue);
        }

 

 

값을 주는것은 exlRange.Cells.set_Item()함수를 이용하면 되는데..

 

여기에서 get_Range로 기준이 되는 Range값 설정해주고,

해당 기준값에서 부터 intPRow, intPColumn값 떨어진 셀에 strValue값을 쓰면 된다.

 

 

마지막으로 엑셀에서 값을 바꾸고 종료하게되면

저장하겠냐는 메세지 박스가 자동으로 뜨게 되는데 이것을 방지하려면 다음과 같이 해주면 된다.

 

 

        public void CloseExcel()
        {
            if(exlWorkBook != null)
            {
                exlWorkBook.Save();
                exlWorkBook.Close(false, strExcelFile, Type.Missing);
                exlWorkBook = null;
            }

            if(exlApp !=null)
            {
                exlApp.Quit();
                exlApp = null;
            }

            // 엑셀종료
            System.Diagnostics.Process[] excelProcess;
            excelProcess = System.Diagnostics.Process.GetProcessesByName("EXCEL");

            foreach (System.Diagnostics.Process process in excelProcess)
            {
                process.Kill();
            }
        }

 

CloseExcel()이란 함수입니다.

 

Excel작업을 끝내고 종료할때 호출되는 함수인데요

 

여기에서보면 Save()한후에 Close()해주고 있음을 알수있습니다.

 

이렇게 하면 대화상자가 안뜰겁니다...