반응형

자바에서 POI 라이브러리를 활용하여 엑셀 읽기를 해보겠다.

 

과거버전 xls가 아닌 xlsx를 다루는점 참고하길 바라며, 라이브러리는 apache에서 다운받아 사용하거나

maven추가로 사용하면 된다.

 

지금부터만드는 자바Class 및 함수는 엑셀을 읽고 List로 리턴하는 함수이다.

 

 

 

 

Maven추가


<!-- excel -->
<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi</artifactId>
  <version>3.17</version>
</dependency>	
<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml</artifactId>
  <version>3.17</version>
</dependency>

POI 3.17버전으로 사용하였다.

 

 

 

 

JAVA 엑셀을 읽는 XlsxUtils Class 생성


package egov.mongo.utils;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class XlsxUtils {
	
	@SuppressWarnings("resource")
	public static List<List<String>> readToList(String path){
		List<List<String>> list = new ArrayList<List<String>>();
		
		try {
			FileInputStream fi = new FileInputStream(path);
			XSSFWorkbook workbook = new XSSFWorkbook(fi);
			XSSFSheet sheet = workbook.getSheetAt(0);
			
			for(int i=0; i<sheet.getLastRowNum(); i++) {
				XSSFRow row = sheet.getRow(i);
				if(row != null) {
					List<String> cellList = new ArrayList<String>();
					for(int j=0; j<row.getLastCellNum(); j++) {
						XSSFCell cell = row.getCell(j);
						if(cell != null) {
							cellList.add( cellReader(cell) ); //셀을 읽어와서 List에 추가
						}
					}
					list.add(cellList); // 추가된 로우List를 List에 추가
				}
			}
		}catch(FileNotFoundException e) {
			e.printStackTrace();
		}catch(IOException e) {
			e.printStackTrace();
		}
		
		return list;
	}
	
	
	@SuppressWarnings("incomplete-switch")
	private static String cellReader(XSSFCell cell) {
		String value = "";
		CellType ct = cell.getCellTypeEnum();
		if(ct != null) {
			switch(cell.getCellTypeEnum()) {
			case FORMULA:
				value = cell.getCellFormula();
				break;
			case NUMERIC:
			    value=cell.getNumericCellValue()+"";
			    break;
			case STRING:
			    value=cell.getStringCellValue()+"";
			    break;
			case BOOLEAN:
			    value=cell.getBooleanCellValue()+"";
			    break;
			case ERROR:
			    value=cell.getErrorCellValue()+"";
			    break;
			}
		}
		return value; 
	}
}

 

스트림을 통해 파라미터로 넘어온 경로를 확인하고 엑셀파일을 엑셀Workbook에 읽어서 파싱을 시작한다.

첫번째 시트만 읽도록 처리해놨다.

로우의 수만큼 차례대로 셀을 확인하여 셀의 타입을 cellReader함수에서 체크하고 List배열에 담는다.

 

 

 

 

Main.java


public class Main {

	public static void main(String[] args) {
		String filePath = "C:/test/ttt.xlsx";
		List<List<String>> readList = XlsxUtils.readToList(filePath);
		
		readList.forEach(row->{
			row.forEach(cell->{
				System.out.print(cell+", ");
			});
			System.out.println();
		});
	}
}

위 문법이 어렵다면(자바 1.8이하라면)

 

아래방법 for문으로 확인하면 된다.

public class Main {

	public static void main(String[] args) {
		String filePath = "C:/test/ttt.xlsx";
		List<List<String>> readList = XlsxUtils.readToList(filePath);
		
		for(int i=0; i<readList.size(); i++) {
			for(int j=0; j<readList.get(i).size(); j++) {
				System.out.print(readList.get(i).get(j)+", ");
			}
			System.out.println();
		}
	}
}

 

 

정상적으로 엑셀 데이터를 읽어와서 List에 담긴걸 확인할 수 있다.

엑셀 데이터

 

 

읽어온 데이터

 

반응형