java poi 엑셀 업로드 excel upload | spring

2016. 1. 5. 15:53language/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

 

 

 

도움이 되셨다면 공감을 부탁드립니다. ^^