본문 바로가기
프로그래밍/C Sharp

[ C# ] 엑셀파일 읽기

by jeong-f 2021. 11. 9.
반응형

프로그램에서 엑셀 파일을 직접적으로 읽어서 화면에 뿌려주어야 할 경우가 있습니다.

엑셀을 읽고  쓰기 위한 패키지인 Microsoft.Office.Interp.Excel 이용한 연동 방법을 설명하고자 합니다.

Microsoft.Office.Interp.Excel 패키지 다운 받기

프로젝트를 생성한 후 [ 솔루션 탐색기 ]에서 [ 참조 ]에 오른쪽 클릭 후 [ NuGet 패키지 관리.. ]를 선택합니다.

설치된 패키지 [ nuget.org ] 선택 후 우측 검색에서 " Microsoft.Office.Interop.Excel "을 입력하면 엑셀 관련 패키지 리스트가 나타납니다.
" Microsoft.Office.Interop.Excel " 중 글자 일부 "Excel"만 검색하여도 관련된 패키지를 찾을 수 있습니다.
리스트가 검색되면 " Microsoft.Office.Interop.Excel "항목의 [ 설치 ]를 눌러 줍니다.

엑셀 패키지가 다운로드가 완료되면  "참조" 항목에  위의 패키지가 다운된 것을 확인할 수 있습니다.
이제 엑셀 파일을 읽을 프로그램 준비가 되었습니다.

엑셀 파일 준비

test.xls파일에 아래와 같이 Sheet를 추가하고 내용을 입력하였습니다.

 

화면 구성

엑셀 파일은 프로그램 실행 경로에 넣어서 별도의 파일 열기 버튼은 추가하지 않고 [ 초기화 ]와 [ 읽기 ] 버튼을 추가하였습니다.

 

설명

엑셀 패키지를  using에 추가합니다.

using Excel = Microsoft.Office.Interop.Excel;

초기화 버튼의 경우 화면을 지우는 역할만 하므로 [ 읽기 버튼 ]의 내용을 아래와 같이 작성합니다.

private void btnRead_Click(object sender, EventArgs e)
        {
            string fileName = string.Format(@"{0}\test.xlsx", Application.StartupPath); //파일 경로
            ReadExcelData(fileName); // 엑셀파일 읽기
        }

먼저 엑셀 객체 삭제 함수를 작성합니다.

void ReleaseObject(object obj)
        {
            try
            {
                if (obj != null)
                {
                    // 객체 메모리 해제
                    Marshal.ReleaseComObject(obj); 
                    obj = null;
                }
            }
            catch (Exception ex)
            {
                obj = null;
                throw ex;
            }
            finally
            {
                GC.Collect();   // 가비지 수집
            }
        }

엑셀 읽기는 각각의 시트를 반복 확인하며 데이터를 리스트에 추가한 후 리스트 뷰에 뿌려주는 코드로 작성하였습니다.

        void ReadExcelData(string fileExcel)
        {
            listBox1.Items.Clear();
            List<string> buff = new List<string>();

            if (File.Exists(fileExcel) == false)
            {
                return;
            }

            Excel.Application excelApp = null;
            Excel.Workbook workBook = null;

            try
            {
                excelApp = new Excel.Application();                             // 엑셀 어플리케이션 생성
                workBook = excelApp.Workbooks.Open(fileExcel,
                    0, 
                    true,
                    5,
                    "", 
                    "", 
                    true,
                    Excel.XlPlatform.xlWindows, 
                    "\t", 
                    false, 
                    false,
                    0, 
                    true, 
                    1, 
                    0);

                // Sheet항목들을 돌아가면서 내용을 확인
                foreach (Excel.Worksheet workSheet in workBook.Worksheets)
                {
                    buff.Add("");
                    buff.Add(workSheet.Name); // 표시용 데이터 추가

                    Excel.Range range = workSheet.UsedRange;    // 사용중인 셀 범위를 가져오기

                    // 가져온 행(row) 만큼 반복
                    for (int row = 1; row <= range.Rows.Count; row++) 
                    {
                        List<string> lstCell = new List<string>();

                        // 가져온 열(row) 만큼 반복
                        for (int column = 1; column <= range.Columns.Count; column++)  
                        {
                            object obj = (range.Cells[row, column] as Excel.Range).Value2;
                            string str = obj.ToString();  // 셀 데이터 가져옴
                            lstCell.Add(str); // 리스트에 할당
                        }

                        buff.Add(string.Join(",", lstCell.ToArray())); // 표시용 데이터 추가
                    }
                }

                object missing = Type.Missing;
                object noSave = false;
                workBook.Close(noSave, missing, missing); // 엑셀 웨크북 종료
                excelApp.Quit();        // 엑셀 어플리케이션 종료
            }
            finally
            {
                ReleaseObject(workBook);
                ReleaseObject(excelApp);
            }

            listBox1.Items.AddRange(buff.ToArray());
        }

실행 결과

각각의 시트 1~ 4를 반복하며 데이터가 들어 있는 부분을 추출하는 결과를 확인할 수 있습니다.

 

데이터 그리드에서 읽고 쓰기(고속 방식)

고속으로 읽고 쓰는 방법이 추가 되었습니다.

2022.11.02 - [프로그래밍/C Sharp] - [ C# ] 데이터 그리드 엑셀로 읽고 쓰기(고속 방식)

 

[ C# ] 데이터 그리드 엑셀로 읽고 고속 저장하기

C#에서 엑셀을 이용하여 DataGrid 항목에 읽고 쓰기를 하기 위한 기본적인 코드를 공유하고자 합니다. DataGrid에서 엑셀을 읽고, 저장은 클립보드 방식으로 일괄 복사 후 저장하는 방식으로 셀단 위

jeong-f.tistory.com

 

반응형

댓글