mjon_git/src/main/webapp/js/kakao/at/alimtalkExcel.js
2024-08-07 15:54:15 +09:00

354 lines
8.5 KiB
JavaScript

/**
*
* @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 = '<div class="list_table list_body excelBody">'
+'\t<div class="cb_wrap">'
+'\t\t<label for="" class="label"></label>'
+'\t\t<input type="checkbox" class="wrap01C">'
+'\t</div>'
+'\t<div class="list_table_num phoneArea">'
+'\t\t<p>$PHONE$</p>'
+'\t</div>'
/*23.04.06 이름제거 요청으로인한 화면 이름 제거*/
/*+'\t<div class="list_table_name">'
+'\t\t<p>$NAME$</p>'
+'\t</div>'*/
+'</div>';
// 중복 텍스트
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 ='<div class="list_table_name">'
+'\t<p>$HEADTITLE$</p>'
+'</div>';
// 바디 row 수신자 tag
var excelBodyRowTextIndex00 ='<div class="list_table_name phoneArea">'
+'\t\t<p>$ROWTEXT$</p>'
+'\t</div>';
// 바디 row tag
var excelBodyRowTextIndex01 ='<div class="list_table_name transData">'
+'\t\t<p>$ROWTEXT$</p>'
+'\t</div>';
//합친 내용에서 변수 문자열 뽑기 - #과{}포함
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 = '<div class="list_table list_body 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 += '</div>';
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;
}