354 lines
8.5 KiB
JavaScript
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;
|
|
} |