/** * * @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(); }); //치환문자 있는 엑섹불러오기 버튼 클릭시 파일 첨부 실행 $('.c3').click(function(){ // 엑셀파일 불러오기 선택 시 $("#excelFile").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("엑셀 파일을 첨부해주세요."); } } /** * 엑셀 파일 불러오기 */ 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; }