프로젝트 진행 도중 Excel을 읽어서 데이터를 가져와 처리해야 했기에 poi 라이브러리를 활용한 모듈을 만들어 봤다.
우선 poi 라이브러리를 추가하도록 하자.
Spring 기반이라면 pom.xml에 poi 라이브러리를 추가하여야 한다.
poi 라이브러리 이외에도 여러 라이브러리를 추가하였는데 그 이유는 poi 라이브러리를 사용할 때 필요한 라이브러리를 추가한 것이다.
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.13</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.13</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.13</version>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>2.6.0</version>
</dependency>
만약 Spring 기반이 아니라면 그냥 다운받아서 라이브러리를 추가해주면 된다.
apache common io 라이브러리는 파일명에서 확장자를 쉽게 가져오기 위하여 추가한 것으로 해당 라이브러리를 사용하지 않고 직접 분리해도 된다.
이제 ExcelUtil클래스를 작성하겠다.
package exceltest;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.io.FilenameUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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 ExcelUtil {
private static final String EXT_XLS = "XLS";
private static final String EXT_XLSX = "XLSX";
public static void main(String[] args) {
File file = new File("D:\\sample.xlsx");
if( file.exists() ) {
System.out.println( "파일이 있습니다." );
}
try {
readExcel("D:\\sample.xlsx");
} catch (IOException e) {
e.printStackTrace();
}
}
public static List<Map<String, String>> readExcel( String filePath ) throws IOException {
File file = new File(filePath);
String ext = FilenameUtils.getExtension( file.getName() );
List<Map<String, String>> resultMap = null;
if( EXT_XLS.equalsIgnoreCase( ext ) ) {
resultMap = readExcelForXls(filePath);
}
else if( EXT_XLSX.equalsIgnoreCase( ext ) ) {
resultMap = readExcelForXlsx(filePath);
}
return resultMap;
}
@SuppressWarnings("resource")
private static List<Map<String, String>> readExcelForXls( String filePath ) throws IOException {
FileInputStream fileInputStream = new FileInputStream(filePath);
HSSFWorkbook workbook = new HSSFWorkbook( fileInputStream );
HSSFSheet sheet = workbook.getSheetAt(0);
int rows = sheet.getPhysicalNumberOfRows();
List<Map<String, String>> resultList = new ArrayList<Map<String, String>>();
for( int rowIndex = 1; rowIndex < rows; rowIndex++ ) {
HSSFRow row = sheet.getRow(rowIndex);
if( row == null ) {
continue;
}
int cells = row.getPhysicalNumberOfCells();
Map<String, String> resultMap = new HashMap<String, String>();
for( int columnindex = 0; columnindex <= cells; columnindex++ ) {
HSSFCell cell = row.getCell(columnindex);
String value = "";
if( cell == null ) {
continue;
}
else {
switch ( cell.getCellType() ) {
case HSSFCell.CELL_TYPE_FORMULA:
value = cell.getCellFormula();
break;
case HSSFCell.CELL_TYPE_NUMERIC:
value = String.valueOf(cell.getNumericCellValue());
break;
case HSSFCell.CELL_TYPE_STRING:
value = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_BLANK:
value = String.valueOf(cell.getBooleanCellValue());
case HSSFCell.CELL_TYPE_ERROR:
value = String.valueOf(cell.getErrorCellValue());
}
}
resultMap.put( String.valueOf( columnindex ) , value );
System.out.println("value : " + value);
}
resultList.add(resultMap);
}
return resultList;
}
@SuppressWarnings("resource")
private static List<Map<String, String>> readExcelForXlsx( String filePath ) throws IOException {
FileInputStream fileInputStream = new FileInputStream(filePath);
XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream);
XSSFSheet sheet = workbook.getSheetAt(0);
int rows = sheet.getPhysicalNumberOfRows();
List<Map<String, String>> resultList = new ArrayList<Map<String, String>>();
for( int rowindex = 1; rowindex < rows; rowindex++ ) {
XSSFRow row = sheet.getRow(rowindex);
if( row == null ) {
continue;
}
int cells = row.getPhysicalNumberOfCells();
Map<String, String> resultMap = new HashMap<String, String>();
for( int columnindex = 0; columnindex <= cells; columnindex++ ) {
XSSFCell cell = row.getCell(columnindex);
String value = "";
if( cell == null ) {
continue;
}
else {
switch (cell.getCellType()) {
case XSSFCell.CELL_TYPE_FORMULA:
value = cell.getCellFormula();
break;
case XSSFCell.CELL_TYPE_NUMERIC:
value = String.valueOf(cell.getNumericCellValue());
break;
case XSSFCell.CELL_TYPE_STRING:
value = cell.getStringCellValue();
break;
case XSSFCell.CELL_TYPE_BLANK:
value = String.valueOf(cell.getBooleanCellValue());
break;
case XSSFCell.CELL_TYPE_ERROR:
value = String.valueOf(cell.getErrorCellValue());
}
}
resultMap.put( String.valueOf( columnindex ) , value );
System.out.println("value : " + value);
}
resultList.add(resultMap);
}
return resultList;
}
}
그리고 Sample Excel 파일을 만들면 된다.
해당과 같이 테스트 Sample Excel 파일을 작성 후 소스에서 잡고 있는 경로에 위치해주면 테스트를 할 수 있다.
테스트의 결과값
메인 메서드에서 테스트 시 결과가 잘 나오는 것을 볼 수 있다.
위의 코드보다 더 좋은 코드를 알게 된다면 수정해서 올리도록 하겠다.
[Spring/오류] Cannot change version of project facet Dynamic Web Module to 2.5. (0) | 2020.07.31 |
---|---|
[Spring/POI] SXSSF 방식을 활용한 엑셀 다운로드 (0) | 2020.07.28 |
[Spring]IE HWP 파일 다운로드 시 브라우저로 읽는 문제점, 여러가지 해결을 시도해보았습니다. (4) | 2020.05.04 |
[Spring] Client Ip 가져오기 (0) | 2020.04.06 |
[Java] 파일 확장자 체크(확장자 체크/Tika를 이용한 MimeType 검사) (0) | 2020.04.05 |
댓글 영역