티스토리 뷰

반응형

@Service
public class EmpExcelDownService implements IService {
    private final Logger logger = LoggerFactory.getLogger(EmpUpdatePersonalService.class);

    @Inject
    private SqlSession sqlSession;


    @Override
    public String execute(Model model) throws Exception {

        EmpDAO dao = sqlSession.getMapper(EmpDAO.class);
        EmpListService listService = new EmpListService();
        HttpServletRequest request = (HttpServletRequest) model.asMap().get("request");
        HttpServletResponse response = (HttpServletResponse) model.asMap().get("response");

        HttpSession session = request.getSession();
        LoginDTO loginUserInfo = (LoginDTO) session.getAttribute("loginUserInfo");

        Map<String, Object> param_map = listService.makeParamMap(request);

        //      String fileDir ="C:\\Users\\user\\Desktop\\";
        String fileName = "down_emp_" + CommonUtil.getCurrentDate("yyyyMMddHHmmss") + ".xlsx";

        //엑셀 워크북 생성
        Workbook wb = new XSSFWorkbook();
        //워크북 > 시트 생성
        Sheet sheet = wb.createSheet("Sheet1");

        //DAO에서 검색조건+list 가져오기
        List<Map<String, Object>> result = dao.listExcelDown(param_map);

        //key값 배열 (원하는 순서대로 map에서 value 추출 위함)
        String[] key = {"emp_no", "nm", "ssn_no", "emp_status_cd_nm", "work_type_cd", "center_nm"
                , "team_nm", "job_position_nm", "bank_cd", "account_no", "duty", "email"
                , "cell_no", "home_tel_no", "offi_tel_no", "exten_no", "addr_basic", "memo"
                , "join_ymd", "entrance_ymd", "company_nm_01", "pension_yn_01", "annual_vacation_01", "succ_entrance_01"
                , "company_nm_02", "pension_yn_02", "annual_vacation_02", "succ_entrance_02"
                , "retire_pension_yn", "midst_pension_ymd", "retire_ymd", "update_dt"};

        //엑셀 컬럼 명(한글) 배열
        String[] columnName = {"사원번호", "이름", "주민번호", "재직상태", "근무구분", "근무센터"
                , "근무 팀", "직책", "은행", "계좌번호", "담당업무", "이메일"
                , "휴대전화", "집전화", "직장전화", "내선번호", "주소", "비고"
                , "입사일", "입소일", "고용승계 그룹사 명", "고용승계 그룹사 퇴직금 정산여부", "고용승계 그룹사 연차 정산여부", "고용승계 그룹사 입사일"
                , "고용승계 타사 명", "고용승계 타사 퇴직금 정산 여부", "고용승계 타사 연차 정산여부", "고용승계 타사 입사일"
                , "퇴직연금 가입여부", "퇴직금 중간정산일", "퇴직일", "최종 수정일시"};

        // 엑셀 헤더 컬럼 설정
        // 헤더 열 선언
        Row headRow = sheet.createRow(0);
        // 컬럼명 배열 길이 반복
        for (int i = 0; i < columnName.length; i++) {
            // 셀 생성
            Cell headerCell = headRow.createCell(i);
            // 헤더셀에 컬럼명 한개씩 넣어줌
            headerCell.setCellValue(columnName[i]);
        }

        // 엑셀 바디 설정
        Row bodyRow = null;
        Cell bodyCell = null;
        // dao에서 받은 list 사이즈 만큼 반복
        for(int i =0; i<result.size(); i++){
            // result의 map 한개씩 추출
            Map<String, Object> map = result.get(i);
            // 바디 열 설정, 이미 헤더 열 (0번째)이 있기 때문에 i+1 번째 부터 생성한다.
            bodyRow = sheet.createRow(i+1);
            //key값으로 map 추출 해와야 하기 때문에 key.length 만큼 반복
            for(int j =0; j<key.length; j++){
                //cell 생성
                bodyCell = bodyRow.createCell(j);
                //cell 값은 map의 key값으로 추출한다.
                bodyCell.setCellValue(String.valueOf(map.get(key[j])));
            }
        }

        // 각 브라우저에 따른 파일이름 인코딩작업
        String browser = request.getHeader("User-Agent");
        if (browser.indexOf("MSIE") > -1) {
            fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
        } else if (browser.indexOf("Trident") > -1) {       // IE11
            fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
        } else if (browser.indexOf("Firefox") > -1) {
            fileName = "\"" + new String(fileName.getBytes("UTF-8"), "8859_1") + "\"";
        } else if (browser.indexOf("Opera") > -1) {
            fileName = "\"" + new String(fileName.getBytes("UTF-8"), "8859_1") + "\"";
        } else if (browser.indexOf("Chrome") > -1) {
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < fileName.length(); i++) {
                char c = fileName.charAt(i);
                if (c > '~') {
                    sb.append(URLEncoder.encode("" + c, "UTF-8"));
                } else {
                    sb.append(c);
                }
            }
            fileName = sb.toString();
        } else if (browser.indexOf("Safari") > -1) {
            fileName = "\"" + new String(fileName.getBytes("UTF-8"), "8859_1") + "\"";
        } else {
            fileName = "\"" + new String(fileName.getBytes("UTF-8"), "8859_1") + "\"";
        }

        // 헤더 셋팅
        response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ";");

        // 파일생성 2
        OutputStream outputStream = response.getOutputStream();
        // workbook.write 하면 위의 file.createNewFile() 과 중복, 2개 생김.
        wb.write(outputStream);

        // 생성완료면 닫기
        if (outputStream != null) {
            outputStream.close();
        }

        return "200";
    }
}
반응형