Excel 파일은 데이터를 표 형식으로 정리하고 서식을 적용하는 데 강력한 도구이지만, 데이터베이스 가져오기, ETL(추출·변환·적재) 프로세스, 또는 다른 분석 도구와의 연동을 위해서는 CSV(쉼표로 구분된 값) 형식이 더 적합한 경우가 많습니다. CSV 파일은 텍스트 기반으로 가볍고 파싱이 쉬워 다양한 시스템에서 폭넓게 지원됩니다.
이 글에서는 C#에서 Excel 워크시트를 CSV 파일로 변환하는 방법을 살펴보겠습니다.
Excel 데이터를 CSV로 변환하는 것은 다음과 같은 상황에서 유용합니다:
C#에서 Excel 파일을 처리하고 CSV로 변환하는 방법에는 여러 가지가 있습니다. Microsoft Office Interop을 사용하는 방법도 있지만, 이 방식은 Microsoft Excel이 설치되어 있어야 한다는 제약이 있습니다.
여기서는 Microsoft Office 설치 없이 작동하는 라이브러리를 사용하는 방법을 살펴보겠습니다.
NuGet 패키지 관리자를 통해 라이브러리를 설치합니다:
PM> Install-Package Spire.XLS
Excel 파일의 특정 워크시트를 CSV 파일로 변환하는 과정은 다음과 같습니다:
using Spire.Xls;
using System.Text;
namespace ConvertExcelToCsv
{
class Program
{
static void Main(string[] args)
{
// Workbook 클래스의 인스턴스 생성
Workbook workbook = new Workbook();
// Excel 파일 로드
workbook.LoadFromFile("Sample.xlsx");
// 첫 번째 워크시트 가져오기
Worksheet sheet = workbook.Worksheets[0];
// CSV로 저장 (UTF-8 인코딩, 쉼표 구분자)
sheet.SaveToFile("ExcelToCSV.csv", ",", Encoding.UTF8);
// 리소스 해제
workbook.Dispose();
}
}
}
SaveToFile 메서드는 파일 이름, 구분자, 인코딩을 매개변수로 받습니다. 위 예제에서는 쉼표를 구분자로, UTF-8을 인코딩으로 지정했습니다 .
SaveToFile 메서드는 다음과 같은 오버로드를 제공합니다 :
| 오버로드 | 설명 |
|---|---|
SaveToFile(string fileName, string separator) | 파일 이름과 구분자만 지정 |
SaveToFile(string fileName, string separator, Encoding encoding) | 파일 이름, 구분자, 인코딩 지정 |
SaveToFile(string fileName, string separator, bool retainHiddenData) | 파일 이름, 구분자, 숨겨진 데이터 유지 여부 지정 |
Excel 데이터를 CSV로 내보낼 때 구분자, 인코딩 등을 조정하여 다양한 요구사항에 대응할 수 있습니다 .
유럽 일부 지역에서는 세미콜론(;)이 기본 구분자로 사용됩니다. 이 경우 두 번째 매개변수를 변경합니다:
// 세미콜론을 구분자로 사용
sheet.SaveToFile("ExcelToCSV.csv", ";", Encoding.UTF8);
한글이나 기타 비ASCII 문자가 포함된 데이터의 경우 UTF-8 인코딩을 사용하는 것이 일반적입니다. 특정 시스템에서 다른 인코딩이 필요한 경우 해당 인코딩을 지정할 수 있습니다:
// EUC-KR 인코딩 사용 (한국 환경)
sheet.SaveToFile("ExcelToCSV.csv", ",", Encoding.GetEncoding("EUC-KR"));
워크북에 여러 워크시트가 있는 경우, 각 워크시트를 개별 CSV 파일로 변환할 수 있습니다.
using Spire.Xls;
using System.Text;
namespace ConvertAllSheets
{
class Program
{
static void Main(string[] args)
{
// Workbook 클래스의 인스턴스 생성
Workbook workbook = new Workbook();
// Excel 파일 로드
workbook.LoadFromFile("Sample.xlsx");
// 모든 워크시트를 반복
for (int i = 0; i < workbook.Worksheets.Count; i++)
{
Worksheet sheet = workbook.Worksheets[i];
// 각 워크시트를 CSV로 저장
string fileName = $"Sheet_{i + 1}.csv";
sheet.SaveToFile(fileName, ",", Encoding.UTF8);
System.Console.WriteLine($"{fileName} 저장 완료");
}
// 리소스 해제
workbook.Dispose();
}
}
}
대용량 Excel 파일을 CSV로 변환할 때는 다음과 같은 사항을 고려해야 합니다:
메모리 사용량: 전체 워크시트를 메모리에 로드하므로, 매우 큰 파일의 경우 메모리 부족이 발생할 수 있습니다. 이 경우 청크 단위 처리나 스트리밍 방식을 고려해야 합니다.
처리 시간: 셀 수가 많을수록 변환 시간이 증가합니다. 데이터베이스 가져오기 등 후속 작업까지 고려한 시간 계획이 필요합니다.
인코딩: CSV 파일은 텍스트 기반이므로 올바른 인코딩을 지정하지 않으면 한글이나 특수 문자가 깨질 수 있습니다. 대상 시스템에서 요구하는 인코딩을 확인해야 합니다 .
Excel을 CSV로 변환할 때 다음과 같은 데이터 손실 가능성을 인지해야 합니다:
Excel 파일 처리를 위한 라이브러리를 선택할 때는 다음 사항을 고려해야 합니다:
Microsoft Office 의존성: 일부 라이브러리는 Microsoft Office가 설치되어 있어야 작동합니다. 서버 환경에서는 Office 설치가 어려울 수 있으므로 독립적으로 작동하는 라이브러리를 선택하는 것이 좋습니다.
지원하는 형식: .xls, .xlsx, .xlsm 등 다양한 Excel 형식을 지원하는지 확인합니다.
라이선스: 무료 버전과 상용 버전의 기능 제한을 확인해야 합니다. 무료 버전의 경우 시트 수나 행 수에 제한이 있을 수 있습니다.
성능: 대용량 파일을 처리할 때의 성능을 고려해야 합니다.
C#에서 Excel 워크시트를 CSV 파일로 변환하는 것은 적절한 라이브러리를 사용하면 간단하게 구현할 수 있습니다. SaveToFile 메서드를 사용하여 파일 이름, 구분자, 인코딩을 지정함으로써 다양한 환경에 맞는 CSV 파일을 생성할 수 있습니다.
데이터베이스 가져오기, ETL 파이프라인, 분석 도구 연동 등 다양한 상황에서 Excel 데이터를 CSV로 변환하는 기능을 활용할 수 있습니다. 변환 시 서식과 수식이 손실된다는 점을 인지하고, 대상 시스템의 요구사항에 맞는 구분자와 인코딩을 선택하시기 바랍니다.