java poi 엑셀 업로드 excel upload | spring
2016. 1. 5. 15:53ㆍlanguage/java
POI를 사용한 엑셀 업로드 예제이다.
spring 3.0에서 작성되었다.
필요한 라이브러리 목록이다.
dom4j-1.6.1.jar
poi-3.10-FINAL-20140208.jar
poi-excelant-3.10-FINAL-20140208.jar
poi-ooxml-3.10-FINAL-20140208.jar
poi-ooxml-schemas-3.10-FINAL-20140208.jar
poi-scratchpad-3.10-FINAL-20140208.jar
stax-api-1.0.1.jar
xmlbeans-2.3.0.jar
commons-fileupload
commons-io
dispatcher-servlet.xml
<!-- multipartResolver 선언 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="100000000" />
<property name="maxInMemorySize" value="100000000" />
</bean>
|
cs |
FileVO 생성
public class FileVO {
private String name;
private CommonsMultipartFile fileData;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public CommonsMultipartFile getFileData()
{
return fileData;
}
public void setFileData(CommonsMultipartFile fileData)
{
this.fileData = fileData;
}
}
|
cs |
controller 생성
@RequestMapping("/unit/unitMuchAddFileupload.do")
public String unitMuchAddFileupload(
@ModelAttribute("searchVO") UnitVO searchVO, FileVO fileVO, HttpServletRequest request, Model model)
throws Exception {
String targetView = "";
// 파일
String fileUploadPath = propertiesService.getString("excelUploadrealPath"); // spring properties에 미리 저장한 경로
CommonsMultipartFile uploadfile = fileVO.getFileData();
// 파일 유무
if (!uploadfile.isEmpty()) {
String fileName = uploadfile.getOriginalFilename();
String fileExt = uploadfile.getOriginalFilename().substring(fileName.lastIndexOf(".") + 1,
fileName.length());
// 확장자 검사
if (FileUploadUtil.excelExtensionCheck(fileExt)) {
// 파일 저장
fileName = FileUploadUtil.excelFileUpload(uploadfile, fileUploadPath);
// 파일저장 유무
if(!fileName.equals("")){
// 엑셀 파일 읽기
List<List<String>> excelList = FileUploadUtil.excelReader(fileName);
// 엑셀 파일 유효성 검사
// 공백, 데이터 크기 바이트 (영문 1, 한글 2, 특문 1)
Map<String, Object> excelValidation = FileUploadUtil.excelValidation(excelList,11);
if(excelValidation.get("checkFlag").equals(true)){
// 업로드 성공
// excelList 사용가능
// excelList
}else{
}
// 파일 삭제
if(FileUploadUtil.fileDelete(fileName)){
}else{ // 파일 삭제 실패
}
// 엑셀 정보
model.addAttribute("excelList", excelList);
}else{ // 파일 저장 fail
// 업로드 fail
return targetView;
}
}else{ // 확장자 fail
return targetView;
}
}else{ // 파일 없음
return targetView;
}
return targetView;
}
|
cs |
컨트롤러에서 사용중인 함수들
/**
* 엑셀 확장자 검사
*
* @param extension
* @return 엑셀 true, 엑셀이 아니면 false
*/
public static boolean excelExtensionCheck(String exe) {
boolean rtn = false;
// 엑셀 확장자
List<String> excelExtensionList = new ArrayList<String>();
excelExtensionList.add("xlsx");
excelExtensionList.add("xlsm");
excelExtensionList.add("xlsb");
excelExtensionList.add("xltx");
excelExtensionList.add("xltm");
excelExtensionList.add("xls");
excelExtensionList.add("xlt");
excelExtensionList.add("xlm");
excelExtensionList.add("xlw");
for (int i = 0; i < excelExtensionList.size(); i++) {
if (exe.equalsIgnoreCase(excelExtensionList.get(i))) {
rtn = true;
break;
}
}
return rtn;
}
/**
* 엑셀 파일 임시 저장
*
* @param uploadfile
* @param nowTime
* @return success : fileName, fail : zerolength
*/
public static String excelFileUpload(CommonsMultipartFile uploadfile, String fileUploadPath) {
String fileName = uploadfile.getOriginalFilename();
String nowTime = CommonUtil.getNowTime();
String fileExt = uploadfile.getOriginalFilename().substring(fileName.lastIndexOf(".") + 1,
fileName.length());
fileName = fileUploadPath + nowTime+ "." + fileExt;
byte[] bytes = uploadfile.getBytes();
try {
File lOutFile = new File(fileName);
FileOutputStream lFileOutputStream = new FileOutputStream(
lOutFile);
lFileOutputStream.write(bytes);
lFileOutputStream.close();
} catch (IOException ie) {
// Exception 처리
System.err.println("File writing error");
return "";
}
System.err.println("File upload success");
return fileName;
}
/**
* 엑셀 파일 읽기
*
* @param fileName
* @return excelList
* @throws Exception
*/
public static List<List<String>> excelReader(String fileName) throws Exception{
List<List<String>> excelList = new ArrayList<List<String>>();
OPCPackage opcPackage = OPCPackage.open(new File(fileName));
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);
FileOutputStream fileOut = new FileOutputStream(fileName);
workbook.write(fileOut);
opcPackage.close();
fileOut.close();
XSSFRow row;
XSSFCell cell;
XSSFSheet sheet = workbook.getSheetAt(0);
// 로우수
int rowCnt = sheet.getPhysicalNumberOfRows();
// 셀 수 (첫번째 로우 기준)
// int cellCnt = sheet.getRow(0).getPhysicalNumberOfCells(); //
// int cellCnt = 1; // 1로 고정 첫 셀만 가져온다.
for (int r = 0; r < rowCnt; r++) {
List<String> excel = new ArrayList<String>();
row = sheet.getRow(r); // row 가져오기
// 중복제거 플래그
boolean excelOverlapFlag = true;
// for (int c = 0; c < cellCnt; c++) {
cell = row.getCell(StaticFinalCDUtil.EXCEL_GET_CELL);
String cellValue = "";
// 엑셀 타입별로 분리
// 숫자, 문자 이외의 수식, 데이터, null이 아닌 공백, 에러 등 많은 종류가 있다
int cellType = cell.getCellType();
switch (cellType) {
case XSSFCell.CELL_TYPE_NUMERIC: // type 숫자
cellValue = String.valueOf(cell.getNumericCellValue());
break;
case XSSFCell.CELL_TYPE_STRING: // type 문자
cellValue = cell.getStringCellValue();
break;
}
// 중복제거
if(excelList.size() > 0){
for(int i = 0; i<excelList.size(); i++){
List<String> list = excelList.get(i);
if(list.get(0).equals(cellValue)){
excelOverlapFlag = false;
break;
}
}
if(excelOverlapFlag){
excel.add(cellValue);
}
}else{
excel.add(cellValue);
}
// }
if(excelOverlapFlag){
excelList.add(excel);
}
}
return excelList;
}
/**
* @param excelList 엑셀 리스트
* @param checkByte 체크할 바이트 수
* @return Map<String,Object>
* key = "zerolengthList"
* 공백 셀이 있는 셀의 로우값을 가지고 있는 리스트
* key = "checkByteList"
* 체크할 바이트 수를 넘어간 셀의 로우값을 가지고 있는 리스트
* key = "checkFlag"
* checkFlag 값이 true 이면 zerolengthList, checkByteList 는 null
* key = "zerolengthListSize"
* key = "checkByteListSize"
*/
public static Map<String,Object> excelValidation(List<List<String>> excelList, int checkByte){
Map<String,Object> map = new HashMap<String, Object>();
List<String> zerolengthList = new ArrayList<String>();
List<String> checkByteList = new ArrayList<String>();
for(int i=0; i< excelList.size(); i++){
List<String> excelCell = excelList.get(i);
for(int c=0; c < excelCell.size(); c++){
String cell = excelCell.get(c);
// 공백체크
if(StringUtil.isEmpty(cell)){
zerolengthList.add(String.valueOf(i));
}
// 바이트 체크 (영문 1, 한글 2, 특문 1)
int en = 0;
int ko = 0;
int etc = 0;
char[] cellChar = cell.toCharArray();
for (int j = 0; j < cellChar.length; j++) {
if (cellChar[j] >= 'A' && cellChar[j] <= 'z') {
en++;
} else if (cellChar[j] >= '\uAC00' && cellChar[j] <= '\uD7A3') {
ko++;
ko++;
} else {
etc++;
}
}
int cellByte = en + ko + etc;
if(cellByte > checkByte){
checkByteList.add(String.valueOf(i));
}
}
}
if(zerolengthList.size() > 0){
map.put("zerolengthList", zerolengthList);
map.put("zerolengthListSize", zerolengthList.size());
}else{
map.put("zerolengthList", null);
map.put("zerolengthListSize", 0);
}
if(checkByteList.size() > 0){
map.put("checkByteList", checkByteList);
map.put("checkByteListSize", checkByteList.size());
}else{
map.put("checkByteList", null);
map.put("checkByteListSize", 0);
}
if(zerolengthList.size() == 0 && checkByteList.size() == 0){
map.put("checkFlag", true);
}else{
map.put("checkFlag", false);
}
return map;
}
|
cs |
도움이 되셨다면 공감을 부탁드립니다. ^^
'language > java' 카테고리의 다른 글
Java | queryString 등 문자열 중에서 한글만 찾아 인코딩하기 / 유니코드 활용 (0) | 2016.11.24 |
---|---|
JAVA Web Crawling (Scraping) / 웹페이지 크롤링 Apache HttpComponents (0) | 2016.11.21 |
JAVA Object 객체가 비어있는지 체크 (0) | 2016.11.11 |
Java 문자열 바이트 체크 / 문자열 길이 체크 / string byte check (1) | 2016.11.11 |
java poi 엑셀 업로드 excel upload 심플한 방법 (2) | 2016.11.11 |
JAVA 강좌 / JAVA 복습 / JAVA 학습 / (0) | 2016.11.08 |
파일구조 / 디렉토리 구조 / 탐색기 / JAVA (0) | 2016.01.05 |
URLEncoder / URLDecoder / 한글깨짐 / 문자열 깨짐 / character set / java (0) | 2016.01.05 |
JAVA / URL / URLConnection / xml 가져오기 / 파싱 (2) | 2016.01.05 |
JAVA SimpleDateFormat을 이용한 현재 년 월 일 날짜 구하기 (0) | 2016.01.05 |