wyh 2024-11-01
주소록 수정중
@92745aa218d039c39d8cacbe12e51d0f50e267c7
src/main/webapp/WEB-INF/jsp/main/EgovMainView.jsp
--- src/main/webapp/WEB-INF/jsp/main/EgovMainView.jsp
+++ src/main/webapp/WEB-INF/jsp/main/EgovMainView.jsp
@@ -652,14 +652,14 @@
 									<fmt:formatNumber value="${result.amtRefundSum}" pattern="#,###" />							
 								</td>																															
 								<td class="right c_999999">
-									<c:choose>
+									<%-- <c:choose>
 										<c:when test="${result.amtTotSum > 0}">
 											<fmt:formatNumber value="${result.amtTotSum}" pattern="#,###" />
 										</c:when>
 										<c:otherwise>									
 											<fmt:formatNumber value="${result.amtTotSum}" pattern="#,###" />
 										</c:otherwise>
-									</c:choose>							
+									</c:choose> --%>							
 								</td>							
 							</tr>
 						</c:forEach>
src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp
--- src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp
+++ src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp
@@ -4,34 +4,34 @@
 <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
 
+
 <script type="text/javascript" src="<c:url value='/publish/js/content.js'/>"></script>
 <script type="text/javascript" src="https://oss.sheetjs.com/sheetjs/xlsx.full.min.js"></script>
+<script type="text/javascript" src="<c:url value='/js/web/addr/fax/faxTabulator.js'/>?v=20241031"></script>
+<script type="text/javascript" src="<c:url value='/js/web/addr/fax/faxEvent.js'/>?v=20241031"></script>
+<script type="text/javascript" src="<c:url value='/js/web/addr/cmn.js?date=202409021440'/>"></script>
+<script type="text/javascript" src="<c:url value='/js/web/addr/utils.js'/>?v=20240919"></script>
 
 <script type="text/javascript">
-var tableErrorData = [];
-var tableErrorCheckData = [];
-var addrMassDupliSaveList = null;
 
 $(document).ready(function(){
 	listAddrGrp();
 	addrLoadAjax();
 	
-	// 주소록 대량등록
-	addrMassTab(1);	
-	
-	// 중복 팩스번호 버튼 노출여부
-	$("#btnAddrMassDupli").hide();
-	$("#btnAddrMassSaveDupli").hide();
+	// excel 오류정보 테스트
+	$('#errorExcelBtn').click(function(){
+		if($tableError.getDataCount()<1){
+			alert('오류 정보가 없습니다.');
+			return false;
+		}
+		$tableError.download("xlsx", "error_data.xlsx");
+	});
 }); 
 
+// 메인 화면 좌측메뉴 최신화
 function listAddrGrp(){
 	var sendData = $(document.searchAddrGrpForm).serializeArray() ;
 	$("#adr1_left").load("/web/mjon/fax/addr/selectFaxAddrGroupListAjax.do", sendData ,function(response, status, xhr){});
-}
-
-function addrGroupLoadAjax(){
-	$("#addrRegistSelect").load("/web/mjon/fax/addr/selectFaxAddrGroupAjax.do", function(response, status, xhr){});
-	$("#funcAddrGroupSelect").load("/web/mjon/fax/addr/selectFaxAddrGroupAjax.do", function(response, status, xhr){});
 }
 
 function addrLoadAjax(){
@@ -39,6 +39,13 @@
 	addrGroupLoadAjax();
 }
 
+function addrGroupLoadAjax(){
+	$("#addrRegistSelect").load("/web/mjon/fax/addr/selectFaxAddrGroupAjax.do", function(response, status, xhr){});
+	$("#funcAddrGroupSelect").load("/web/mjon/fax/addr/selectFaxAddrGroupAjax.do", function(response, status, xhr){});
+}
+
+
+// 주소록그룹추가
 function insertAddrGroupAjax() {
 	var form = document.addrGrpInsertForm;
 	if(form.addrGrpNm.value == "") {
@@ -75,7 +82,6 @@
 		},
 		error: function (e) { alert("저장에 실패하였습니다."); console.log("ERROR : ", e); }
 	});
-	
 }
 
 function insertAddrAjax() {
@@ -157,7 +163,7 @@
 
 function moveTab(type){
 	if(type == "addr") 			location.href="/web/mjon/addr/selectAddrList.do";
-	if(type == "fax") 		location.href="/web/mjon/fax/addr/selectFaxAddrList.do";
+	if(type == "fax") 			location.href="/web/mjon/fax/addr/selectFaxAddrList.do";
 	if(type == "block") 		location.href="/web/mjon/addrBlock/selectBlockList.do";
 	if(type == "addrMob") 		location.href="/web/mjon/addr/addrMobGuide.do";
 	if(type == "addrApply") 	location.href="/web/mjon/addragency/selectAddrAgencyList.do";
@@ -178,152 +184,6 @@
 
 $(document).ready(function(){
 	//Tabulator AJAX Data Loading
-	tableR = new Tabulator(".callList_box", {
-		height:"255px",
-		width:"100%",
-	    layout:"fitColumns",
-	    //data:tabledata,
-	    //autoColumns:true,
-	    headerHozAlign:"center",
-	    validationMode:"highlight",
-	    clipboard:false,
-	    clipboardCopySelector:"table",
-	    clipboardPasteAction:"insert", // insert, update, replace
-	    placeholder:"복사(Ctrl+C)한 내용을 여기에 붙여넣기(Ctrl+V) 해주세요.", //fit columns to width of table (optional)
-	 	columns:[ //Define Table Columns
-	 		{formatter:"rowSelection", titleFormatter:"rowSelection",clipboard:false, hozAlign:"center", headerSort:false, cellClick:function(e, cell){
-	 	        cell.getRow().toggleSelect();
-		 		}
-		 	}, 
-		 	{title:"이름", hozAlign:"center", field:"name", editor:"input", width:140, validator:["maxLength:12", "string"]},
-		 	{title:"팩스번호", hozAlign:"center", field:"phone", editor:"input", width:145, validator:["required","minLength:10", "maxLength:13"]},
-		 	{title:"메모", hozAlign:"center", field:"memo", editor:"input", width:119, validator:["maxLength:100", "string"]}
-	 	],
-	 	validationFailed:function(cell, value, parameters){ // 유효성 체크 함수 
-	        var valid = cell.isValid();
-	 		if(!valid){
-	 			alert("양식에 맞지 않는 정보가 입력되었습니다.");
-	 			
-	 			//해당 셀 데이터 삭제
-	 			cell.setValue("");
-	 		}
-	 		return value % parameters.phone;
-	    },
-	});
-
-	//받는 사람 리스트 영역에 클립보드 데이터 가져와보기 
-	$('.callList_box').on('paste', function (e) {
-		var element = e.originalEvent.clipboardData.getData('text'); // 클립보드에 복사한 데이터 가져오기
-		var elmSplit= [];
-		elmSplit = element.split("\n");
-		var elmLen = elmSplit.length;
-		if(elmLen < 0){
-			alert("붙여넣을 연락처를 복사해주세요.");
-			return false;
-		}else{
-			if (elmLen > 20001) {
-				alert("2만줄 이상의 업로드는 데이터 부하로 업로드 할수 없습니다.");
-				return false;
-			}			
-			
-			tableErrorData.length = 0;	// 오류 번호 배열 초기화
-
-			var splitData = [];
-			var realPhone = [];
-			for(var i=0; i < elmLen; i++){
-				var splitStr = elmSplit[i];
-				var tabData = splitStr.split("\t"); //탭 구분으로 데이터 분할
-				var comData = splitStr.split(","); //콤마 구분으로 데이터 분할
-				if(tabData.length >= 2){
-					splitData = tabData;
-				}else{
-					splitData = comData;
-				}
-				
-				if(splitData.length == 0){// 데이터가 없는경우
-					alert("탭으로 구분하여 데이터를 복사해 주세요.");
-				  	return false;
-				}else if(splitData.length == 1){// 데이터가 탭으로 구분이 없는 경우
-					for(var j=0; j < splitData.length; j++){
-						if(checkFaxNum(splitData[j].trim())){//팩스 타입인 번호만 저장해준다.
-							//배열 끝에 데이터 추가해 주기
-							realPhone.push({name: "", phone: removeDash(splitData[j].trim())});
-						}
-						else {
-							if (splitData[j].trim() != '' && splitData[j].trim() != null && splitData[j].trim() != undefined) {
-								tableErrorData.push(splitData[j].trim());
-							}							
-						}
-					}
-				}else{//데이터가 탭으로 구분되어 이름, 연락처로 구분된 경우
-					var name;	//이름
-					var phone;	//핸드폰번호					
-					var memo;	//메모
-					var isPhoneValid = false;
-					for(var j=0; j < splitData.length; j++){
-						if(j == 0){
-							name = splitData[j].trim();
-						}
-						if(j == 1){
-							if(checkFaxNum(splitData[j].trim())){//팩스 타입인 번호만 저장해준다.
-								phone = removeDash(splitData[j].trim());
-								isPhoneValid = true;
-							}
-							else {
-								if (splitData[j].trim() != '' && splitData[j].trim() != null && splitData[j].trim() != undefined) {
-									tableErrorData.push(splitData[j].trim());
-								}
-							}
-						}
-						
-						if(j == 2){	//메모
-							memo = splitData[j].trim();
-						}
-					}
-					
-					if (isPhoneValid == true) {
-						//배열 끝에 데이터 추가해 주기
-						realPhone.push({name: name, phone: phone, memo : memo });
-					}
-				}//else end
-			}
-			
-			var recTableData = tableR.getRows();		 // 받는사람 리스트의 전체 목록을 저장
-			var tableData = [];
-			
-			//기존 받는사람 리스트를 배열에 미리 담아둔다.
-			if(recTableData.length > 0){
-				for(var j=0; j < recTableData.length; j++){
-					tableData.push({name: recTableData[j].getData().name, phone: removeDash(recTableData[j].getData().phone.trim()), memo: recTableData[j].getData().memo});
-				}
-			}
-			
-			if(realPhone.length > 0){
-				for(var j=0; j < realPhone.length; j++){
-					tableData.push({name: realPhone[j].name, phone: removeDash(realPhone[j].phone.trim()), memo: realPhone[j].memo});
-				}
-			}
-			
-			//tableData.push(realPhone);
-				
-			//중복 연락처 1개만 남기고 삭제하기
-			var removeDuplPhone = dupliPhoneData(tableData);
-			  
-			//수신자 리스트에 전화번호 추가해주기
-			//tableR.addData(removeDuplPhone);
-			tableR.setData(removeDuplPhone);
-			
-			totRows = tableR.getRows().length; 
-			updateTotCnt(totRows); //전체 데이터 갯수 구하기
-			
-			if (tableErrorData.length > 0) {
-				alert("올바르지 않은 팩스 번호가 "+ tableErrorData.length +" 건 있습니다.");
-				//for(var x=0; x < tableErrorData.length; x++){
-				//	alert(tableErrorData[x]);
-				//}
-			}
-		}
-	});
 
 	//tableR.setData(tabledata);
 
@@ -573,8 +433,6 @@
 	    totRows = tableR.getRows().length;
 	    updateTotCnt(totRows);
 	});	
-	
-	
 });
 
 
@@ -822,9 +680,13 @@
 
 // 대량등록 닫기
 function setAddrMassClose() {
-	tableR.clearData();
-	$("#rowTotCnt").text(0); //총건수 수정
-	$("#rowDupCnt").text(0); //중복건수 수정
+	var $objTabul = fn_utils_getTabulator();
+	$objTabul.clearData();
+	
+	$("#rowTotCnt").text(0);	//총건수 수정
+	$("#rowDupCnt").text(0);	//중복건수 수정
+	$("#rowErrorCnt").text(0);	//오류건수 수정
+	
 	dupliPhoneDataRealList.length = 0;	// 중복 팩스번호 초기화
 	addrMassDupliSaveList = null;
 
@@ -834,7 +696,8 @@
 	//location.reload();
 	listAddrGrp();
 	addrGroupLoadAjax();
-	addrLoadAjax();			
+	addrLoadAjax();
+	fn_errorPopClean(); // 에러 팝업 초기화
 }
 
 // 주소록 그룹 중복체크
@@ -878,9 +741,6 @@
 		alert("2만줄 이상의 업로드는 데이터 부하로 업로드 할수 없습니다.");
 		return false;
 	}
-	
-	// 주소록 이름에 이모지 체크
-// 	if(!addrEmojiCheck(selectedData, tableR)) return false;
 	
 	var selectMassVal = $("#addrGrpIdInfo option:selected").val();
 	
@@ -1038,7 +898,8 @@
 	}
 }
 
