Excel 파일은 보고서, 사용자 제출 양식, 시스템 내보내기 데이터 등 구조화된 데이터를 저장하고 교환하는 데 널리 사용됩니다. 많은 Java 애플리케이션에서 이러한 Excel 파일을 열고 데이터를 추출하여 추가 처리하는 것이 필수적인 기능입니다. 이 글에서는 Java용 Spire.XLS for Java 라이브러리를 사용하여 .xls와 .xlsx 파일을 읽고, 데이터 타입에 맞게 파싱하는 단계별 방법을 예제와 함께 소개합니다.
Excel 파일을 파싱하려면 먼저 프로젝트에 적절한 라이브러리를 추가해야 합니다. 이 라이브러리는 두 Excel 형식을 모두 지원하며, Microsoft Excel이 설치되지 않은 환경에서도 동작합니다.
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.8,4</version>
</dependency>
</dependencies>
Maven을 사용하지 않는다면, JAR 파일을 직접 다운로드하여 프로젝트의 클래스패스에 추가할 수도 있습니다.
가장 먼저 Excel 파일을 로드하고, 첫 번째 워크시트의 이름을 확인하는 기본적인 예제입니다.
import com.spire.xls.*;
public class ParseExcel {
public static void main(String[] args) {
// Workbook 객체 생성 및 Excel 파일 로드
Workbook workbook = new Workbook();
workbook.loadFromFile("data.xlsx"); // 또는 "data.xls"
// 첫 번째 워크시트 가져오기
Worksheet sheet = workbook.getWorksheets().get(0);
System.out.println("Worksheet loaded: " + sheet.getName());
}
}
가장 간단한 방법은 Excel 데이터를 텍스트로 읽어오는 것입니다. 이는 데이터 타입에 크게 신경 쓰지 않고, 로깅이나 화면 표시, 빠른 데이터 확인이 필요할 때 적합합니다.
import com.spire.xls.*;
public class ReadAllCellsAsString {
public static void main(String[] args) {
Workbook workbook = new Workbook();
workbook.loadFromFile("data.xlsx");
Worksheet sheet = workbook.getWorksheets().get(0);
// 모든 행과 열을 순회하며 데이터를 문자열로 읽기
for (int i = 1; i <= sheet.getLastRow(); i++) {
for (int j = 1; j <= sheet.getLastColumn(); j++) {
String cellText = sheet.getCellRange(i, j).getValue();
System.out.print(cellText + "\t");
}
System.out.println();
}
}
}
데이터 처리, 검증, 계산을 위해서는 숫자 셀의 값을 적절한 Java 숫자 타입으로 읽어야 합니다. getNumberValue()를 사용하여 숫자 값을 가져올 수 있습니다.
import com.spire.xls.*;
public class ParseNumericValues {
public static void main(String[] args) {
Workbook workbook = new Workbook();
workbook.loadFromFile("data.xlsx");
Worksheet sheet = workbook.getWorksheets().get(0);
CellRange usedRange = sheet.getAllocatedRange(); // 데이터가 있는 범위 가져오기
System.out.println("Raw number values:");
// 사용된 범위의 행과 열을 순회
for (int i = usedRange.getRow(); i <= usedRange.getLastRow(); i++) {
for (int j = usedRange.getColumn(); j <= usedRange.getLastColumn(); j++) {
CellRange cell = sheet.getRange().get(i, j);
// 숫자 값이 존재하는 경우에만 출력 (빈 셀 등 제외)
if (!(Double.isNaN(cell.getNumberValue()))) {
System.out.print(cell.getNumberValue() + "\t");
}
}
System.out.println();
}
}
}
Excel의 날짜도 내부적으로는 숫자로 저장됩니다. getDateTimeValue()를 사용하면 java.util.Date 객체로 직접 가져올 수 있어 날짜 연산이 편리합니다.
import com.spire.xls.*;
import java.util.Date;
public class ParseDateValues {
public static void main(String[] args) {
Workbook workbook = new Workbook();
workbook.loadFromFile("data.xlsx");
Worksheet sheet = workbook.getWorksheets().get(0);
CellRange usedRange = sheet.getAllocatedRange();
System.out.println("Date values:");
// 예시: G열(G1, G2, G3...)의 날짜 값 읽기
for (int i = 0; i < usedRange.getRowCount(); i++) {
CellRange cell = usedRange.get(String.format("G%d", i + 1));
Date date = cell.getDateTimeValue();
System.out.println(date);
}
}
}
.xls(HSSF)와 .xlsx(XSSF)를 모두 지원하며, WorkbookFactory를 사용하면 파일 형식을 자동으로 감지할 수 있습니다. 다만, 이 글에서 소개한 방식에 비해 상대적으로 더 많은 코드를 작성해야 할 수 있습니다.InputStream 형태로 받을 수 있습니다. 이 라이브러리는 workbook.loadFromStream(inputStream) 메서드를 통해 이를 지원합니다.cell.getType() 메서드를 사용할 수 있습니다. 이는 숫자, 문자열, 수식, 빈 셀 등을 구분하는 데 유용합니다.이 글에서는 Spire.XLS for Java를 사용하여 Excel 파일을 로드하고, 모든 셀을 문자열로 읽거나, 숫자와 날짜 값을 타입에 맞게 파싱하는 방법을 코드 예제와 함께 살펴보았습니다. 이 라이브러리는 .xls와 .xlsx 형식을 모두 지원하며, Workbook과 Worksheet 객체를 통해 직관적인 API를 제공하여 Excel 데이터에 접근할 수 있게 해줍니다. 프로젝트의 요구사항과 라이선스 정책에 따라 이 방식이 적합한지 판단하고, 필요에 따라 Apache POI와 같은 오픈소스 대안과 비교하여 선택할 것을 권장합니다.