[로봇활용_12주차] C#으로 엑셀 다루기

최윤호·2025년 11월 1일
post-thumbnail

C#으로 엑셀을 다루는 3가지 방법

C#에서 엑셀을 다루는 방법은 여러 가지가 있는데요,
처음 접하면 어떤 방법을 써야 할지 막막하게 느껴질 수 있습니다.
이번 포스팅에서는 C#에서 엑셀을 제어하는 대표적인 3가지 방법을 알아보고,
각각의 장단점과 어떤 상황에 어떤 방법을 선택해야 할지 정리해 드릴게요!

1)강력한 형식(Strongly-Typed)

가장 전통적이고 근본적인 방법입니다. 'COM Interop'이라는 기술을 사용해
우리 컴퓨터에 설치된 실제 Excel 프로그램을 직접 제어하는 방식이죠.
이 방법의 가장 큰 장점은 Visual Studio의 자동 완성(IntelliSense) 기능
활용하며 엑셀의 객체 모델을 학습할 수 있다는 점입니다.
엑셀이 어떻게 구성되어 있는지 자연스럽게 익힐 수 있죠.

엑셀 객체 모델(Excel Object Model)이란?
엑셀을 구성하는 요소들을 계층적인 구조로 표현한 것입니다.
이 구조만 이해하면 엑셀의 모든 기능을 코드로 제어할 수 있어요.
Application(엑셀 앱) > Workbooks(열려있는 모든 파일) > Workbook(특정 파일) > Worksheets(시트들) > Worksheet(특정 시트) > Range/Cells(셀 범위)

[예시]

using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

// ...

// Excel 애플리케이션 생성
Excel.Application excelApp = new Excel.Application();
excelApp.Visible = true; // 엑셀 창을 눈에 보이게 설정

// 새 워크북(파일) 추가
Excel.Workbook workbook = excelApp.Workbooks.Add();
Excel.Worksheet worksheet = workbook.Worksheets[1]; // 첫 번째 시트 선택

// 특정 셀(A1)에 값 쓰기
worksheet.Cells[1, 1] = "Hello, Velog!";

// 파일 저장
workbook.SaveAs(@"C:\temp\MyFirstExcel.xlsx");

// 가장 중요한 부분: 사용한 COM 객체 해제!
Marshal.ReleaseComObject(worksheet);
Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(excelApp);
장점단점
엑셀의 모든 기능을 제어할 수 있음사용자 PC에 Excel이 설치되어 있어야 함
자동 완성 기능으로 구조 파악이 쉬움서버 환경(웹 서버 등)에서 사용하기 부적합
엑셀의 근본적인 동작 원리 이해 가능속도가 느리고 메모리 사용량이 많음
사용 후 리소스 정리를 직접 해야 함 (안 하면 메모리 누수!)

2)서드파티 라이브러리 사용

"서버에서 수천 개의 보고서를 10분 안에 만들어야 해요!"와 같은
실무적인 요구사항이 있다면, COM 연동은 좋은 선택이 아닙니다.
이때 등장하는 것이 바로 서드파티(Third-party) 라이브러리입니다.

이 라이브러리들은 Excel 프로그램을 직접 제어하는 대신,
.xlsx파일 형식을 직접 읽고 쓰는 방식으로 동작합니다.
따라서 PC에 Excel 프로그램이 설치되어 있지 않아도
완벽하게 작동하며, 속도도 훨씬 빠르고 안정적입니다.
대표적인 라이브러리로는 EPPlus, ClosedXML 등이 있습니다.

실무에서는 이 방법을 최우선으로 고려하세요!
단순 데이터 입출력, 보고서 생성 등 대부분의 현업 작업은
서드파티 라이브러리를 사용하는 것이 훨씬 효율적이고 안정적입니다.

[예시]

// EPPlus 라이브러리 사용 예시 (NuGet 패키지 설치 필요)
using OfficeOpenXml;

// ...

// EPPlus는 라이선스 설정이 필요합니다.
ExcelPackage.LicenseContext = LicenseContext.NonCommercial; // 또는 Commercial

using (var package = new ExcelPackage(new FileInfo(@"C:\temp\MyReport.xlsx")))
{
    // 새 워크시트 추가 또는 기존 시트 가져오기
    ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Report");

    // A1 셀에 값 쓰기
    worksheet.Cells["A1"].Value = "EPPlus is Awesome!";

    // 저장
    package.Save();
} // using 블록이 끝나면 자동으로 리소스가 정리됩니다. 깔끔하죠?
장점단점
Excel 설치가 필요 없음 (서버 환경 최적화)라이브러리 사용법을 별도로 익혀야 함
매우 빠르고 안정적임매크로 실행 등 일부 고급 기능은 지원하지 않을 수 있음
리소스 관리가 매우 쉬움 (using 구문)
배우기 쉽고 직관적인 API

3)dynamic을 이용한 COM 연동

이 방법은 1번 방법(강력한 형식의 COM 연동)의 변형입니다.
모든 엑셀 객체를 dynamic키워드로 선언하여 사용하는 방식이죠.
코드가 한결 간결해 보이지만 치명적인 단점이 있습니다.
바로 자동 완성 기능의 도움을 전혀 받을 수 없다는 점입니다.
모든 메서드와 속성 이름을 정확하게 외워서 타이핑해야 하며,
오타가 나도 컴파일 시점에는 알 수 없고 실행 시점에 에러가 발생합니다.

[예시]

// Excel 애플리케이션 생성
dynamic excelApp = new ActiveXObject("Excel.Application");
excelApp.Visible = true;

// 워크북과 워크시트 추가
dynamic workbook = excelApp.Workbooks.Add();
dynamic worksheet = workbook.Worksheets[1];

// 값 쓰기
worksheet.Cells[1, 1] = "Hello, dynamic!";

// 이런 식으로도 접근 가능
worksheet.Range("A2").Value = "This is dynamic style.";
장점단점
형 변환이 없어 코드가 간결해 보임자동 완성(IntelliSense) 지원 안 됨
간단한 스크립트를 빠르게 작성할 때 유용오타 등으로 인한 런타임 에러 발생 위험이 매우 높음
디버깅이 어려움
1번 방법의 단점을 모두 공유함 (Excel 설치 필요 등)

4)어떤 방법을 선택할까요?

C#으로 엑셀을 다뤄야 할 때, 적절한 방법을 선택하실 수 있기를 바랍니다.

상황추천 방법특징
웹/서버 애플리케이션,
신규 프로젝트
서드파티
라이브러리
속도, 안정성, 호환성 모든 면에서 압도적으로 우수합니다.
엑셀 고급 기능(매크로 등) 사용강력한 형식의
COM 연동
엑셀의 모든 기능을 제어할 수 있는 유일한 방법입니다.
엑셀 객체 모델을 공부하거나,
오래된 코드를 유지보수할 때
강력한 형식의
COM 연동
자동 완성의 도움을 받으며 구조를 파악하기에 좋습니다.
간단한 테스트 스크립트dynamic
COM 연동
코드를 빠르고 간단하게 작성할 수 있지만,
주력으로 사용하는 것은 절대 추천하지 않습니다.
profile
🚀 미래의 엔지니어를 꿈꾸는 훈련생의 기록 📝

0개의 댓글