-
+//주소 대량등록 버튼 클릭 
+//AddrListAjax.jsp에서 호출
 $(document).on('click', '#btnAddrMassRegCall', function() {
 	getAddrGroupList();
 });
@@ -1064,12 +925,13 @@
     });	    	
 }
 	
-// Show Html
+// 그룹데이터 노출
 function getAddrGroupListShow(jsonList) {
 	var sHtml = "";
 	sHtml += "<option value='NEW'>그룹추가</option>";
 	sHtml += "<option value='0'>그룹미지정</option>";
 	sHtml += "<option value='bookmark'>자주보내는 번호</option>";
+	
 	for (var j = 0; j < jsonList.length; j++) {
 		sHtml += "	<option value='" + $.trim(jsonList[j].addrGrpId) + "' />" + $.trim(jsonList[j].addrGrpNm) + "</option>";
 	}
@@ -1086,11 +948,6 @@
 //#############################################################################################
 //파일 불러오기
 //#############################################################################################
-
-//엑섹불러오기 버튼 클릭시 파일 첨부 실행
-$(document).on('click', '.c3', function() {
-	$("#excelFile").click();
-});
 
 //seetJs 엑셀 파일 불러오기
 function excelExport(event){
@@ -1299,6 +1156,13 @@
 	$("#addrMassSaveDupli_layer").html(sHtml);
 }
 
+//function fn_tabToggle('1')
+function fn_tabToggle(tabNum){
+	var tabId = '#tab'+tabNum;
+	$('.tab_c').hide();
+	$(tabId).show();
+	getAddrGroupList();
+}
 </script>
 
 <div class="loading_layer">
@@ -1307,145 +1171,78 @@
 		<div class="text">Loading</div>
 	</div>
 </div>
-<!-- 수신거부 대량등록  data-tooltip:adr_popup01 -->
-<form id="addrMassForm" name="addrMassForm" method="post">
-	<input type="hidden" id="phoneList" name="phoneList" value=""/>
-	<input type="hidden" id="nameList" name="nameList" value=""/>
-	<input type="hidden" id="memoList" name="memoList" value=""/>
-	<input type="hidden" id="addrGrpId" name="addrGrpId" value=""/>
-	<div class="tooltip-wrap" id="addrMassLoad">
-		<div class="popup-com adr_layer adr_popup01" tabindex="0" data-tooltip-con="adr_popup01" data-focus="adr_popup01" data-focus-prev="adr_popup01-close" style="width: 1000px;">
+
+<div id="adrPopup_tab1">
+	<!-- 주소록 대량등록  data-tooltip:adr_popup01 -->
+	<form id="addrMassForm" name="addrMassForm" method="post">
+		<input type="hidden" id="phoneList" name="phoneList" value=""/>
+		<input type="hidden" id="nameList" name="nameList" value=""/>
+		<input type="hidden" id="memoList" name="memoList" value=""/>
+		<input type="hidden" id="addrGrpId" name="addrGrpId" value=""/>
+		<div class="tooltip-wrap" id="addrMassLoad">
+			<div class="popup-com adr_layer adr_popup01" tabindex="0" data-tooltip-con="adr_popup01" data-focus="adr_popup01" data-focus-prev="adr_popup01-close" style="width: 1000px;">
+				<div class="popup_heading">
+					<p>주소록 대량등록</p>
+					<button type="button" class="tooltip-close" data-focus="adr_popup01-close" onclick="setAddrMassClose();"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
+				</div>
+				<div class="layer_in" style="padding: 25px 30px;">
+					<div class="list_tab_wrap2">
+						<!-- tab button -->
+						 <ul class="list_tab" id="tbTabl">  
+							<li class="tab active" data-tabul="tableExcel"><button type="button" onclick="popupTab(this,'1'); fn_tabToggle('1');">엑셀입력</button></li>
+							<li class="tab" data-tabul="tableClip"><button type="button" onclick="popupTab(this,'2'); fn_tabToggle('2');">붙여넣기</button></li>
+							<li class="tab" data-tabul="tableSelf"><button type="button" onclick="popupTab(this,'3'); fn_tabToggle('3');">직접입력</button></li>
+						</ul>
+						<!--// tab button -->
+					</div>
+					<div id="tab1" class="tab_c tableExcel">
+						<%@include file="/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforExcel.jsp" %>
+					</div>
+					<div id="tab2" class="tab_c tableClip" style="display: none;">
+						<%-- <%@include file="/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforClipboard.jsp" %> --%>
+					</div>
+					<div id="tab3" class="tab_c tableSelf" style="display: none;">
+						<%-- <%@include file="/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforSelf.jsp" %> --%>
+					</div>
+				</div>
+				<div class="popup_btn_wrap2" style="margin: 0 auto 30px auto;">
+					<button type="button" id="btnAddrMassReg">등록</button>
+					<button type="button" id="btnAddrMassClose" class="tooltip-close" data-focus="adr_popup01-close"  data-focus-next="popup02">닫기</button>                      
+				</div>
+			</div>
+		</div>
+	</form>
+	
+	<!-- 주소록 상세 결과 팝업 data-tooltip:adr_popup14 -->
+	<div class="tooltip-wrap">
+		<div class="popup-com adr_layer adr_popup14" tabindex="0" data-tooltip-con="adr_popup14" data-focus="adr_popup14" data-focus-prev="adr_popu14-close" style="width: 450px;">
 			<div class="popup_heading">
-	               <p>주소록 대량등록</p>
-	               <button type="button" class="tooltip-close" data-focus="adr_popup01-close" onclick="setAddrMassClose();"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
-	           </div>
-	           <div class="layer_in" style="padding: 25px 30px;">
-	               <div class="list_tab_wrap2">
-	                   <!-- tab button -->
-	                   <ul class="list_tab"> 
-	                       <li class="tab active"><button type="button" onclick="popupTab(this,'1'); addrMassTab('1');">엑셀입력</button></li>
-	                       <li class="tab"><button type="button" onclick="popupTab(this,'2'); addrMassTab('2');">붙여넣기</button></li>
-	                   </ul><!--// tab button -->
-	               </div>
-	               <!-- 엑셀입력 -->
-	               <div class="popCont current pop_more_cont" id="popCont_1">
-	                   <div class="titBox">
-							<p>- 엑셀(EXCEL) 파일로 주소록을 한 번에 최대 2만건까지 등록하여 간편하게 발송 및 관리하실 수 있습니다.</p>
-							<p>- 반드시 샘플파일을 다운로드하여 작성방법을 확인하신 후 정해진 양식에 맞추어 주소록을 작성하셔야 합니다.</p>
-							<p>  &nbsp;&nbsp;※ 팩스 번호는 지역번호(02, 031, 033 등), 타사부가번호(030*, 050*, 060, 070, 080, 1**)로 시작하는 번호만 발송 가능합니다. </p>
-							<p>  &nbsp;&nbsp;※ 주소록 관리 메뉴에서 다운로드 받으신 엑셀 파일 또한 업로드 양식에 맞추어 작성하셔야 하며, </p>
-							<p>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;주소록에 이미 등록된 팩스 번호는 업데이트 되지 않으므로 기존 주소록에서 해당 팩스 번호를 삭제한 후 재등록해 주시기 바랍니다.</p>
-							<p>- 쉼표(,), 구분선(|), 역슬래시(\, ₩), 작은따옴표('), 큰따옴표(") 등 발송불가 특수문자는 저장되지 않습니다.</p>
-							<p>- 팩스 번호는 필수입력 항목입니다.</p>
-							<p>- 팩스번호 형태는 02-1234-5678 또는 0212345678 모두 가능합니다. 단, 공백은 허용되지 않습니다.</p>
-							<p>- 엑셀 파일에 비밀번호 설정, 제한된 보기, 수식 등이 설정되어 있는 경우 업로드가 불가합니다.</p>
-							<p>- 이름 20byte, 메모 250byte까지 입력 가능합니다.</p>
-							<p>- 첨부가능 파일 : xlsx, xls(최대용량 3MB)</p>
-							<p>- ‘오류 검사’를 통해 등록된 데이터에 팩스 번호 입력 오류를 확인하실 수 있습니다.</p>
-							<p>- 주소록 등록이 어려우신 경우에는 주소록 입력대행 메뉴를 이용하시면 됩니다.</p>
-	                       <button type="button" class="excel_btn" onclick="location.href='/download/addr/팩스주소록_대량등록.xlsx'"><i class="downroad"></i>샘플파일 다운로드</button>
-	                   </div>
-	                   <div class="pop_more_wrap">
-	                   		<button type="button" class="pop_more" onclick="popMore(this);">더보기<i></i></button>
-	                   </div>
-	                </div><!--// 엑셀입력 -->
-	                
-	                <!-- 붙여넣기 -->
-	                <div class="popCont pop_more_cont" id="popCont_2">
-	                    <div class="titBox">
-	                        <p>- 텍스트(txt) 파일로 작성된 주소록을 등록하실 수 있습니다.</p>
-	                        <p>- 반드시 샘플파일을 다운로드하여 작성방법을 확인하신 후 정해진 양식에 맞추어 주소록을 붙여 넣으셔야 합니다.</p>
-	                        <p>  &nbsp;&nbsp;※ 팩스 번호는 지역번호(02, 031, 033 등), 타사부가번호(030*, 050*, 060, 070, 080, 1**)로 시작하는 번호만 발송 가능합니다. </p>
-	                        <p>- 입력 내용은 (Tab) 또는 (,) 구분하여 입력하여야 합니다.</p>
-	                        <p>- 한 줄(열)에 주소 한 건만 입력 가능합니다.</p>
-	                        <p>- 팩스 번호 형태는 02-1234-5678 또는 0212345678 모두 가능합니다. 단, 공백은 허용되지 않습니다.</p>
-	                        <p>  &nbsp;&nbsp;(예) 홍길동,02-1234-5678 또는 홍길동,0212345678</p>
-	                        <p>- 한번에 많은 양의 데이터를 입력하시려면 ‘주소록 복사(Ctrl+c) + 붙여넣기(Ctrl+v)’ 또는 ‘엑셀입력’을 이용하세요.</p>
-	                        <p>- 주소록 등록이 어려우신 경우에는 주소록 입력대행 메뉴를 이용하시면 됩니다.</p>
-	                        <button type="button" class="txt_btn" onclick="location.href='/download/addr/팩스주소록_대량등록.zip'"><i></i>TXT샘플 다운로드</button>                        
-	                    </div>
-	                    <div class="pop_more_wrap">
-	                   		<button type="button" class="pop_more" onclick="popMore(this);">더보기<i></i></button>
-	                   </div>
-	                </div><!--// 붙여넣기 -->                
-	
-					<!-- 공통 -->
-					<div>
-		                <table class="layer_tType1">
-		                    <caption>엑셀입력 표</caption>
-		                    <colgroup>
-		                        <col style="width: 95px">
-		                        <col style="width: auto">
-		                    </colgroup>
-		                    <tbody>
-		                        <tr>
-		                            <th>그룹 선택</th>
-		                            <td>
-		                                <label for="" class="label">그룹 선택</label>
-		                                <select id="addrGrpIdInfo" name="addrGrpIdInfo">
-		                                </select>
-	                                    <label for="" class="label">그룹명 입력</label>
-	                                    <input type="text" id="addrGrpNm" name="addrGrpNm" placeholder="새 그룹명을 입력해주세요." onfocus="this.placeholder=''" onblur="this.placeholder='새 그룹명을 입력해주세요.'"class="inputLight" style="width: 300px;">
-	
-		                                <input type="file" id="excelFile" accept=".xls, .xlsx, .txt" onchange="excelExport(event); return false;" style="display:none"/>
-		                                <button type="button" class="excel_btn2 btnType c3"><i class="uproad"></i>엑셀, TXT파일 업로드</button>
-		                            </td>
-		                        </tr>
-		                    </tbody>
-		                </table>
-	                </div>
-					<div class="file_add upload_area">
-						<p><img src="/publish/images/content/file_add.png" alt="파일 붙여넣기">마우스로 엑셀, TXT파일을 여기에 끌어다 놓으세요</p>
-					</div>
-					<div class="excel_middle2">
-						<p>
-							총 <span class="c_e40000 fwBold" id="rowTotCnt">0</span>건 / 중복 <span class="c_002c9a fwBold" id="rowDupCnt">0</span>건
-							&nbsp; 
-							<button type="button" class="btnType btnType6" data-tooltip="addrMassDupli_layer" onclick="GetAddrMassDupli()" id="btnAddrMassDupli">중복번호</button>
-							&nbsp;
-							<button type="button" class="btnType btnType6" data-tooltip="addrMassSaveDupli_layer" onclick="GetAddrMassSaveDupli()" id="btnAddrMassSaveDupli">중복번호</button>
-						</p>
-						<button type="button" class="btnType btnType6 addCallToF">번호추가</button>
-					</div>
-					<div class="drag_drop_wrap callList_box">
-						<img src="/publish/images/content/excel.jpg" style="width: 100%;">
-					</div>
-					<div class="excel_middle">
-						<div class="select_btnWrap clearfix">
-							<div>
-								<button type="button" class="all_del"><i class="remove_img"></i>전체삭제</button>
-								<button type="button" class="select_del"><i class="remove_img"></i>선택삭제</button>
-								<button type="button" class="chkVali_del"><i class="remove_img"></i>오류번호삭제</button>
-								<button type="button" class="check_validity">오류 검사 <i></i></button>
-								<div class="error_hover_cont send_hover_cont addr_hover_cont">
-									<p>팩스 번호 입력 시 해당 팩스 번호에 대한 형식이 어긋나거나 팩스 번호에 오류가 있는지 등을 검사하는 기능</p>
-									<span>(예시) 02-1234-0001(O) / 00100-123-0001(X)</span>
-								</div>
-							</div>
-	
-						</div>
-					</div><!--// 공통 -->     
-	
-					<!-- 붙여놓기 설명 -->
-	                <div class="req_area">
-	                  	<div class="text_box">
-	                    	- 팩스 번호가 입력된 txt 파일을 열어 복사(Ctrl+c) + 붙여넣기(Ctrl+v)로도 입력하실 수 있습니다.<br>
-							- 팩스 번호는 필수입력 항목입니다.<br>
-							- 이름,팩스 번호,메모 순서대로 입력해주세요.(예 : 홍길동,02-1234-5678,메모)<br>
-							- 이름은 24byte, 메모는 250byte까지 입력 가능합니다.<br>
-							- '오류 검사'를 통해 등록된 데이터에 팩스 번호 입력 오류를 확인하실 수 있습니다.
-						</div>
-	                </div>
-	
-	
-	           </div>
-	           <div class="popup_btn_wrap2" style="margin: 0 auto 30px auto;">
-	               <button type="button" id="btnAddrMassReg">등록</button>
-	               <button type="button" id="btnAddrMassClose" class="tooltip-close" data-focus="adr_popup01-close"  data-focus-next="popup02">닫기</button>                      
-	           </div>
+				<p>주소록 상세 결과</p>
+				<button type="button" class="tooltip-close" data-focus="adr_popup14-close"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
+			</div>
+			<div class="layer_in" style="padding:30px 20px;">
+				<div class="table_top">
+					<p>
+						총 <span class="c_e40000" id="errorPopTotCnt">0</span>건 
+						/ 중복 <span class="c_002c9a" id="errorPopDupCnt">0</span>건
+						/ 오류 <span class="c_002c9a" id="errorPopErrorCnt">0</span>건</p>
+						<button type="button" class="excel_btn btnType" id="errorExcelBtn"><i class="downroad"></i>엑셀 다운로드</button>
+				</div>
+				<div class="tb_wrap adr_list" id="tabulator_error">
+				<!-- $tableError 참고  -->
+                </div>
+                <ul class="cf_text_ul">
+                    <li>*중복번호는 하나의 번호만 등록됩니다.</li>
+                    <li>*휴대폰 형식에 맞지 않는 데이터는 삭제 후 업로드 됩니다.</li>
+                    <li>ex) 발송불가 특수문자, 자릿수 오류 등</li>
+                </ul>
+                <div class="popup_btn_wrap2">
+                    <button type="button" class="tooltip-close" data-focus="adr_popup14-close" data-focus-next="adr_popup14">닫기</button>                      
+                </div>
+			</div>
 		</div>
 	</div>
-</form>
+</div>
 <!--// 주소록 대량등록 팝업 -->
 
 <div class="inner">
@@ -1458,35 +1255,25 @@
 			<li class="tab"><button type="button" onclick="TabType5(this,'3'); moveTab('block');">수신거부</button></li>
 			<li class="tab"><button type="button" onclick="TabType5(this,'4'); moveTab('addrMob');">폰주소록 등록</button></li>
 			<li class="tab"><button type="button" onclick="TabType5(this,'5'); moveTab('addrApply');">주소록 입력 대행(무료)</button></li>
-		</ul><!--// tab button -->
+		</ul>
+		<!--// tab button -->
 		<!-- 주소록 관리 - 주소록 관리 -->
 		<div class="adr_cont current" id="tab5_1">
 			<div class="heading">
 				<h2>팩스 주소록 관리</h2>
 	        	<button type="button" class="button info" onclick="infoPop('selectAddrList');">사용안내</button>
 			</div>
-			<%--<div class="titBox">
-				<p>- 연락처를 그룹별로 분류하여 간편하고 편리하게 관리할 수 있습니다(최대 100,000개까지 등록 가능)</p>
-				<p>- 그룹은 그룹 간 이동, 병합 및 복사가 가능합니다.</p>
-				<p>- 주소록은 중복검사가 가능하며 중복된 연락처를 삭제할 수 있습니다. 단, 데이터 양에 따라 시간이 소요될 수 있습니다.</p>
-				<p>- 주소록 관리에서 그룹 또는 연락처를 선택하여 문자를 바로 발송할 수 있습니다.</p>
-				<p>- 주소록 내보내기를 통해 다른 ID로 주소록을 복사할 수 있습니다(그룹 전송만 가능, 보낸 주소록 결과는 최대 90일까지 보관)</p>
-				<p>- 주소록 내보내기 시에는 개인정보보호를 위해 추가 팩스 인증을 실시하며, 팩스 인증은 등록된 발신번호로만 인증 가능합니다.</p>
-				<p>- 고객님께서 보유하신 엑셀파일이나 텍스트파일 등으로 작성된 주소록을 대량 등록할 수 있습니다.</p>
-				<p>- 주소록 등록이 어려우신 경우에는 주소록 입력대행 메뉴를 이용하시면 됩니다.</p>
-				<p>- 주소록 무료대행은 신규 그룹으로 생성됩니다(기존 그룹 수정 불가)</p>
-			</div>--%>
-			
 			<div class="adr1">
 				<!-- 왼쪽 영역 -->
 				<div class="adr1_left" id="adr1_left"></div>
 				<!-- 오른쪽 영역 -->
-				<div class="adr1_right" id="adr1_right">
-				</div>
+				<div class="adr1_right" id="adr1_right"></div>
 			</div>
 		</div>
-	</div><!--// 주소록 관리 - 주소록 관리 -->
-</div><!--// send top -->
+		<!--// 주소록 관리 - 주소록 관리 -->
+	</div>
+	<!--// send top -->
+</div>
 
 <form name="popForm" id="popForm" method="post">
 	<input type="hidden" name="pageType" id="pageType" value=""/> 
 
src/main/webapp/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforClipboard.jsp (added)
+++ src/main/webapp/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforClipboard.jsp
@@ -0,0 +1,580 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+<script type="text/javascript" src="<c:url value='/publish/js/content.js'/>"></script>
+
+<script type="text/javascript">
+$(document).ready(function(){
+	
+	// 중복 휴대폰번호 버튼 노출여부
+// 	$("#btnAddrMassDupli").hide();
+// 	$("#btnAddrMassSaveDupli").hide();
+}); 
+
+
+
+
+function addrGroupLoadAjax(){
+	$("#addrRegistSelect").load("/web/addr/selectAddrGroupAjax.do", function(response, status, xhr){});
+	$("#funcAddrGroupSelect").load("/web/addr/selectAddrGroupAjax.do", function(response, status, xhr){});
+}
+
+
+function insertAddrGroupAjax() {
+	var form = document.addrGrpInsertForm;
+	if(form.addrGrpNm.value == "") {
+		alert("주소록 그룹명을 입력해주세요.");
+		return;
+	}
+	if(!confirm("주소록 그룹을 추가하시겠습니까?")) {
+		return;
+	}
+	var data = new FormData(form);
+	
+	$.ajax({
+		cache : false,
+		url : "<c:url value='/web/addr/insertAddrGroupAjax.do' />", 
+		type : 'POST', 
+		data : data,
+		dataType:'json',
+		processData: false,
+		contentType: false,
+		success : function(returnData, status){
+			if(status == "success") {
+				if("fail"==returnData.result){
+					alert(returnData.message);
+					return;
+				} else if("dupl"==returnData.result) {
+					alert("중복된 그룹명입니다.");
+					return;
+				}
+				alert("등록되었습니다.");
+				listAddrGrp();
+				addrGroupLoadAjax();
+				
+			}else{ alert("ERROR!");return;} 
+		},
+		error: function (e) { alert("저장에 실패하였습니다."); console.log("ERROR : ", e); }
+	});
+	
+}
+
+function insertAddrAjax() {
+	var selectVal = $("#addrRegistSelect option:selected").val();
+	//alert(selectVal);
+	
+	var form = document.addrInsertForm;
+	/*
+	//필수값 아니어서 뺐음
+	if(form.addrNm.value == "") {
+		alert("주소록 이름을 입력하세요");
+		return;
+	}
+	*/
+	if(form.addrPhoneNo.value == "") {
+		alert("주소록 번호를 입력하세요");
+		return;
+	}
+	//if(!confirm("주소록을 추가하시겠습니까?")) {
+	//	return;
+	//}
+	
+	if(!checkHpNum(form.addrPhoneNo.value)){//휴대폰 유효성 검사
+		if(!checkNorPhoneNum(form.addrPhoneNo.value)){//일반전화 유효성 검사
+			
+			alert("잘못된 휴대폰번호 또는 일반전화 번호 입니다.");
+			return false;
+			
+		}
+		
+	}
+	
+	var data = new FormData(form);
+
+	$.ajax({
+		cache : false,
+		url : "<c:url value='/web/mjon/addr/insertAddrAjax.do' />", 
+		type : 'POST', 
+		data : data,
+		dataType:'json',
+		processData: false,
+		contentType: false,
+		success : function(returnData, status){
+			if(status == "success") {
+				if("fail"==returnData.result){
+					alert(returnData.message);
+					return;
+				} else if("dupl"==returnData.result){
+					alert("해당 그룹에 중복된 번호가 있습니다.");
+					return;
+				}
+				//alert("저장 되었습니다.");
+				
+				listAddrGrp();
+				addrGroupLoadAjax();
+				addrLoadAjax();
+				
+				// 주소록그룹 콤보박스 유지
+				setTimeout(setSelectSetting, 500, selectVal);			
+				
+			}else{ alert("ERROR!");return;} 
+		},
+		error: function (e) { alert("저장에 실패하였습니다."); console.log("ERROR : ", e); }
+	});
+	
+}
+
+// 주소록그룹 콤보박스 유지
+function setSelectSetting(selectVal) {
+	$("#addrRegistSelect").val(selectVal).prop("selected", true);	
+}
+	
+function linkPage(pageNo){
+	if ($('#searchKeywordAddr').val() != "" && $('#searchKeywordAddr').val() != null && $('#searchKeywordAddr').val() != undefined) {
+		// 문자전송 검색용
+		$("#msgStartKeyword").val("");
+	}
+
+	var searchForm = document.searchAddrForm;
+	searchForm.pageIndex.value = pageNo;
+	searchForm.pageUnit.value = $('#pageUnit').val();
+	searchForm.searchCondition.value = $('#searchConditionAddr').val();
+	searchForm.searchKeyword.value = $('#searchKeywordAddr').val();
+	searchForm.startKeyword.value = $("#msgStartKeyword").val();
+	
+	var sendData = $(document.searchAddrForm).serializeArray();
+	$("#adr1_right").load("/web/mjon/addr/selectAddrAjax.do", sendData, function(response, status, xhr){tableAllChk();});
+	addrGroupLoadAjax();
+}
+
+
+
+//#############################################################################################
+//Tabulator
+//#############################################################################################
+
+$(document).ready(function(){
+	//Tabulator AJAX Data Loading
+
+
+	
+	//전체 데이터 갯수 구하는 함수
+	function updateTotCnt(data){
+
+		var tabulNm = fn_utils_getTabulatorNm();
+		var tabluC = '.'+tabulNm
+		
+		$(tabluC+" #rowTotCnt").text(data);
+
+	}
+
+    
+    
+	// 오류검사 항목 중복제거
+	function SetTableErrorDupliCheck(sVal) {
+		var isDuplicate = false;
+		if (tableErrorCheckData.length == 0) {
+			tableErrorCheckData.push(sVal);
+		}
+		else {
+			for (var i = 0; i < tableErrorCheckData.length; i++)
+			{
+				if (tableErrorCheckData[i] == sVal) {
+					isDuplicate = true;
+				}
+			}
+			
+			if (isDuplicate) {
+				return;
+			}
+			else {
+				tableErrorCheckData.push(sVal);
+			}
+		}
+	}	
+	
+	
+	// 오류검사 항목 중복제거
+	function SetTableErrorDupliCheck(sVal) {
+		var isDuplicate = false;
+		if (tableErrorCheckData.length == 0) {
+			tableErrorCheckData.push(sVal);
+		}
+		else {
+			for (var i = 0; i < tableErrorCheckData.length; i++)
+			{
+				if (tableErrorCheckData[i] == sVal) {
+					isDuplicate = true;
+				}
+			}
+			
+			if (isDuplicate) {
+				return;
+			}
+			else {
+				tableErrorCheckData.push(sVal);
+			}
+		}
+	}	
+	
+	$('.check_validity').click(function(){
+		tableErrorCheckData.length = 0;	// 오류 번호 배열 초기화
+		
+		var data = $tableClip.getRows();
+		var invalid = $tableClip.getInvalidCells();		//오류 데이터 체크
+		var dataLen = $tableClip.getRows().length;		//연락처 데이터 갯수
+		var totLen = invalid.length;				//오류 데이터 갯수
+		var errMsg = "";							//최종 alert에 표시할 메시지 저장 변수
+		
+		if(dataLen > 0) { //연락처 정보가 있으면 수행
+			if(totLen > 0) { //내용에 오류가 있으면 수행
+				//오류 데이터 값 저장
+				for(var i=0; i < totLen; i++) {
+					var cellValue = invalid[i].getValue();
+					SetTableErrorDupliCheck(cellValue);
+				}
+				
+				for(var i=0; i < dataLen; i++){
+					// 휴대폰번호 체크
+		        	var phone = data[i].getData().phone;
+		        	var valiCheck = checkHpNum(phone);
+		        	if(!valiCheck){
+		        		SetTableErrorDupliCheck(phone);
+		        	}
+				}
+			}
+			else {
+				for(var i=0; i < dataLen; i++){
+					// 휴대폰번호 체크
+		        	var phone = data[i].getData().phone;
+		        	var valiCheck = checkHpNum(phone);
+		        	if(!valiCheck){
+		        		SetTableErrorDupliCheck(phone);
+		        	}
+				}				
+			}
+		}
+		else {
+			alert("연락처를 입력해 주세요.");
+			return false;
+		}
+		
+		if (tableErrorCheckData.length > 0) {
+			for (var i = 0; i < tableErrorCheckData.length; i++)
+			{
+				errMsg += tableErrorCheckData[i];
+				if ((tableErrorCheckData.length - 1) > i) {
+					errMsg += ", ";
+				}
+			}			
+    		alert(errMsg + "의 내용에 오류가 있습니다.");			
+		}
+		else {
+			alert("오류 데이터가 없습니다.");			
+		}
+		
+		return false;		
+	});
+	
+
+	
+	
+	
+	
+
+	
+	//받는 사람 리스트 영역에 클립보드 데이터 가져와보기 
+	// 붙여넣기 기능
+	$('#tabulator_clip').off('paste').on('paste', function (e) {
+// 		fn_ClipMakeTable();
+		fn_errorPopClean();
+		fn_rowCntInit();
+		resetTableFieldsToDefault();
+
+	    var element = e.originalEvent.clipboardData.getData('text');
+	    var elmSplit = element.split("\n");
+	    var realPhone = [];
+	    
+	    for (var i = 0; i < elmSplit.length; i++) {
+	        var splitStr = elmSplit[i].trim();
+	        if (splitStr === "") continue; // 공백 행 무시
+	        
+	        var tabData = splitStr.split("\t");
+	        var comData = splitStr.split(",");
+	        
+	        var splitData = (tabData.length > 1) ? tabData : comData;
+	        
+	        if (splitData.length === 0) {
+	            alert("탭 또는 콤마로 구분하여 데이터를 복사해 주세요.");
+	            return false;
+	        }
+	        
+	        let keys = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
+	        let data = {};
+	        splitData.forEach((item, index) => {
+	            data[keys[index]] = item.trim() || ""; // 빈 문자열로 기본값 설정
+	        });
+	        realPhone.push(data);
+	    }
+	    
+	    console.log('Parsed data:', realPhone);
+	    console.log('Tabulator data before getData:', $tableClip.getData());
+// 	    $tableClip.clearData();
+		$tableClip.setData([{
+		    A: "", B: "", C: "", D: "", E: "", F: "", G: ""
+		}]); // 초기 데이터로 복원
+	    $tableClip.setData(realPhone);
+	    var totRows = $tableClip.getDataCount(); 
+	    updateTotCnt(totRows);
+	    console.log('Tabulator data after getData:', $tableClip.getData());
+	});
+
+
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+});
+
+
+//체크박스 전체선택/해제
+$(document).on("click", "#chkAll", function(e) {
+    var isChecked = $(this).is(":checked");
+    $("input[name=addrCheck]:checkbox").prop("checked", isChecked);
+});
+
+$(document).on("click", "#duplicationChkAll", function(e) {
+    var isChecked = $(this).is(":checked");
+    $("input[name=addrCheck]:checkbox").prop("checked", isChecked);
+});	
+
+//데이터 객체를 생성하는 함수
+function createDataObject(data) {
+	console.log('createDataObject : ', data);
+ return {
+     A: data.A,
+     B: data.B,
+     C: data.C,
+     D: data.D,
+     E: data.E,
+     F: data.F,
+     G: data.G
+ };
+}
+
+
+// 중복 연락처
+function GetAddrMassDupli() {
+	var sHtml = "";
+	sHtml += "<div class='' style='overflow-x:auto; height:350px;'>";
+	sHtml += "<table class='tType4'>";
+	sHtml += "		<colgroup>";
+	sHtml += "			<col style='width:auto' />";
+	sHtml += "		</colgroup>";
+	sHtml += "		<thead>";
+	sHtml += "			<tr>";
+	sHtml += "				<th>중복 휴대폰번호 (" + numberWithCommas(dupliPhoneDataRealList.length) + "개)</th>";
+	sHtml += "			</tr>";
+	sHtml += "		</thead>";
+	sHtml += "		<tbody>";
+	for (var i = 0; i < dupliPhoneDataRealList.length; i++) {
+		sHtml += "		<tr>";
+		sHtml += "			<td>" + dupliPhoneDataRealList[i] + "</td>";
+		sHtml += "		</tr>";
+	}
+	sHtml += "		</tbody>";
+	sHtml += "	</table>";
+	sHtml += "	</div>";
+	
+	$("#addrMassDupli_layer").html(sHtml);
+}
+
+
+</script>
+	             
+	                <!-- 붙여넣기 -->
+	                <div class="popCont pop_more_cont" id="popCont_2">
+	                    <div class="titBox">
+	                        <p>- 엑셀(EXCEL), 텍스트(TXT) 파일로 작성된 주소록 내용을 복사하여 등록 가능합니다.</p>
+	                        <p>- 많은 양의 데이터를 입력하시려면 ‘주소록 복사(Ctrl+C) + 붙여넣기(Ctrl+V)’를 이용해주세요.</p>
+	                        <p>- 입력 내용은 (Tab) 또는 (,) 기호로 구분하여 입력하여야 합니다.</p>
+	                        <p>- 이름 200byte, [*1*]~[*4*] 200byte, 메모 250byte까지 입력 가능합니다.</p>
+	                        <p>- 주소록 등록이 어려우신 경우에는 <a href="<c:url value='/web/mjon/addragency/selectAddrAgencyList.do'/>" style="font-weight: bold; color: blue;">주소록 입력대행</a> 메뉴를 이용하실 수 있습니다. </p>
+<!-- 	                        <button type="button" class="txt_btn" onclick="location.href='/download/addr/주소록_대량등록.zip'"><i></i>TXT샘플 다운로드</button>                         -->
+	                    </div>
+	                    <div class="pop_more_wrap">
+	                   		<button type="button" class="pop_more" onclick="popMore(this);">더보기<i></i></button>
+	                   </div>
+	                </div><!--// 붙여넣기 -->                
+	
+					<!-- 공통 -->
+					<div>
+		                <table class="layer_tType1">
+		                    <caption>엑셀입력 표</caption>
+		                    <colgroup>
+		                        <col style="width: 95px">
+		                        <col style="width: auto">
+		                    </colgroup>
+		                    <tbody>
+		                        <tr>
+		                            <th>그룹 선택</th>
+		                            <td>
+		                                <label for="" class="label">그룹 선택</label>
+		                                <select id="addrGrpIdInfo" name="addrGrpIdInfo">
+		                                </select>
+	                                    <label for="" class="label">그룹명 입력</label>
+	                                    <input type="text" id="addrGrpNm" name="addrGrpNm" placeholder="새 그룹명을 입력해주세요." onfocus="this.placeholder=''" onblur="this.placeholder='새 그룹명을 입력해주세요.'"class="inputLight" style="width: 300px;">
+	
+		                            </td>
+		                        </tr>
+		                    </tbody>
+		                </table>
+	                </div>
+					<div class="excel_middle2">
+						<p>
+							총 <span class="c_e40000 fwBold" id="rowTotCnt">0</span>건 
+							/ 중복 <span class="c_002c9a fwBold" id="rowDupCnt">0</span>건 
+							/ 오류 <span class="c_002c9a fwBold" id="rowErrorCnt">0</span>건 
+							<button type="button" class="btn_list_detail" data-tooltip="adr_popup14"><img src="/publish/images/search.png"></button>
+						</p>
+					</div>
+					
+					
+					
+
+                    <div class="adr_excel" style="margin-top: 13px; overflow-x: auto;">
+                        <!-- thead -->
+                        <div class="adr_hd select_adr_hd" data-group="tableClip">
+							<div style="width: 80px;"></div>
+							<div style="width: 125px;">
+								<label for="" class="label"></label>
+								<select class="field-selector">
+									<option value="">선택하기</option>
+									<option value="addrNm">이름</option>
+									<option value="addrPhoneNo">휴대폰</option>
+									<option value="addrInfo1">[*1*]</option>
+									<option value="addrInfo2">[*2*]</option>
+									<option value="addrInfo3">[*3*]</option>
+									<option value="addrInfo4">[*4*]</option>
+									<option value="addrComment">메모</option>
+								</select>
+							</div>
+							<div style="width: 125px;">
+								<label for="" class="label"></label>
+								<select class="field-selector">
+									<option value="">선택하기</option>
+									<option value="addrNm">이름</option>
+									<option value="addrPhoneNo">휴대폰</option>
+									<option value="addrInfo1">[*1*]</option>
+									<option value="addrInfo2">[*2*]</option>
+									<option value="addrInfo3">[*3*]</option>
+									<option value="addrInfo4">[*4*]</option>
+									<option value="addrComment">메모</option>
+								</select>
+							</div>
+							<div style="width: 125px;">
+								<label for="" class="label"></label>
+								<select class="field-selector">
+									<option value="">선택하기</option>
+									<option value="addrNm">이름</option>
+									<option value="addrPhoneNo">휴대폰</option>
+									<option value="addrInfo1">[*1*]</option>
+									<option value="addrInfo2">[*2*]</option>
+									<option value="addrInfo3">[*3*]</option>
+									<option value="addrInfo4">[*4*]</option>
+									<option value="addrComment">메모</option>
+								</select>
+							</div>
+							<div style="width: 125px;">
+								<label for="" class="label"></label>
+								<select class="field-selector">
+									<option value="">선택하기</option>
+									<option value="addrNm">이름</option>
+									<option value="addrPhoneNo">휴대폰</option>
+									<option value="addrInfo1">[*1*]</option>
+									<option value="addrInfo2">[*2*]</option>
+									<option value="addrInfo3">[*3*]</option>
+									<option value="addrInfo4">[*4*]</option>
+									<option value="addrComment">메모</option>
+								</select>
+							</div>
+							<div style="width: 125px;">
+								<label for="" class="label"></label>
+								<select class="field-selector">
+									<option value="">선택하기</option>
+									<option value="addrNm">이름</option>
+									<option value="addrPhoneNo">휴대폰</option>
+									<option value="addrInfo1">[*1*]</option>
+									<option value="addrInfo2">[*2*]</option>
+									<option value="addrInfo3">[*3*]</option>
+									<option value="addrInfo4">[*4*]</option>
+									<option value="addrComment">메모</option>
+								</select>
+							</div>
+							<div style="width: 125px;">
+								<label for="" class="label"></label>
+								<select class="field-selector">
+									<option value="">선택하기</option>
+									<option value="addrNm">이름</option>
+									<option value="addrPhoneNo">휴대폰</option>
+									<option value="addrInfo1">[*1*]</option>
+									<option value="addrInfo2">[*2*]</option>
+									<option value="addrInfo3">[*3*]</option>
+									<option value="addrInfo4">[*4*]</option>
+									<option value="addrComment">메모</option>
+								</select>
+							</div>
+							<div style="width: 125px;">
+								<label for="" class="label"></label>
+								<select class="field-selector">
+									<option value="">선택하기</option>
+									<option value="addrNm">이름</option>
+									<option value="addrPhoneNo">휴대폰</option>
+									<option value="addrInfo1">[*1*]</option>
+									<option value="addrInfo2">[*2*]</option>
+									<option value="addrInfo3">[*3*]</option>
+									<option value="addrInfo4">[*4*]</option>
+									<option value="addrComment">메모</option>
+								</select>
+							</div>
+                        </div>
+                     </div>					
+					
+					<div class="drag_drop_wrap callList_box" id="tabulator_clip">
+						<img src="/publish/images/content/excel.jpg" style="width: 100%;">
+					</div>
+					<div class="excel_middle">
+						<div class="select_btnWrap clearfix">
+							<div>
+								<button type="button" class="all_del"><i class="remove_img"></i>전체삭제</button>
+								<button type="button" class="select_del"><i class="remove_img"></i>선택삭제</button>
+<!-- 								<button type="button" class="chkVali_del"><i class="remove_img"></i>오류번호삭제</button> -->
+<!-- 								<button type="button" class="check_validity">오류 검사 <i></i></button> -->
+								<div class="error_hover_cont send_hover_cont addr_hover_cont">
+									<p>휴대폰 번호 입력 시 해당 휴대폰 번호에 대한 형식이 어긋나거나 휴대폰 번호에 오류가 있는지 등을 검사하는 기능</p>
+									<span>(예시) 010-1234-0001(O) / 010-123-0001(X)</span>
+								</div>
+							</div>
+	
+						</div>
+					</div><!--// 공통 -->     
+	
+					<!-- 붙여놓기 설명 -->
+<!-- 	                <div class="req_area"> -->
+<!-- 	                  	<div class="text_box"> -->
+<!-- 	                    	- 휴대폰 번호가 입력된 txt 파일을 열어 복사(Ctrl+c) + 붙여넣기(Ctrl+v)로도 입력하실 수 있습니다.<br> -->
+<!-- 							- 휴대폰 번호는 필수입력 항목입니다.<br> -->
+<!-- 							- 이름,휴대폰 번호,[*1*],[*2*],[*3*],[*4*],메모 순서대로 입력해주세요.(예 : 010-1234-5678,홍길동,변수1…메모)<br> -->
+<!-- 							- 이름은 24byte, [*1*]~[*4*] 40byte, 메모는 250byte까지 입력 가능합니다.<br> -->
+<!-- 							- '오류 검사'를 통해 등록된 데이터에 전화번호 입력 오류를 확인하실 수 있습니다. -->
+<!-- 						</div> -->
+<!-- 	                </div> -->
 
src/main/webapp/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforExcel.jsp (added)
+++ src/main/webapp/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforExcel.jsp
@@ -0,0 +1,434 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+<%-- <script type="text/javascript" src="<c:url value='/publish/js/content.js'/>"></script> --%>
+
+<script type="text/javascript">
+
+$(document).ready(function(){
+	
+	// 중복 휴대폰번호 버튼 노출여부
+// 	$("#btnAddrMassDupli").hide();
+// 	$("#btnAddrMassSaveDupli").hide();
+}); 
+
+
+function addrGroupLoadAjax(){
+	$("#addrRegistSelect").load("/web/addr/selectAddrGroupAjax.do", function(response, status, xhr){});
+	$("#funcAddrGroupSelect").load("/web/addr/selectAddrGroupAjax.do", function(response, status, xhr){});
+}
+
+
+function insertAddrGroupAjax() {
+	var form = document.addrGrpInsertForm;
+	if(form.addrGrpNm.value == "") {
+		alert("주소록 그룹명을 입력해주세요.");
+		return;
+	}
+	if(!confirm("주소록 그룹을 추가하시겠습니까?")) {
+		return;
+	}
+	var data = new FormData(form);
+	
+	$.ajax({
+		cache : false,
+		url : "<c:url value='/web/addr/insertAddrGroupAjax.do' />", 
+		type : 'POST', 
+		data : data,
+		dataType:'json',
+		processData: false,
+		contentType: false,
+		success : function(returnData, status){
+			if(status == "success") {
+				if("fail"==returnData.result){
+					alert(returnData.message);
+					return;
+				} else if("dupl"==returnData.result) {
+					alert("중복된 그룹명입니다.");
+					return;
+				}
+				alert("등록되었습니다.");
+				listAddrGrp();
+				addrGroupLoadAjax();
+				
+			}else{ alert("ERROR!");return;} 
+		},
+		error: function (e) { alert("저장에 실패하였습니다."); console.log("ERROR : ", e); }
+	});
+}
+
+
+// 주소록그룹 콤보박스 유지
+function setSelectSetting(selectVal) {
+	$("#addrRegistSelect").val(selectVal).prop("selected", true);	
+}
+
+//#############################################################################################
+//Tabulator
+//#############################################################################################
+
+$(document).ready(function(){
+    // 파일 선택 버튼 클릭 이벤트
+    // 파일 입력 이벤트
+    $("#excelFile").on("change", function(event) {
+    	var fileInfo =  event.target.files;
+    	if(fileInfo.length > 0){
+        	excelFileChange(fileInfo[0]);
+    	} else {
+            fn_loadRemoveActive(); // 파일이 선택되지 않은 경우 로딩 상태 제거
+            $(this).val('');  // 파일 선택 초기화
+        }
+    });
+
+
+	//받는사람 오류번호 삭제 처리해주기
+	$('.chkVali_del').click(function(){
+		//기존 연락처 모두 불러오기
+	    var data = $tableExcel.getRows();
+	    var tableData = [];
+	    var totLen = $tableExcel.getRows().length;
+	    var errCnt = 0;
+	    
+	    if(totLen > 0){
+	    	if(confirm("올바르지 않은 연락처 정보를 삭제 하시겠습니까?")){
+	    		for(var i=0; i < totLen; i++){
+
+	    			
+	            	var phone = data[i].getData().phone;
+	            	var valiCheck = checkHpNum(phone);
+	            	if(valiCheck){
+	            		tableData.push({name: data[i].getData().name.trim(), phone: data[i].getData().phone.trim(), info1:data[i].getData().info1, info2:data[i].getData().info2, info3:data[i].getData().info3, info4:data[i].getData().info4, memo:data[i].getData().memo});
+	            	}else{
+	            		errCnt++;
+	            	}
+	            }
+	            
+	            var removeDuplData = dupliPhoneData(tableData);
+	        	
+	            $tableExcel.setData(removeDuplData);
+	            
+	            //총 받는사람 수 계산
+	            totRows = $tableExcel.getRows().length;
+	            updateTotCnt(totRows);
+	            
+	          	if(errCnt > 0){
+	          		alert(errCnt + " 건의 연락처를 삭제하였습니다.");
+	          		return false;
+	          	}else{
+	          		alert("오류가 있는 연락처가 없습니다.");
+	          	}
+	    	}
+	    }else{
+	    	alert("연락처 정보를 입력해 주세요.");
+	    	return false;
+	    }
+	});
+	
+
+    // 필드 선택 이벤트 핸들러
+    $("#column-selector").on("change", function() {
+        let selectedField = $(this).val();
+        let newValue = prompt("새 값을 입력하세요:");
+        if (newValue !== null) {
+            updateTableField(selectedField, newValue);
+        }
+    });
+});
+
+
+
+
+//#############################################################################################
+//파일업로드 드래그앤 드롭
+//#############################################################################################
+var objDragAndDrop = $(".upload_area");
+$(document).on("dragenter",".upload_area",function(e){
+	e.stopPropagation();
+	e.preventDefault();
+});
+$(document).on("dragover",".upload_area",function(e){
+	e.stopPropagation();
+	e.preventDefault();
+});
+$(document).on("drop",".upload_area",function(e){
+	e.preventDefault();
+	var files = e.originalEvent.dataTransfer.files;
+	excelFileChange(files[0]);
+});
+
+$(document).on('dragenter', function (e){
+	e.stopPropagation();
+	e.preventDefault();
+});
+$(document).on('dragover', function (e){
+	e.stopPropagation();
+	e.preventDefault();
+});
+$(document).on('drop', function (e){
+	e.stopPropagation();
+	e.preventDefault();
+});
+//파일 드래그앤드롭 종료
+
+function excelFileChange(file) {
+	console.log(' :: excelFileChange :: ');
+	fn_errorPopClean(); // 에러 popup 초기화
+	fn_rowCntInit();
+	if (file) {
+		// 파일 크기 체크 (20MB)
+		const maxSize = 20 * 1024 * 1024; // 20MB in bytes
+		if (file.size > maxSize) {
+			alert('파일 크기는 20MB를 초과할 수 없습니다.');
+			return;
+		}
+
+		fn_loadAddActive();
+		var reader = new FileReader();
+		var extension = file.name.split('.').pop().toLowerCase();
+		reader.onload = function(e) {
+			setTimeout(() => { // 파일 읽기 완료 후 실행되도록 함
+				if (extension === 'xlsx') {
+					var data = new Uint8Array(e.target.result);
+					var workbook = XLSX.read(data, {type: 'array'});
+					var firstSheet = workbook.Sheets[workbook.SheetNames[0]];
+					var jsonData = XLSX.utils.sheet_to_json(firstSheet, {header: 1});
+					processExcelData(jsonData);
+				} else if (extension === 'txt') {
+					var textData = e.target.result;
+					processTextData(textData);
+				} else {
+					alert('지원되지 않는 파일 형식입니다.');
+				}
+				fn_loadRemoveActive();
+			}, 0); // 지연 없이 즉시 실행되도록 0ms 지연을 설정
+		};
+		if (extension === 'xlsx') {
+			reader.readAsArrayBuffer(file);
+		} else if (extension === 'txt') {
+			reader.readAsText(file);
+		}
+	}
+}
+
+// 엑셀 데이터 처리 함수
+function processExcelData(data) {
+    var keys = ['A', 'B', 'C'];
+    var tableData = [];
+    var totalRows = data.length - 2; // 전체 데이터 수 (1, 2행 제외)
+
+
+    // 1번째 행부터 입력 
+    data.forEach((row, index) => {
+        var rowData = {};
+        keys.forEach((key, idx) => { // index 변수명 변경 (내부와 외부에서 사용되므로 충돌 방지)
+//         	console.log('row[idx] : ', row[idx]);
+        	 rowData[key] = typeof row[idx] === 'string' ? row[idx].trim() : row[idx]; // 문자열인지 확인하고 trim() 적용
+        });
+        tableData.push(rowData);
+    });
+    updateTable(tableData);
+}
+
+
+// 텍스트 데이터 처리 함수
+function processTextData(text) {
+	console.log(' :: processTextData :: ');
+    var lines = text.split('\n'); // 각 줄을 배열로 분리
+    var keys = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
+    var tableData = [];
+
+    lines.forEach(line => {
+        var rowData = {};
+        var row = line.split(','); // 쉼표로 분리
+        keys.forEach((key, index) => {
+            rowData[key] = row[index] ? row[index].trim() : ""; // 각 컬럼에 대해 기본값을 설정
+        });
+        tableData.push(rowData);
+    });
+
+    updateTable(tableData);
+}
+
+//공통 테이블 업데이트 함수
+function updateTable(tableData) {
+	console.log(' :: updateTable :: ');
+	$tableExcel.setColumns([ // 열 정의를 다시 설정
+		{formatter: "rowSelection", titleFormatter: "rowSelection", clipboard: false, hozAlign: "center", headerHozAlign: "center", headerSort: false, cellClick: function(e, cell) {
+			cell.getRow().toggleSelect();
+		}}
+		,{formatter:"rownum", align:"center", title:"No", hozAlign:"center", headerHozAlign:"center", width:40}
+		,{title: "A", field: "A", hozAlign: "center", headerHozAlign: "center", width: 260, validator: ["maxLength:100", "string"]}
+		,{title: "B", field: "B", hozAlign: "center", headerHozAlign: "center", width: 260, validator: ["maxLength:100", "string"]}
+		,{title: "C", field: "C", hozAlign: "center", headerHozAlign: "center", width: 260, validator: ["maxLength:100", "string"]}
+	]);
+	
+	$tableExcel.setData(tableData).then(() => {
+		// rowTotCnt 업데이트
+		document.getElementById("rowTotCnt").innerText = tableData.length;
+	});
+
+	console.log(' :: fn_loadRemoveActive :: ');
+	fn_loadRemoveActive();
+}
+    
+
+//#############################################################################################
+//등록
+//#############################################################################################
+
+// 주소록 그룹 중복체크
+function getAddrGroupDuplCheckAjax() {
+	var isReturn = true;
+	
+	$.ajax({
+		url : "<c:url value='/web/addr/getAddrGroupDuplCheckAjax.do' />", 
+		type : 'POST', 
+		data : {"addrGrpNm" : $("#addrGrpNm").val()},
+		dataType:'json',
+		async: false,			// 동기
+		success : function(data, status){
+			if(data.isSuccess == true) {
+				if(data.isDupl == true) {
+					//alert("중복된 그룹명입니다.");
+					isReturn = false;
+				}
+			} 
+			else {
+				//alert("Message : " + msg);
+			}			
+		},
+		error: function (e) {
+			//alert("주소록 중복체크에 실패했습니다.");
+		}
+	});
+	
+	return isReturn;	
+}
+
+
+//#############################################################################################
+//파일 불러오기
+//#############################################################################################
+
+//엑섹불러오기 버튼 클릭시 파일 첨부 실행
+$(document).on('click', '.c3', function() {
+	$("#excelFile").click();
+});
+
+//체크박스 전체선택/해제
+$(document).on("click", "#chkAll", function(e) {
+    var isChecked = $(this).is(":checked");
+    $("input[name=addrCheck]:checkbox").prop("checked", isChecked);
+});
+
+$(document).on("click", "#duplicationChkAll", function(e) {
+    var isChecked = $(this).is(":checked");
+    $("input[name=addrCheck]:checkbox").prop("checked", isChecked);
+});	
+
+</script>
+
+<!-- 엑셀입력 -->
+<div class="popCont current pop_more_cont" id="popCont_1">
+	<div class="titBox">
+		<p>- 엑셀(EXCEL) 파일로 주소록을 한 번에 최대 2만건까지 등록하여 간편하게 발송 및 관리하실 수 있습니다.</p>
+		<p>- 반드시 샘플파일을 다운로드하여 작성방법을 확인하신 후 정해진 양식에 맞추어 주소록을 작성하셔야 합니다.</p>
+		<p>  &nbsp;&nbsp;※ 팩스 번호는 지역번호(02, 031, 033 등), 타사부가번호(030*, 050*, 060, 070, 080, 1**)로 시작하는 번호만 발송 가능합니다. </p>
+		<p>  &nbsp;&nbsp;※ 주소록 관리 메뉴에서 다운로드 받으신 엑셀 파일 또한 업로드 양식에 맞추어 작성하셔야 하며, </p>
+		<p>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;주소록에 이미 등록된 팩스 번호는 업데이트 되지 않으므로 기존 주소록에서 해당 팩스 번호를 삭제한 후 재등록해 주시기 바랍니다.</p>
+		<p>- 쉼표(,), 구분선(|), 역슬래시(\, ₩), 작은따옴표('), 큰따옴표(") 등 발송불가 특수문자는 저장되지 않습니다.</p>
+		<p>- 팩스 번호는 필수입력 항목입니다.</p>
+		<p>- 팩스번호 형태는 02-1234-5678 또는 0212345678 모두 가능합니다. 단, 공백은 허용되지 않습니다.</p>
+		<p>- 엑셀 파일에 비밀번호 설정, 제한된 보기, 수식 등이 설정되어 있는 경우 업로드가 불가합니다.</p>
+		<p>- 이름 20byte, 메모 250byte까지 입력 가능합니다.</p>
+		<p>- 첨부가능 파일 : xlsx, xls(최대용량 3MB)</p>
+		<p>- ‘오류 검사’를 통해 등록된 데이터에 팩스 번호 입력 오류를 확인하실 수 있습니다.</p>
+		<p>- 주소록 등록이 어려우신 경우에는 주소록 입력대행 메뉴를 이용하시면 됩니다.</p>
+	</div>
+	<div class="pop_more_wrap">
+		<button type="button" class="pop_more" onclick="popMore(this);">더보기<i></i></button>
+	</div>
+</div>
+<!--// 엑셀입력 -->
+	                
+<!-- 공통 -->
+<div>
+	<table class="layer_tType1">
+		<caption>엑셀입력 표</caption>
+		<colgroup>
+			<col style="width: 95px">
+			<col style="width: auto">
+		</colgroup>
+		<tbody>
+			<tr>
+				<th>그룹 선택</th>
+				<td>
+					<label for="" class="label">그룹 선택</label>
+					<select id="addrGrpIdInfo" name="addrGrpIdInfo">
+					</select>
+					<label for="" class="label">그룹명 입력</label>
+					<input type="text" id="addrGrpNm" name="addrGrpNm" placeholder="새 그룹명을 입력해주세요." onfocus="this.placeholder=''" onblur="this.placeholder='새 그룹명을 입력해주세요.'"class="inputLight" style="width: 300px;">
+					<input type="file" id="excelFile" accept=".xls, .xlsx, .txt" style="display:none"/>
+					<button type="button" class="excel_btn2 btnType c3"><i class="uproad"></i>엑셀, TXT파일 업로드</button>
+				</td>
+			</tr>
+		</tbody>
+	</table>
+</div>
+<div class="file_add upload_area">
+	<p><img src="/publish/images/content/file_add.png" alt="파일 붙여넣기">마우스로 엑셀, TXT파일을 여기에 끌어다 놓으세요</p>
+</div>
+<div class="excel_middle2">
+	<p>
+		총 <span class="c_e40000 fwBold" id="rowTotCnt">0</span>건 
+		/ 중복 <span class="c_002c9a fwBold" id="rowDupCnt">0</span>건 
+		/ 오류 <span class="c_002c9a fwBold" id="rowErrorCnt">0</span>건 
+		<button type="button" class="btn_list_detail" data-tooltip="adr_popup14"><img src="/publish/images/search.png"></button>
+	</p>
+</div>
+<div class="adr_excel" style="margin-top: 13px; overflow-x:auto;">
+	<!-- thead -->
+	<div class="adr_hd select_adr_hd" data-group="tableExcel">
+		<div style="width:80px;"></div>
+		<div style="width:240px;">
+			<label for="" class="label"></label>
+			<select class="field-selector">
+				<option value="">선택하기</option>
+				<option value="addrNm">이름</option>
+				<option value="addrPhoneNo">팩스번호</option>
+				<option value="addrComment">메모</option>
+			</select>
+		</div>
+		<div style="width:240px;">
+			<label for="" class="label"></label>
+			<select class="field-selector">
+				<option value="">선택하기</option>
+				<option value="addrNm">이름</option>
+				<option value="addrPhoneNo">팩스번호</option>
+				<option value="addrComment">메모</option>
+			</select>
+		</div>
+		<div style="width:240px;">
+			<label for="" class="label"></label>
+			<select class="field-selector">
+				<option value="">선택하기</option>
+				<option value="addrNm">이름</option>
+				<option value="addrPhoneNo">팩스번호</option>
+				<option value="addrComment">메모</option>
+			</select>
+		</div>
+	</div>
+</div>
+<div class="drag_drop_wrap callList_box" id="tabulator_excel"></div>
+<div class="excel_middle">
+	<div class="select_btnWrap clearfix">
+		<div>
+			<button type="button" class="all_del"><i class="remove_img"></i>전체삭제</button>
+			<button type="button" class="select_del"><i class="remove_img"></i>선택삭제</button>
+		</div>
+	</div>
+</div>
+<!--// 공통 -->     (No newline at end of file)
 
src/main/webapp/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforSelf.jsp (added)
+++ src/main/webapp/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforSelf.jsp
@@ -0,0 +1,188 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+<script type="text/javascript" src="<c:url value='/publish/js/content.js'/>"></script>
+
+<script type="text/javascript">
+
+$(document).ready(function(){
+	//Tabulator AJAX Data Loading
+	
+
+	
+});
+
+
+$(document).on('change', '#addrGrpIdInfo', function() {
+	if ($("#addrGrpIdInfo option:selected").val() != "NEW") {
+		$("#addrGrpNm").val(""); //	새그룹명 Clear;
+	}
+});
+
+//#############################################################################################
+//파일 불러오기
+//#############################################################################################
+
+
+//체크박스 전체선택/해제
+$(document).on("click", "#chkAll", function(e) {
+    var isChecked = $(this).is(":checked");
+    $("input[name=addrCheck]:checkbox").prop("checked", isChecked);
+});
+
+$(document).on("click", "#duplicationChkAll", function(e) {
+    var isChecked = $(this).is(":checked");
+    $("input[name=addrCheck]:checkbox").prop("checked", isChecked);
+});	
+
+
+function fn_selfUpdataCount(value){
+	
+	//////////////////////////////////////////////////////////////////////////
+	
+	console.log('fn_selfUpdataCount(value) : ', value);
+	let errorCount = 0; // 중복 오류
+	
+	const number = value;
+	const formattedNumber = formatPhoneNumber(number); // 번호 표준화
+	const cleanedNumber = formattedNumber.replace(/[^0-9]/g, ''); // 숫자만 남김
+
+	var existingNumbers = []; // 중복 번호를 저장할 배열
+	
+	// 모든 행의 'addrPhoneNo' 값을 배열에 추가
+	var allRows = $tableSelf.getData(); // 테이블의 모든 데이터를 가져옴
+	allRows.forEach(function(row) {
+		if (row.addrPhoneNo) {
+			const cleanedExistingNumber = row.addrPhoneNo.replace(/[^0-9]/g, ''); // 숫자만 남김
+			existingNumbers.push(cleanedExistingNumber); // 기존 번호를 배열에 추가
+		}
+	});
+	
+	
+	// 중복제거한 데이터 구하기
+	var dataList = new Set(existingNumbers);
+	
+	var totalCnt = dataList.size;
+	
+	var tabulNm = fn_utils_getTabulatorNm();
+	var tabluC = '.'+tabulNm
+	
+	// 중복체크
+	if (existingNumbers.length !== dataList.size) {
+		alert('중복된 값입니다 다시 입력해주세요.');
+		return '';
+	} 
+	
+	if (!isValidPhoneNumber(formattedNumber)) { // 유효성 검사
+		alert('휴대폰 형식에 맞지 않는 데이터입니다.\nex) 발송불가 특수문자, 자릿수 오류 등');
+		$(tabluC+" #rowTotCnt").text(totalCnt-1);
+		return '';
+	}
+	
+
+	var tabulNm = fn_utils_getTabulatorNm();
+	var tabluC = '.'+tabulNm
+	$(tabluC+" #rowTotCnt").text(totalCnt);
+	
+	return formattedNumber;
+}
+
+
+
+</script>
+	             
+	                <!-- 붙여넣기 -->
+	                <div class="popCont pop_more_cont" id="popCont_3">
+	                    <div class="titBox">
+<!-- 	                        <p>- 엑셀(EXCEL), 텍스트(TXT) 파일로 작성된 주소록 내용을 복사하여 등록 가능합니다.</p> -->
+<!-- 	                        <p>- 많은 양의 데이터를 입력하시려면 ‘주소록 복사(Ctrl+C) + 붙여넣기(Ctrl+V)’를 이용해주세요.</p> -->
+	                        <p>- 셀간 이동은 Tab으로 가능합니다.</p>
+	                        <p>- 핸드폰 번호를 입력하지 않은 행은 저장되지 않습니다.</p>
+	                        <p>- 이름 200byte, [*1*]~[*4*] 200byte, 메모 250byte까지 입력 가능합니다.</p>
+	                        <p>- 주소록 등록이 어려우신 경우에는 <a href="<c:url value='/web/mjon/addragency/selectAddrAgencyList.do'/>" style="font-weight: bold; color: blue;">주소록 입력대행</a> 메뉴를 이용하실 수 있습니다. </p>
+<!-- 	                        <button type="button" class="txt_btn" onclick="location.href='/download/addr/주소록_대량등록.zip'"><i></i>TXT샘플 다운로드</button>                         -->
+	                    </div>
+	                    <div class="pop_more_wrap">
+	                   		<button type="button" class="pop_more" onclick="popMore(this);">더보기<i></i></button>
+	                   </div>
+	                </div><!--// 붙여넣기 -->                
+	
+					<!-- 공통 -->
+					<div>
+		                <table class="layer_tType1">
+		                    <caption>엑셀입력 표</caption>
+		                    <colgroup>
+		                        <col style="width: 95px">
+		                        <col style="width: auto">
+		                    </colgroup>
+		                    <tbody>
+		                        <tr>
+		                            <th>그룹 선택</th>
+		                            <td>
+		                                <label for="" class="label">그룹 선택</label>
+		                                <select id="addrGrpIdInfo" name="addrGrpIdInfo">
+		                                </select>
+	                                    <label for="" class="label">그룹명 입력</label>
+	                                    <input type="text" id="addrGrpNm" name="addrGrpNm" placeholder="새 그룹명을 입력해주세요." onfocus="this.placeholder=''" onblur="this.placeholder='새 그룹명을 입력해주세요.'"class="inputLight" style="width: 300px;">
+	
+<!-- 		                                <input type="file" id="excelFile" accept=".xls, .xlsx, .txt" onchange="excelExport(event); return false;" style="display:none"/> -->
+		                                <input type="file" id="excelFile" accept=".xls, .xlsx, .txt" style="display:none"/>
+<!-- 		                                  <button type="button" id="file-load-trigger">Choose File</button> -->
+<!-- 		                                <button type="button" class="excel_btn2 btnType c3"><i class="uproad"></i>엑셀, TXT파일 업로드</button> -->
+		                            </td>
+		                        </tr>
+		                    </tbody>
+		                </table>
+	                </div>
+
+					<div class="excel_middle2">
+						<p>
+							총 <span class="c_e40000 fwBold" id="rowTotCnt">0</span>건 
+<!-- 							/ 중복 <span class="c_002c9a fwBold" id="rowDupCnt">0</span>건  -->
+<!-- 							/ 오류 <span class="c_002c9a fwBold" id="rowErrorCnt">0</span>건  -->
+<!-- 							<button type="button" class="btn_list_detail" data-tooltip="adr_popup14"><img src="/publish/images/search.png"></button> -->
+<!-- 							&nbsp;  -->
+<!-- 							<button type="button" class="btnType btnType6" data-tooltip="addrMassDupli_layer" id="tableSelfDupliBtn">중복번호</button> -->
+<!-- 							<button type="button" class="btnType btnType6" data-tooltip="addrMassDupli_layer" onclick="GetAddrMassDupli()" id="btnAddrMassDupli">중복번호</button> -->
+<!-- 							&nbsp; -->
+<!-- 							<button type="button" class="btnType btnType6" data-tooltip="addrMassSaveDupli_layer" onclick="GetAddrMassSaveDupli()" id="btnAddrMassSaveDupli">중복번호</button> -->
+						</p>
+<!-- 						<button type="button" class="btnType btnType6 addCallToF">번호추가</button> -->
+					</div>
+					
+					
+					
+
+					
+					<div class="drag_drop_wrap callList_box" id="tabulator_self">
+						<img src="/publish/images/content/excel.jpg" style="width: 100%;">
+					</div>
+					<div class="excel_middle">
+						<div class="select_btnWrap clearfix">
+							<div>
+								<button type="button" class="self_all_del"><i class="remove_img"></i>전체삭제</button>
+								<button type="button" class="self_select_del"><i class="remove_img"></i>선택삭제</button>
+<!-- 								<button type="button" class="chkVali_del"><i class="remove_img"></i>오류번호삭제</button> -->
+<!-- 								<button type="button" class="check_validity">오류 검사 <i></i></button> -->
+								<div class="error_hover_cont send_hover_cont addr_hover_cont">
+									<p>휴대폰 번호 입력 시 해당 휴대폰 번호에 대한 형식이 어긋나거나 휴대폰 번호에 오류가 있는지 등을 검사하는 기능</p>
+									<span>(예시) 010-1234-0001(O) / 010-123-0001(X)</span>
+								</div>
+							</div>
+	
+						</div>
+					</div><!--// 공통 -->     
+	
+					<!-- 붙여놓기 설명 -->
+<!-- 	                <div class="req_area"> -->
+<!-- 	                  	<div class="text_box"> -->
+<!-- 	                    	- 휴대폰 번호가 입력된 txt 파일을 열어 복사(Ctrl+c) + 붙여넣기(Ctrl+v)로도 입력하실 수 있습니다.<br> -->
+<!-- 							- 휴대폰 번호는 필수입력 항목입니다.<br> -->
+<!-- 							- 이름,휴대폰 번호,[*1*],[*2*],[*3*],[*4*],메모 순서대로 입력해주세요.(예 : 010-1234-5678,홍길동,변수1…메모)<br> -->
+<!-- 							- 이름은 24byte, [*1*]~[*4*] 40byte, 메모는 250byte까지 입력 가능합니다.<br> -->
+<!-- 							- '오류 검사'를 통해 등록된 데이터에 전화번호 입력 오류를 확인하실 수 있습니다. -->
+<!-- 						</div> -->
+<!-- 	                </div> -->
src/main/webapp/WEB-INF/jsp/web/msgcampain/MsgDataSMLView.jsp
--- src/main/webapp/WEB-INF/jsp/web/msgcampain/MsgDataSMLView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgcampain/MsgDataSMLView.jsp
@@ -3381,10 +3381,10 @@
 									</div>
 									<div class="put_right">
 										<div class="btn_popup_wrap spc_wrap">
-											<button type="button" data-tooltip="popup06"  class="btnType btnType7 popupAddr">주소록 불러오기</button>
+											<button type="button" data-tooltip="popup06" class="btnType btnType7 popupAddr">주소록 불러오기</button>
 										</div>
 										<div class="btn_popup_wrap">
-											<button type="button" data-tooltip="popup02"  class="btnType btnType7">엑셀 불러오기</button>
+											<button type="button" data-tooltip="popup02" class="btnType btnType7">엑셀 불러오기</button>
 										</div>
 										<div class="btn_popup_wrap">
 											<button type="button" data-tooltip="popup03" class="btnType btnType7 tab1">최근 전송내역</button>
 
src/main/webapp/js/web/addr/fax/faxEvent.js (added)
+++ src/main/webapp/js/web/addr/fax/faxEvent.js
@@ -0,0 +1,446 @@
+$(document).ready(function(){
+	//타이틀 select 선택 이벤트
+	$('[data-group]').on('change', '.field-selector', function() {
+		
+		fn_loadAddActive();
+		
+		var group = $(this).closest('[data-group]').data('group');
+		var selectedFields = [];
+		var isDuplicate = false;
+
+		// 타불 객체 가져오기
+		var $objTabul = fn_utils_getTabulator();
+
+		console.log('$objTabul : ', $objTabul);
+		
+		if($objTabul.getData().length < 1){
+			alert('데이터 입력 후 선택해 주세요.');
+			$(this).val(""); 
+			fn_loadRemoveActive();
+			return false;
+		}
+		
+		// 중복체크
+		$('[data-group="' + group + '"] .field-selector').each(function() {
+			var selectedField = $(this).val();
+			if (selectedField) {
+				if (selectedFields.includes(selectedField)) {
+					alert("중복된 필드를 선택할 수 없습니다.");
+					$(this).val(""); // 중복 필드를 선택한 경우 빈 값으로 초기화
+					isDuplicate = true;
+					return false; // 반복문 종료
+				}
+				selectedFields.push(selectedField);
+			}
+		});
+
+		// 데이터 넣기
+		updateTableFields($objTabul, group);
+		
+		// 필드가 휴대폰이면 열 중복체크
+		if($(this).val() == 'addrPhoneNo'){
+			fn_phoneDupl($objTabul);
+		}
+		
+		fn_loadRemoveActive();
+	});
+
+
+	 /**
+	  * @ 핸드폰 중복 데이터
+	  * */
+	 function fn_phoneDupl($objTabul) {
+		 
+		$tableError.clearData();
+
+		var tabulNm = fn_utils_getTabulatorNm();
+		var tabluC = '.'+tabulNm
+		 
+		var data = $objTabul.getData();
+		var phoneNumberChk = false;
+	    var existingNumbers = new Set(); // 배열에서 Set으로 변경
+
+		let errorCount = 0; // 중복 번호 개수를 저장할 변수
+		let duplicateCount = 0; // 중복 번호 개수를 저장할 변수
+
+		const errors = [];  // 오류 데이터를 저장할 배열
+		const newData = []; // 유효한 데이터만 저장할 새로운 배열
+
+		data.forEach((row, index) => {
+	
+			const number = row.addrPhoneNo;
+
+	        // number가 null, undefined, 빈 문자열이거나 숫자인 경우 처리
+	        if (!number || (typeof number === 'string' && !number.trim())){
+	        	console.log("number : ", number);
+	        	 return;
+	        }
+			
+			const formattedNumber = formatPhoneNumber(number); // 번호 표준화
+			const cleanedNumber = formattedNumber.replace(/[^0-9]/g, ''); // 숫자만 남김
+			
+			if (!existingNumbers.has(cleanedNumber)) { // 중복 번호 체크
+				if (isValidPhoneNumber(formattedNumber)) { // 유효성 검사
+					row.addrPhoneNo = formattedNumber;
+					existingNumbers.add(cleanedNumber); // 추가된 번호를 기존 목록에 추가
+					newData.push(row); // 유효한 데이터만 새로운 배열에 추가
+				} else {
+					// 오류: 유효성 통과 못함
+					errorCount++;
+					
+					errors.push({ 
+						name: row.addrNm, // 이름
+						phone: row.addrPhoneNo, // 폰번호
+						result: "오류" // 결과 메시지 추가
+					});
+				}
+			} else {
+				// 중복
+				duplicateCount++;
+				
+				errors.push({ 
+					name: row.addrNm, // 이름
+					phone: row.addrPhoneNo, // 폰번호
+					result: "중복" // 결과 메시지 추가
+				});
+			}
+		});
+
+		// data 배열을 newData 배열로 대체
+		data = newData;
+		
+		// 수정된 데이터로 테이블 업데이트
+		$objTabul.setData(data);
+
+	    $(tabluC+" #rowTotCnt").text($objTabul.getDataCount());
+	    // 중복 카운트
+	    $(tabluC+" #rowDupCnt").text(duplicateCount);
+	    // 에러 카운트
+	    $(tabluC+" #rowErrorCnt").text(errorCount);
+
+	    // popup 영역
+	    $("#errorPopTotCnt").text($objTabul.getDataCount());
+	    // 중복 카운트
+	    $("#errorPopDupCnt").text(duplicateCount);
+	    // 에러 카운트
+	    $("#errorPopErrorCnt").text(errorCount);
+	    // 
+//	    $("#errorPopTotCnt").text(duplicateCount+errorCount);
+
+	    
+		 // 오류 및 중복 데이터를 한 번에 추가
+	    $tableError.setData(errors);
+	    
+	    if(errorCount > 0){
+	    	alert('휴대폰 형식에 맞지 않는 데이터는 삭제 후 업로드 됩니다.\nex) 발송불가 특수문자, 자릿수 오류 등');
+	    }
+
+	    
+
+	}
+	 /*
+	function fn_phoneDupl_old($objTabul) {
+	    var data = $objTabul.getData();
+	    var uniquePhones = new Set();
+	    var rowsToKeep = [];
+	    var rowsToDelete = [];
+	    var phoneNumberChk = false;
+
+
+		var tabulNm = fn_utils_getTabulatorNm();
+		var tabluC = '.'+tabulNm
+	    
+	    data.forEach((row, index) => {
+
+	        if (!isValidKoreanPhoneNumber(row.addrPhoneNo)) {
+	        	phoneNumberChk = true
+	        	return false;
+	        }
+	    	
+	        if (uniquePhones.has(row.addrPhoneNo)) {
+	            rowsToDelete.push(index); // 중복된 행의 인덱스를 기록
+	        } else {
+	            uniquePhones.add(row.addrPhoneNo);
+	            rowsToKeep.push(row); // 고유한 데이터만 추가
+	        }
+	    });
+	    
+	    if(phoneNumberChk){
+	    	alert('휴대폰 형식에 맞지 않는 데이터가 있습니다.\n 확인해 주세요');
+	    }
+
+
+
+	    // 중복된 행 삭제
+	    rowsToDelete.reverse().forEach(index => {
+	        $objTabul.deleteRow(index);
+	    });
+
+	    // 고유한 데이터만 남기고 테이블 업데이트
+	    $objTabul.setData(rowsToKeep);
+	    $(tabluC+" #rowTotCnt").text(rowsToKeep.length);
+	}*/
+
+	//받는사람 전체삭제 버튼 처리
+	$('.all_del').click(function(){
+
+		var tabulNm = fn_utils_getTabulatorNm();
+		var tabluC = '.'+tabulNm
+		
+		var $objTabul = fn_utils_getTabulator();
+		
+		$objTabul.clearData();
+		fn_rowCntInit();
+
+		// select box 초기화
+		$('.field-selector').each(function() { $(this).val(''); });
+	});
+
+	// 받는사람 선택삭제 버튼 처리해주기
+	$('.select_del').click(function(){
+
+		var tabulNm = fn_utils_getTabulatorNm();
+		var tabluC = '.'+tabulNm
+
+		var $objTabul = fn_utils_getTabulator();
+		
+		$(tabluC+" #rowDupCnt").text(0); //중복건수 수정
+		var selectedData = $objTabul.getSelectedRows();
+		
+		if(selectedData == "" || selectedData == null){
+			alert("삭제할 데이터를 선택해 주세요.");
+			return false;
+		}else{ // 선택한 Row 데이터 삭제하기
+			for(var i=0; i < selectedData.length; i++){
+				selectedData[i].delete();
+			}
+		}
+		
+		totRows = $objTabul.getRows().length;
+	    
+		updateTotCnt(totRows);
+	});
+	
+
+	//받는사람 전체삭제 버튼 처리
+	$('.self_all_del').click(function(){
+
+		var tabulNm = fn_utils_getTabulatorNm();
+		var tabluC = '.'+tabulNm
+		
+		var $objTabul = fn_utils_getTabulator();
+		
+	    // 초기화 및 데이터 추가를 한번에 처리
+	    var newTableData = [];
+	    
+	    // 1000개의 빈 행을 미리 준비
+	    for (var i = 0; i < 1000; i++) {
+	    	newTableData.push({
+				addrNm: "", 
+				addrPhoneNo: "", 
+				addrInfo1: "", 
+				addrInfo2: "", 
+				addrInfo3: "", 
+				addrInfo4: "", 
+				addrComment: ""
+	        });
+	    }
+	    
+	    // 기존 데이터 초기화 후, 새로운 데이터를 한 번에 추가
+	    $objTabul.setData(newTableData);
+	    
+	    // 행 수 초기화 함수 호출
+	    fn_rowCntInit();
+	});
+	
+	// 직접입력 받는사람 선택삭제 버튼 처리해주기
+	$('.self_select_del').click(function(){
+		
+		var tabulNm = fn_utils_getTabulatorNm();
+		var tabluC = '.'+tabulNm
+		
+		var $objTabul = fn_utils_getTabulator();
+		
+		$(tabluC+" #rowDupCnt").text(0); //중복건수 수정
+		var selectedData = $objTabul.getSelectedRows();
+		
+		if(selectedData == "" || selectedData == null){
+			alert("삭제할 데이터를 선택해 주세요.");
+			return false;
+		}else{ // 선택한 Row 데이터 삭제하기
+			for(var i=0; i < selectedData.length; i++){
+				selectedData[i].delete();
+			}
+		}
+	    
+	    // 남은 행 수 계산
+	    var totRows = $objTabul.getRows().length;
+
+	    // 1000개 행이 되도록 나머지 행 생성
+	    for (var i = totRows; i < 1000; i++) {
+	        $objTabul.addRow({addrNm: "", addrPhoneNo: "", addrInfo1: "", addrInfo2: "", addrInfo3: "", addrInfo4: "", addrComment: ""});
+	    }
+
+
+	    var existingNumbers = []; // 중복 번호를 저장할 배열
+		// 모든 행의 'addrPhoneNo' 값을 배열에 추가
+		var allRows = $tableSelf.getData(); // 테이블의 모든 데이터를 가져옴
+		allRows.forEach(function(row) {
+			if (row.addrPhoneNo) {
+				const cleanedExistingNumber = row.addrPhoneNo.replace(/[^0-9]/g, ''); // 숫자만 남김
+				existingNumbers.push(cleanedExistingNumber); // 기존 번호를 배열에 추가
+			}
+		});
+		updateTotCnt(existingNumbers.length);
+	});
+		
+	//전체 데이터 갯수 구하는 함수
+	function updateTotCnt(data){
+
+		var tabulNm = fn_utils_getTabulatorNm();
+		var tabluC = '.'+tabulNm
+		
+		$(tabluC+" #rowTotCnt").text(data);
+
+	}
+		
+	/* 
+	* 타이틀 select 선택할때마다 실행해서         
+	* 데이터테이블 필드값 수정                  
+	*/
+	function updateTableFields($objTabul, group) {
+		// 데이터가져오기
+		var currentData = $objTabul.getData();
+		
+		// 필드 초기 값 셋팅
+		var columns = [
+			{formatter: "rowSelection", titleFormatter: "rowSelection", clipboard: false, hozAlign: "center", headerHozAlign: "center", headerSort: false, cellClick: function(e, cell) {
+				cell.getRow().toggleSelect();
+			}}
+			,{formatter:"rownum", align:"center", title:"No", hozAlign:"center", headerHozAlign:"center", width:40}
+		];
+
+		var fieldMapping = [];
+		// 초기 후 필드 값 셋팅하기
+		$('[data-group="' + group + '"] .field-selector').each(function(index) {
+			var selectedField = $(this).val();
+			//  ASCII 문자 코드 사용 - 65=A, 66=B ...
+			var field = String.fromCharCode(65 + index);
+			if (selectedField) {
+				columns.push({
+					title: field
+					, field: selectedField
+					, hozAlign: "center"
+					, headerHozAlign: "center"
+//					, editor: "input"
+					, editor: false
+					, width: 125
+					, validator: ["maxLength:100", "string"]
+				});
+				fieldMapping.push(selectedField);
+			} else {
+				columns.push({
+					title: field
+					, field: field
+					, hozAlign: "center"
+					, headerHozAlign: "center"
+//					, editor: "input"
+					, editor: false
+					, width: 125
+					, validator: ["maxLength:100", "string"]
+				});
+				fieldMapping.push(field);
+			}
+		});
+
+		// 데이터 셋팅
+		var updatedData = currentData.map(row => {
+			var newRow = {};
+			fieldMapping.forEach((field, index) => {
+				newRow[field] = row[Object.keys(row)[index]] || "";
+			});
+			return newRow;
+		});
+
+		$objTabul.setColumns(columns);
+		$objTabul.setData(updatedData);
+	}
+}); 
+
+
+
+
+// 주소록 에러결과 초기화
+function fn_errorPopClean(){
+
+	var tabulNm = fn_utils_getTabulatorNm();
+	var tabluC = '.'+tabulNm
+
+    // popup 영역
+	$tableError.clearData();
+	
+
+    // 중복 카운트
+    $("#errorPopDupCnt").text(0);
+    // 에러 카운트
+    $("#errorPopErrorCnt").text(0);
+    // 
+    $("#errorPopTotCnt").text(0);
+
+	// select box 초기화
+	$(tabluC+' .field-selector').each(function() { $(this).val(''); });
+	
+}
+
+function fn_rowCntInit(){
+
+	var tabulNm = fn_utils_getTabulatorNm();
+	var tabluC = '.'+tabulNm
+	
+	$(tabluC+" #rowTotCnt").text(0); //총건수 수정
+	$(tabluC+" #rowDupCnt").text(0); //중복건수 수정
+	$(tabluC+" #rowErrorCnt").text(0); //중복건수 수정
+}
+
+
+
+//1. 필드 초기화 함수
+function resetTableFieldsToDefault() {
+
+	// 타불 객체 가져오기
+	var $objTabul = fn_utils_getTabulator();
+	
+	// 필드를 A, B, C, D로 초기화
+	var defaultFields = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
+
+	// 테이블의 기존 데이터를 가져옵니다.
+	var currentData = $objTabul.getData();
+
+	// 초기 필드(A, B, C, D 등)를 위한 열 설정
+	var columns = [
+		{formatter: "rowSelection", titleFormatter: "rowSelection", clipboard: false, hozAlign: "center", headerHozAlign: "center", headerSort: false, cellClick: function(e, cell) {
+			cell.getRow().toggleSelect();
+		}},
+		{formatter:"rownum", align:"center", title:"No", hozAlign:"center", headerHozAlign:"center", width:40}
+	];
+
+	// 기본 필드로 열 구성
+	defaultFields.forEach(field => {
+		columns.push({
+			title: field,
+			field: field,
+			hozAlign: "center",
+			headerHozAlign: "center",
+			editor: false, // 편집 비활성화
+			width: 125,
+			validator: ["maxLength:100", "string"]
+		});
+	});
+
+	// 테이블을 기본 필드로 업데이트
+	$objTabul.setColumns(columns);
+//	$objTabul.setData(updatedData);
+}
+
+
+
 
src/main/webapp/js/web/addr/fax/faxTabulator.js (added)
+++ src/main/webapp/js/web/addr/fax/faxTabulator.js
@@ -0,0 +1,93 @@
+
+
+var tableErrorData = [];
+var tableErrorCheckData = [];
+var addrMassDupliSaveList = null;
+
+var gArrRestartIndex = 0;	//배열 재시작카운드
+var gNameList = [];			//치환문자 이름
+var gPhoneList = [];		//받는사람
+var gMemoList = [];			//메모
+
+var $tableExcel = null;		//엑셀입력 탭
+var $tableClip = null;		//붙여넣기 탭
+var $tableSelf = null;		//직접입력 탭
+var $tableError = null;		//에러 팝업 영역
+
+
+$(document).ready(function(){
+
+	//excel 파일 불러오기 tabulator 
+	$tableExcel = new Tabulator("#tabulator_excel", {
+		height:"255px",
+		width:"100%",
+	    layout:"fitColumns",
+	    autoColumns:false,
+	    headerHozAlign:"center", 
+	    validationMode:"highlight",
+	    clipboard:false,
+	    clipboardCopySelector:"table",
+	    clipboardPasteAction:"insert", // insert, update, replace
+	    placeholder:"Excel 파일을 업로드 해주세요.", //fit columns to width of table (optional)
+	 	columns:[ //Define Table Columns
+	 		{formatter:"rowSelection", titleFormatter:"rowSelection",clipboard:false, hozAlign:"center", width:50, headerSort:false, cellClick:function(e, cell){
+	 	        cell.getRow().toggleSelect();
+		 	}}
+	 		,{formatter:"rownum", hozAlign:"center" ,title:"No", hozAlign:"center", headerHozAlign:"center", width:100}
+		 	,{title:"A", field:"A", hozAlign:"center", headerHozAlign: "center", width:260, validator:["maxLength:100", "string"]}
+		 	,{title:"B", field:"B", hozAlign:"center", headerHozAlign: "center", width:260, validator:["maxLength:100", "string"]}
+		 	,{title:"C", field:"C", hozAlign:"center", headerHozAlign: "center", width:260, validator:["maxLength:100", "string"]}
+	 	],
+	 	validationFailed:function(cell, value, parameters){ // 유효성 체크 함수 
+	        var valid = cell.isValid();
+	 		if(!valid){
+	 			alert("양식에 맞지 않는 정보가 입력되었습니다.");
+	 			
+	 			//해당 셀 데이터 삭제
+	 			cell.setValue("");
+	 		}
+	 		return value % parameters.phone;
+	    },
+	});
+	
+	//Tabulator AJAX Data Loading
+	$tableError = new Tabulator("#tabulator_error", {
+		height:"255px",
+		width:"100%",
+	    layout:"fitColumns",
+	    autoColumns:false,
+	    headerHozAlign:"center", 
+	    validationMode:"highlight",
+	    clipboard:false,
+	    clipboardCopySelector:"table",
+	    clipboardPasteAction:"insert", // insert, update, replace
+	    placeholder:"등록 팝업에서 팩스번호를 선택 후 확인해주세요.", //fit columns to width of table (optional)
+	 	columns:[ //Define Table Columns
+		 	{title:"이름", field:"name", hozAlign:"center", headerHozAlign: "center", width:125},
+		 	{title:"팩스번호", field:"phone", hozAlign:"center", headerHozAlign: "center", width:158},
+		 	{title:"미등록 결과", field:"result", hozAlign:"center", headerHozAlign: "center", width:125}
+	 	]
+	});
+	
+	// 타뷸레이터 width값 변경 시 위에 select width 값 변경
+	var titleArray = ["A","B","C","D","E","F","G"];
+
+	$tableExcel.on("columnWidth",function(column){
+		var titleIndex = titleArray.indexOf(column._column.definition.title);
+		titleIndex += 1;
+		if(titleIndex != 0){
+			$('.tableExcel .select_adr_hd>div').eq(titleIndex).css('width', column._column.width);
+		}else{
+			$('.tableExcel .select_adr_hd>div').eq(0).css('width', column._column.width + 40);
+		}
+	});
+
+	$tableExcel.on("scrollHorizontal",function(left){
+	      $(".tableExcel .adr_excel").scrollLeft(left);
+	})
+
+	$(".tableExcel .adr_excel").on("scroll",function(){
+		$(".tableExcel .tabulator-tableholder").scrollLeft($(this).scrollLeft());
+	});
+}); 
+
Add a comment
List