728x90
반응형

Vue 엑셀 다운로드 기능

요청부에서 HTTP 송수신을 호출하고 다시 그안에서 엑셀 파일이 다운로드 되겠금

아래와 같이 구성하였다


//엑셀 파일 다운로드

import util from './util.js'

/** 날짜 YYYYMMDD 형식으로 변환 */
Date.prototype.yyyymmdd = function() {
    var yyyy = this.getFullYear().toString();
    var mm = (this.getMonth() + 1).toString();
    var dd = this.getDate().toString();

    return yyyy + (mm[1] ? mm : '0'+mm[0]) + (dd[1] ? dd : '0'+dd[0]);
}

export default {
    /** 
     * 엑셀 파일 다운로드 기능 
     * 응답 받은 데이터를 파일로 변환시켜 다운 받을 수 있도록 한다
     **/
    getExcelFile(response, fileName) {
        let result = document.createElement('a');

        console.log((new Date()).yyyymmdd());

        let blob = new Blob([response.data], {type: response.headers['content-type']})

        //파일이름이 없을 경우 기본 파일이름을 셋팅한다 
        // 기본 파일이름 : export_yyyymmdd.xlsx
        fileName = util.isNull(fileName) ? 'export' : fileName;
        fileName = fileName+'_'+(new Date()).yyyymmdd()+'.xlsx';

        //this.fileCheck(fileName);

        let link = document.createElement('a');
        link.href = window.URL.createObjectURL(blob);
        link.target = '_self';
        link.download = fileName;
        link.click();
    }
}


//HTTP 송수신부

export default {
        /** 
	 * 엑셀다운로드 기능
	 * 
	 * [HEADER 지정]
	 * 기존 전문 요청 형식과 똑같고 추가로 HEADER에 컬럼 헤더 제목을 지정한다
	 * 지정하지 않으면 기본으로 컬럼 키값으로 셋팅 된다
	 * 
	 * [파일이름 지정]
	 * fileName 설정하려면 fileName에 원하는 파일이름을 담아서 넘긴다
	 * 
	 * [요청방법]
	 * EXCEL 다운로드할 전문 및 프로시저를 생성하고 
	 * VALUE에 조회조건을 셋팅해 엑셀 다운로드를 요청한다
	 * 아래의 예시와 같이 호출하는 곳에서 param을 셋팅해서 요청 하면된다
	 * 
	 * ex)
	 * var param = {
			REQ_TYPE:"203"
			, REQ_NUM:'AW03_05_V01'
			, VALUE:"│" //조회 조건
			// 엑셀 헤더 String 배열로 입력된 그대로 헤더를 만든다
			// 헤더를 지정하지 않으면 기본 컬럼 키 값으로 헤더를 만든다
			, HEADER: ["템플릿_코드","템플릿_구분","템플릿_구분 값","템플릿_제목","템플릿_내용","버튼_정보 (버튼명)","입력_일시","승인_상태","승인_상태 값","반려 메세지"]
		}
	 * 
	 */
	sendExcelDown: function(vue, param, suc, fail) {
		common.IS_LOADING = true;

		//공통 파라메터 적용 셋팅
		this.commonParam(param);

		let URI = common.BASE_URL + "excelDownApi";
		
		axios.post(
			`${URI}`
			, param
			,{responseType: 'arraybuffer'}
		)
		.then((ret) => {
				common.IS_LOADING = false;
				//파일 이름 지정 지정하지 않으면 export_yyyymmdd.xlsx 가 기본값이 된다
				var filename = '';
				fileUtil.getExcelFile(ret, filename);
			}
		)
		.catch(e => {
			common.IS_LOADING = false;
			
			if (fail != undefined) {
				fail(vue, e);
			}
		})
	}
}


//요청부

methods: {
	excelDown: function() { //전문 데이터 전송
		var param = {
				REQ_TYPE:"203"
			, REQ_NUM:'AW03_05_V01'
			, VALUE:"│" //조회 조건
			// 엑셀 헤더 String 배열로 입력된 그대로 헤더를 만든다
			// 헤더를 지정하지 않으면 기본 컬럼 키 값으로 헤더를 만든다
			, HEADER: ["템플릿_코드","템플릿_구분","템플릿_구분 값","템플릿_제목","템플릿_내용","버튼_정보 (버튼명)","입력_일시","승인_상태","승인_상태 값","반려 메세지"]
		}

		// 통신 호출
		httpCommon.sendExcelDown(this, param, function suc(vue, data) {
			//console.log('test complete');
		});
	}
}




728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,