데이터 분석, 시스템 간 데이터 교환, 또는 데이터베이스 가져오기 작업을 하다 보면 Excel 파일을 CSV(Comma-Separated Values) 형식으로 변환해야 하는 경우가 매우 많습니다. CSV는 구조가 단순하고 거의 모든 데이터 처리 도구에서 지원하는 범용 데이터 교환 형식입니다. 이번 글에서는 Java 환경에서 Excel 파일을 CSV로 변환하는 구체적인 방법을 코드 예제와 함께 알아보겠습니다.
CSV는 텍스트 파일 형식으로, 데이터를 쉼표(,)와 같은 구분자로 분리하여 표 형태의 데이터를 저장합니다. 파일 크기가 작고, 텍스트 편집기로도 열람이 가능하며, 다양한 프로그래밍 언어와 도구(엑셀, R, Python Pandas 등)에서 손쉽게 읽고 쓸 수 있습니다. 이러한 특성 덕분에 CSV는 데이터 파이프라인이나 ETL(추출, 변환, 로드) 과정에서 중간 데이터 형식으로 널리 활용됩니다.
이번 예제에서는 Excel 파일 처리를 위해 Java 기반의 라이브러리를 사용합니다. Maven 프로젝트라면 pom.xml에 아래 의존성 코드를 추가하여 라이브러리를 가져올 수 있습니다.
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.com/nexus/content/groups/public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.xls</artifactId>
<version>16.7.3</version>
</dependency>
</dependencies>
Maven을 사용하지 않는다면, 해당 라이브러리 제공사의 웹사이트에서 JAR 파일을 내려받아 프로젝트의 빌드 경로에 추가하는 방식으로도 사용할 수 있습니다.
Excel 파일을 CSV 형식으로 변환하는 기본적인 방법은 다음과 같습니다. Workbook 객체를 생성하고 파일을 불러온 뒤, 원하는 시트를 선택하여 saveToFile() 메서드를 호출하면 됩니다.
import com.spire.xls.*;
import java.nio.charset.Charset;
public class ExcelToCSV {
public static void main(String[] args) {
// Workbook 객체 생성 및 Excel 파일 로드
Workbook workbook = new Workbook();
workbook.loadFromFile("sample.xlsx");
// 수식이 있는 경우 계산 (선택사항)
workbook.calculateAllValue();
// 첫 번째 워크시트 가져오기
Worksheet sheet = workbook.getWorksheets().get(0);
// 워크시트를 CSV로 저장 (구분자: 쉼표, 인코딩: UTF-8)
sheet.saveToFile("output.csv", ",", Charset.forName("UTF-8"));
}
}
이 코드는 첫 번째 시트의 내용을 CSV 파일로 저장합니다. saveToFile() 메서드의 파라미터는 각각 파일명, 구분자, 문자 인코딩을 지정합니다.
통합 문서 중 특정 시트 하나만 CSV로 변환해야 한다면, 해당 시트를 지정하여 저장하면 됩니다.
import com.spire.xls.*;
import java.nio.charset.Charset;
public class SpecificSheetToCSV {
public static void main(String[] args) {
Workbook workbook = new Workbook();
workbook.loadFromFile("sample.xlsx");
// 두 번째 시트를 CSV로 저장 (인덱스는 0부터 시작)
Worksheet sheet = workbook.getWorksheets().get(1);
sheet.saveToFile("second_sheet.csv", ",", Charset.forName("UTF-8"));
}
}
Excel은 여러 시트를 가질 수 있지만 CSV는 하나의 시트만 표현할 수 있기 때문에, 모든 시트를 개별 CSV 파일로 저장해야 하는 경우가 많습니다. 이때는 반복문을 활용하면 됩니다.
import com.spire.xls.*;
import java.nio.charset.Charset;
public class AllSheetsToCSV {
public static void main(String[] args) {
Workbook workbook = new Workbook();
workbook.loadFromFile("sample.xlsx");
// 전체 시트를 순회하며 각각 CSV로 저장
for (int i = 0; i < workbook.getWorksheets().getCount(); i++) {
Worksheet sheet = workbook.getWorksheets().get(i);
sheet.saveToFile("sheet_" + (i+1) + ".csv", ",", Charset.forName("UTF-8"));
}
}
}
기본적으로 CSV는 쉼표(,)를 구분자로 사용하지만, 지역 설정이나 데이터 특성에 따라 세미콜론(;)이나 탭(\t) 등 다른 구분자가 필요할 수 있습니다. saveToFile() 메서드의 두 번째 파라미터를 변경하면 됩니다.
// 세미콜론 구분자 사용
sheet.saveToFile("output_semicolon.csv", ";", Charset.forName("UTF-8"));
// 탭 구분자 사용
sheet.saveToFile("output_tab.csv", "\t", Charset.forName("UTF-8"));
한글이 포함된 데이터는 적절한 인코딩을 지정해야 깨짐을 방지할 수 있습니다. Charset.forName() 메서드를 통해 인코딩을 설정할 수 있습니다.
// UTF-8 인코딩
sheet.saveToFile("output_utf8.csv", ",", Charset.forName("UTF-8"));
// EUC-KR 인코딩 (한글 윈도우 환경)
sheet.saveToFile("output_euckr.csv", ",", Charset.forName("EUC-KR"));
지금까지 Java에서 Excel 파일을 CSV 형식으로 변환하는 기본적인 방법과 주요 옵션 활용법을 살펴보았습니다. Worksheet.saveToFile() 메서드 하나로 손쉽게 변환할 수 있으며, 구분자나 인코딩을 유연하게 조정할 수 있음을 확인했습니다.
CSV는 데이터 교환의 가장 보편적인 형식 중 하나로, 다양한 시스템과 도구 간의 호환성을 보장합니다. Excel 데이터를 데이터베이스에 대량으로 가져오거나, 다른 분석 도구(R, Python 등)로 전달해야 하는 경우 CSV로의 변환은 거의 필수적인 과정입니다. 이 글이 데이터 처리 업무에 작게나마 도움이 되기를 바랍니다.