/** * * @author : 이호영 * @fileName : alimtalkExcel.js * @date : 2023.02.21 * @description : 알림톡 excel 관련된 fuction .js * =========================================================== * DATE AUTHOR NOTE * ----------------------------------------------------------- * * 2023.02.21 이호영 최초 생성 * * * */ $(document).ready(function(){ //치환문자 없는 엑섹불러오기 버튼 클릭시 파일 첨부 실행 $('.c1').click(function(){ // 엑셀파일 불러오기 선택 시 $("#excelFile01").click(); }); }); function excelAdd(){ var files = document.getElementById('excelFile01').files; var filename = files[0].name; var extension = filename.substring(filename.lastIndexOf(".")).toUpperCase(); if (extension == '.XLS' || extension == '.XLSX') { excelFileToJSON01(files[0]); }else{ alert("엑셀 파일을 첨부해주세요."); } } /* * 신규 엑셀 파일 불러오기 * 기존 json 처리가 아닌 POI 방식으로 처리하기 위함 * * */ function excelExportAjax(){ var data = new FormData(document.excelToolTipForm); var fileValue = $("#excelFile01").val().split("\\"); var fileName = fileValue[fileValue.length-1]; var fileExt = fileName.split('.').pop().toLowerCase(); if(fileExt.length > 0){ if($.inArray(fileExt, ['xls','xlsx']) == -1) { alert('xls, xlsx 파일만 업로드 할수 있습니다.'); return false; } } fn_viewDataInit02(); $('#excelNm01').val(fileName); } function excelAddAjax(){ var data = new FormData(document.excelToolTipForm); data.append("file0", $('#excelFile01').prop('files')[0]); var url = "/web/mjon/alimtalk/sendAlimtalkExelFilePhoneNumAjax.do"; $.ajax({ type: "POST", enctype: 'multipart/form-data', url: url, data: data, dataType:'json', async: true, processData: false, contentType: false, cache: false, //timeout: 600000, success: function (returnData, status) { if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나 if(returnData.success){ var data = returnData.data; var message = returnData.message; if(message != '' ){ alert(returnData.message); } if(data != null){ //수신목록 Html 태그 var addHtml = '
' +'\t
' +'\t\t' +'\t\t' +'\t
' +'\t
' +'\t\t

$PHONE$

' +'\t
' /*23.04.06 이름제거 요청으로인한 화면 이름 제거*/ /*+'\t
' +'\t\t

$NAME$

' +'\t
'*/ +'
'; var totalDuplCnt = $('#rowDupCnt').text();//중복 건수 정보 var $excelBody = $('#wrap01_body'); var phoneNum; $.each(data, function(i, item){ if(checkHpNum(item.phone)){ phoneNum = removeDash(item.phone); if(!phoneDupl(phoneNum)) /*23.04.06 이름제거 요청으로인한 화면 이름 제거*/ // $excelBody.append(addHtml.replace('$PHONE$', phoneNum).replace('$NAME$', jsonData[bodyIndex]['이름'] ??= '')); $excelBody.append(addHtml.replace('$PHONE$', phoneNum)); else totalDuplCnt++; } else{ alert("엑셀 파일 데이터의 형식이 맞지 않는 부분이 있습니다."); excelAddr = []; //엑셀 데이터 저장 변수 초기화 $("#excelFile").val(""); //첨부파일 input 초기화 $("#excelNm").val(""); // 첨부파일 명 초기화 fileName = ""; return; } }); $('#rowDupCnt').text(totalDuplCnt); $("#excelFile01").val(""); //첨부파일 input 초기화 $("#excelNm01").val(""); // 첨부파일 명 초기화 updateTotCnt(); } }else{ alert(returnData.message); // alert("첨부파일 불러오는 중 오류가 발생하였습니다."); excelAddr = []; //엑셀 데이터 저장 변수 초기화 $("#excelFile01").val(""); //첨부파일 input 초기화 $("#excelNm01").val(""); // 첨부파일 명 초기화 fileName = ""; return; } } else if(status== 'fail'){ alert("첨부파일 불러오는 중 오류가 발생하였습니다.1"); console.log("status : fail ~"); } }, error: function (e) { alert("첨부파일 불러오는 중 오류가 발생하였습니다2."); console.log("ERROR : ", e); }, beforeSend : function(xmlHttpRequest) { //로딩창 show $('.loading_layer').addClass('active'); }, complete : function(xhr, textStatus) { //로딩창 hide $('.loading_layer').removeClass('active'); } }); } /* * 신규 변수명 설정 엑셀 파일 불러오기 * 기존 json 처리가 아닌 POI 방식으로 처리하기 위함 * * */ function excelExportVarAjax(){ console.log(' :: excelExportVarAjax ::') var data = document.getElementById('excelFile').files; var fileValue = $("#excelFile").val().split("\\"); var fileName = fileValue[fileValue.length-1]; var fileExt = fileName.split('.').pop().toLowerCase(); if(fileExt.length > 0){ if($.inArray(fileExt, ['xls','xlsx']) == -1) { alert('xls, xlsx 파일만 업로드 할수 있습니다.'); return false; } } fn_viewDataInit01(); excelAddVarAjax(); } function excelAddVarAjax(){ var varList = $("#excelTemplateContent").val().match(/#\{([^}]+)\}/g); var varListSize = new Set(varList); var form = document.excelVarFileForm; form.excelVarCnt.value = varListSize.size; form.excelVarList.value = varList; var data = new FormData(form); data.append("file0", $('#excelFile').prop('files')[0]); var url = "/web/mjon/alimtalk/sendAlimtalkExelVarFilePhoneNumAjax.do"; $.ajax({ type: "POST", enctype: 'multipart/form-data', url: url, data: data, dataType:'json', async: true, processData: false, contentType: false, cache: false, //timeout: 600000, success: function (returnData, status) { if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나 console.log('returnData : ', returnData); if(returnData.success){ var data = returnData.data; var message = returnData.message; if(message != '' ){ alert(returnData.message); } if(data != null){ //수신목록 Html 태그 // 엑셀 헤더 var excelTitleHeadText ='
' +'\t

$HEADTITLE$

' +'
'; // 바디 row 수신자 tag var excelBodyRowTextIndex00 ='
' +'\t\t

$ROWTEXT$

' +'\t
'; // 바디 row tag var excelBodyRowTextIndex01 ='
' +'\t\t

$ROWTEXT$

' +'\t
'; //맨 앞에 수신번호 배열 추가 varList.unshift('수신번호'); //변수 문자열 중복 제거 var newList = Array.from(new Set(varList)); //엑셀헤더 selector var $excelHead = $('#excelHead'); //엑셀바디 selector var $excelBody = $('#excelBody02'); // 엑셀 헤더 부분 $.each(newList, function(headerIndex, value) { $excelHead.append(excelTitleHeadText.replace('$HEADTITLE$', value)); }); var totalDuplCnt = $('#rowDupCnt').text();//중복 건수 정보 var $excelBody = $('#excelBody02'); var addDiv = ""; var phoneNum; var msgCnt = 0; //입력데이터를 역정렬해준다. data.reverse(); //변수명 추출해주기 var varListArr = []; varListArr = form.excelVarList.value.split(","); var forBreakB = true $.each(data, function(i, item){ if(checkHpNum(item.phone)){ phoneNum = removeDash(item.phone); if(!phoneDupl(phoneNum)){ var varVal = item.varVal; var lengthCheck =true; /*23.04.06 이름제거 요청으로인한 화면 이름 제거*/ var excelBody = '
'; //수신번호 화면 태그 생성 excelBody += excelBodyRowTextIndex00.replace('$ROWTEXT$', removeDash(phoneNum)); //변수 데이터 태그 생성 var varValArr = [] varValArr = varVal.split("§"); for(var i=0; i < varValArr.length; i++){ var bodyData = varValArr[i]; // 기타변수는 50자리 까지 입력 if(bodyData.length > 100 || bodyData.length == 0 ){ if(forBreakB){ alert("등록 변수[ "+varListArr[i]+" ] \n기타변수의 입력 값이 없거나 100자리를 초과하는 내용이 포함되어 해당 내용 제외되었습니다."); forBreakB = false; } lengthCheck = false; break; } excelBody += excelBodyRowTextIndex01.replace('$ROWTEXT$', bodyData); } excelBody += '
'; if(lengthCheck){ addDiv += excelBody; msgCnt++; } } else totalDuplCnt++; } else{ alert("엑셀 파일 데이터의 형식이 맞지 않는 부분이 있습니다."); excelAddr = []; //엑셀 데이터 저장 변수 초기화 $("#excelFile").val(""); //첨부파일 input 초기화 $("#excelNm").val(""); // 첨부파일 명 초기화 fileName = ""; return; } }); //화면에 수신번호 및 변수 데이터 추가해 주기 $excelBody.append(addDiv); // 총 금액 계산 fn_priceClclt(msgCnt); } }else{ alert(returnData.message); // alert("첨부파일 불러오는 중 오류가 발생하였습니다."); excelAddr = []; //엑셀 데이터 저장 변수 초기화 $("#excelFile01").val(""); //첨부파일 input 초기화 $("#excelNm01").val(""); // 첨부파일 명 초기화 fileName = ""; return; } } else if(status== 'fail'){ alert("첨부파일 불러오는 중 오류가 발생하였습니다."); console.log("status : fail ~"); } }, error: function (e) { alert("첨부파일 불러오는 중 오류가 발생하였습니다."); console.log("ERROR : ", e); }, beforeSend : function(xmlHttpRequest) { //로딩창 show $('.loading_layer').addClass('active'); }, complete : function(xhr, textStatus) { //로딩창 hide $('.loading_layer').removeClass('active'); } }); } /** * 엑셀 파일 불러오기 */ function excelExport01() { var files = document.getElementById('excelFile01').files; if(files.length==0){ alert("파일을 선택해주세요."); return; } // (치환문자가 있는)다른 형식의 값이 있으면 초기화 fn_viewDataInit02(); var filename = files[0].name; $('#excelNm01').val(filename); // var extension = filename.substring(filename.lastIndexOf(".")).toUpperCase(); // if (extension == '.XLS' || extension == '.XLSX') { // excelFileToJSON01(files[0]); // }else{ // alert("엑셀 파일을 첨부해주세요."); // } } /** * 변수 포함한 엑셀 파일 불러오기 */ function excelExport02() { var files = document.getElementById('excelFile').files; if(files.length==0){ alert("파일을 선택해주세요."); return; } // (치환문자가 없는)다른 형식의 값이 있으면 초기화 fn_viewDataInit01(); // fn_viewDataInit02(); var filename = files[0].name; var extension = filename.substring(filename.lastIndexOf(".")).toUpperCase(); if (extension == '.XLS' || extension == '.XLSX') { excelFileToJSON02(files[0]); }else{ alert("엑셀 파일을 첨부해주세요."); } } /** * 엑셀 정보 json으로 변환 */ function excelFileToJSON01(file){ /* * 시트 row 삭제 function 시작 * * */ const ec = (r, c) => { return XLSX.utils.encode_cell({r:r,c:c}) } const delete_row = (ws, row_index) => { let range = XLSX.utils.decode_range(ws["!ref"]) for(var R = row_index; R < range.e.r; ++R){ for(var C = range.s.c; C <= range.e.c; ++C){ ws[ec(R, C)] = ws[ec(R+1, C)] } } range.e.r-- ws['!ref'] = XLSX.utils.encode_range(range.s, range.e) } /* * 시트 row 삭제 function 끝 * * */ try { var reader = new FileReader(); reader.readAsBinaryString(file); reader.onload = function(e) { var data = e.target.result; var workbook = XLSX.read(data, { type : 'binary' }); var result = {}; //첫번째 시트 정보 json으로 변환 var firstSheetName = workbook.SheetNames[0]; //첫번째 시트의 첫번째 로우 삭제 delete_row(workbook.Sheets[firstSheetName], 0); var jsonData = XLSX.utils.sheet_to_json(workbook.Sheets[firstSheetName]); displayJsonToHtmlTable01(jsonData); } }catch(e){ console.error(e); } } /** * 엑셀 정보 json으로 변환 */ function excelFileToJSON02(file){ try { var reader = new FileReader(); reader.readAsBinaryString(file); reader.onload = function(e) { var data = e.target.result; var workbook = XLSX.read(data, { type : 'binary' }); var result = {}; //첫번째 시트 정보 json으로 변환 var firstSheetName = workbook.SheetNames[0]; var jsonData = XLSX.utils.sheet_to_json(workbook.Sheets[firstSheetName]); displayJsonToHtmlTable02(jsonData); } }catch(e){ console.error(e); } } /** * 변수 없는 엑셀 json 정보를 테이블로 그려주기 */ function displayJsonToHtmlTable01(jsonData){ var addHtml = '
' +'\t
' +'\t\t' +'\t\t' +'\t
' +'\t
' +'\t\t

$PHONE$

' +'\t
' /*23.04.06 이름제거 요청으로인한 화면 이름 제거*/ /*+'\t
' +'\t\t

$NAME$

' +'\t
'*/ +'
'; // 중복 텍스트 var totalDuplCnt = $('#rowDupCnt').text(); var keys = Object.keys(jsonData); // json에 key만 추출 var $excelBody = $('#wrap01_body'); // jsonData.reverse(); var phoneNum; $.each(jsonData, function(bodyIndex, value) { phoneNum = removeDash(jsonData[bodyIndex]['수신번호']) if(!phoneDupl(phoneNum)) /*23.04.06 이름제거 요청으로인한 화면 이름 제거*/ // $excelBody.append(addHtml.replace('$PHONE$', phoneNum).replace('$NAME$', jsonData[bodyIndex]['이름'] ??= '')); $excelBody.append(addHtml.replace('$PHONE$', phoneNum)); else totalDuplCnt++; }); $('#rowDupCnt').text(totalDuplCnt); updateTotCnt(); } /** * 변수 있는 엑셀 json 정보를 테이블로 그려주기 */ function displayJsonToHtmlTable02(jsonData){ // 엑셀 헤더 var excelTitleHeadText ='
' +'\t

$HEADTITLE$

' +'
'; // 바디 row 수신자 tag var excelBodyRowTextIndex00 ='
' +'\t\t

$ROWTEXT$

' +'\t
'; // 바디 row tag var excelBodyRowTextIndex01 ='
' +'\t\t

$ROWTEXT$

' +'\t
'; //합친 내용에서 변수 문자열 뽑기 - #과{}포함 var varList = $("#excelTemplateContent").val().match(/#\{([^}]+)\}/g); //맨 앞에 수신번호 배열 추가 varList.unshift('수신번호'); //변수 문자열 중복 제거 var newList = Array.from(new Set(varList)); //엑셀헤더 selector var $excelHead = $('#excelHead'); //엑셀바디 selector var $excelBody = $('#excelBody02'); // 엑셀 헤더 부분 $.each(newList, function(headerIndex, value) { $excelHead.append(excelTitleHeadText.replace('$HEADTITLE$', value)); }); // 중복 텍스트 var totalDuplCnt = $('#rowDupCnt').text(); //엑셀바디 내용 리버스 jsonData.reverse(); // 치환 데이터 선언 var bodyData; // 추가 div 선언 var addDiv = ""; // 입력 글자수 체크 선언 var lengthCheck =true; outerLoop : for(var bodyIndex=0; bodyIndex < jsonData.length; bodyIndex++) { if(lengthCheck){ var excelBody = '
'; for(var headerIndex=0; headerIndex < newList.length; headerIndex++) { // 치환할 데이터 bodyData = jsonData[bodyIndex][newList[headerIndex]]; if(bodyData == null){ // reverse 감안하여 전체 개수 - 하여 몇행인지 알려줌 // alert((jsonData.length - bodyIndex+1)+'번째 데이터에 오류가 있습니다. 확인해주세요.'); continue outerLoop; // outerLoop 다음 loop 실행 } //headerIndex == 0 : 전화번호 if(headerIndex == 0) { // 핸드폰 번호 11자리 체크 if(bodyData.length > 11){ alert("등록 핸드폰 번호["+bodyData+"] \n핸드폰 번호는 11자리 까지 입력이 가능합니다."); lengthCheck = false; break; } // 전화번호 중복 체크 if(!phoneDupl(bodyData)) excelBody += excelBodyRowTextIndex00.replace('$ROWTEXT$', removeDash(bodyData)); else { totalDuplCnt++; continue outerLoop; // outerLoop 다음 loop 실행 } } else { // 기타변수는 50자리 까지 입력 if(bodyData.length > 100){ alert("등록 변수["+bodyData+"] \n기타 변수에는 100자리 까지 입력이 가능합니다."); lengthCheck = false; break; } excelBody += excelBodyRowTextIndex01.replace('$ROWTEXT$', bodyData); } } excelBody += '
'; addDiv += excelBody; }else{ addDiv = ""; break; } } $excelBody.append(addDiv); } /** * 중복체크 * true : 중복 [O] * false : 중복 [X] */ function phoneDupl(data){ var resultBoo = true; data = removeDash(data); /* * 중복체크 * 기존 데이터 배열화 */ var area = []; $('.phoneArea').each(function(index, item){ area.push($(item).text().trim()); }); if(!area.includes(data)) resultBoo = false; return resultBoo; }