POI

thyme·2022년 6월 24일
0

입사하자마자 만들었었던 어드민 페이지를 개선할 일이 생겼었다

무엇을 해야하나요?
1. 요청 ->요청할 갯수와 ID들을 받아서 ->갯수만큼 랜덤으로 시리얼 생성 -> 데이터베이스에 시리얼 생성을 요청했다는 Log Group 테이블에 INSERT -> Log Group 테이블에서 ID를 가져와서 -> 실제 로그 데이터베이스에 INSERT -> 조합해서 엑셀로 출력
2. 생성한 모든 시리얼을 엑셀로 출력

렛츠 기릿...

    <button type="button" class="bt-rounded btn-primary btn-lg"
                            name="createSerial" id="createSerial"
                            style="font-size: 15px; margin-left: 10px;">시리얼 생성하기</button>

createSerial이라는 아이디를 가진 버튼을 누르면


    $(document).on("click","#createSerial",function() {
  		var chk = confirm("시리얼을 생성하시겠습니까?");
  		
  			if (chk == true) {
  					var c = $(this);
  					var tr = c.parent().parent();
  					var td = tr.children();
  					var active = td.eq(0).text();
  					var no = td.eq(0).text();
  					var no2 = td.eq(2).text();
  	
  					console.log(no);

  					
  					var id = no;
				
  					 
  					 
  					$.ajax(
  							{
  									url : '/admin/createSerial',
  									dataType : 'text',
  									async    : false,
  									type : 'GET',
  									 async: false,
  									 data: {
  										id: id,
  										name : no2
  								      },
  								      
  								      success: function(data){
  								    	  

    								    	window.name = "createSerial";
    										var url = "/admin/createSerial";
    										var width = '1000';
    										var height = '800';
    										var left = Math.ceil((window.screen.width - width) / 2);
    										var top = Math.ceil((window.screen.height - height) / 2);
    										window.open('/admin/createSerial?id=' + id, 'pop', 'width=' + width
    												+ ', height=' + height + ', left=' + left
    												+ ', top=' + top);
  								    	  
  								    	  
  								      }
  								})
  			}else{
  				return false;
  			}
  			
    
    });
    
    
	int i = 14;
			
	String serial = getRandomSerial(i);


	static String getRandomSerial(int i) {

		String serialRandom = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789";

		StringBuilder builder = new StringBuilder();

		for (int a = 0; a < i; a++) {

			int index = (int) (serialRandom.length() * Math.random());

			builder.append(serialRandom.charAt(index));
		}

		return builder.toString();
	}
	

이런식으로 시리얼을 생성해서 랜덤으로 일단 넣어준다
이건 중요한거아니니까 많은 코드... 스킵...^^..

  <p>전체선택 <input type="checkbox" id="allCheck"/></p>

	<div class="form-group" id="container">
                    </div>
                 

         
         <p>발행할 시리얼 갯수 :
         <input type="number" id="num" name="num" min="1" value="1" class="form-control"  style="width: 300px;"/>
                    </p>
  				</div>

var container = document.getElementById("container");
var checkArrString ="";
var name = '${name}';
var id = '${id}';

var containerHtml = "";

if(name != null && id != null){

	var spli = name.split(',');
	var spli2 = id.split(',');
	
	
	for(var i = 0; i<spli.length; i++){
		console.log(spli[i]);

	containerHtml = containerHtml + '<input type="text" id="'+spli2[i]+'"readonly="readonly" class="form-control" style="width: 700px;" value="'+spli[i]+'"/><input type="checkbox" value="'+spli2[i]+'" pc_name="'+spli[i]+'" id="serialCheck" name="serialCheck"/>';

	}
	container.innerHTML = containerHtml;

	
}

왜 forEach 안돌리고 script를 썼냐면 데이터베이스 한 컬럼에 쉼표로 구분해서 AAA,BBB,CCC 이런식으로 들어가있어서 split으로 처리하고 그려줘야된다

선택했다 치고 시리얼 생성했다 치자
전체 엑셀 출력

	location.href="/admin/getAllSerial?fileName=시리얼.xlsx&&daId=" +id; 

@RequestMapping(value="/getAllSerial", method=RequestMethod.GET)
	public void getAllSerial(HttpServletRequest request, HttpServletResponse response) throws Exception{


		int id = Integer.parseInt(String.valueOf(request.getParameter("id")));
		
		System.out.println(id);
		
		List<Map<String,Object>> getAllSerialMap = adminService.getAllSerial(id);
		 
		Workbook wb = null;

		 wb = new SXSSFWorkbook();
		 
		 Row row;
		 org.apache.poi.ss.usermodel.Cell cell;
		 org.apache.poi.ss.usermodel.Sheet sheet;
		 
		 String sheetName = WorkbookUtil.createSafeSheetName("Serial");              
		 sheet = wb.createSheet(sheetName);
		 
		 CellStyle cs = wb.createCellStyle();
		 
		 row = sheet.createRow(0);
		 
		 

         cell = row.createCell(0);
         cell.setCellValue("이름");
         setHeaderCS(cs, cell);
         
      
         cell = row.createCell(1);
         cell.setCellValue("QR코드 URL");
         setHeaderCS(cs, cell);
         
   
         cell = row.createCell(2);
         cell.setCellValue("시리얼");
         setHeaderCS(cs, cell);

		
		for(int i = 0; i<getAllSerialMap.size(); i++) {
			
			Map<String,Object> seMap = getAllSerialMap.get(i);
			
			
			String pcName = (String)seMap.get("name");
			
			String serial = (String)seMap.get("serial_no");
			
			
		 	String qrCodeUrl ="QR 코드 URI";



			 	
			 	row = sheet.createRow((i+1));
			 	
			 	cell = row.createCell(0);
			 	cell.setCellValue(name);
			 	cell = row.createCell(1);
			 	cell.setCellValue(qrCodeUrl);
			 	cell = row.createCell(2);
			 	cell.setCellValue(serial);
			 	
			 	
			 	
			 	


			
	         
			
			
			
		}
		
		try {
		
			
		 	
		 	String fileName = (String) request.getParameter("fileName");
		 	
		 	response.setContentType("application/octet-stream;");
		 	response.setHeader("Content-Disposition", "attachment; filename*=" +  "UTF-8" + "''" + URLEncoder.encode(fileName, "UTF-8"));
		 	
		 	response.setHeader("Pragma", "no-cache;");
		 	response.setHeader("Expires", "-1;");
		 	
		 	
			FileOutputStream fos =  new FileOutputStream(path);
			wb.write(response.getOutputStream());
			fos.flush();
			
		
		
		}catch(Exception e) {
			
		}finally {
			
		}
		
		
	}

클라이언트단에서 다운을 위한 설정들이

	
		 	response.setContentType("application/octet-stream;");
		 	response.setHeader("Content-Disposition", "attachment; filename*=" +  "UTF-8" + "''" + URLEncoder.encode(fileName, "UTF-8"));
		 	
		 	response.setHeader("Pragma", "no-cache;");
		 	response.setHeader("Expires", "-1;");

얘네다
백엔드에서 다 처리 해줬기때문에 그냥 url만 지정해서 get으로 넘겨버리면 끝

밑에는 프론트에서 그려버리고 cvc로 출력하는 방식

$(document).on("click","#sub",function(){	
	var checkArr = new Array();
	var nameArr = new Array();
	$("input:checkbox[name='serialCheck']:checked").each(function(){
		var checked = $(this).val();
		checkArr.push(checked);
	
		
		var name = $(this).attr("name");
		nameArr.push(name);	

		
		checkArrString = checkArr.join(',').replaceAll(' ', '').replace(']', '').replace('[','');
		console.log(checkArrString);
		
		
		
		
})


var check = confirm("발행할 시리얼 갯수는 " + $('#num').val() + "장입니다");

	var url = location.href;
	

	var parameter = (url.slice(url.indexOf('?') + 2, url.length)).split('=');	
	
	console.log(parameter[1]);

	
	
	var form = new FormData();
	form.append("checkPcId", checkArrString);
	form.append("number",  $('#num').val());
	form.append("id", parameter[1]);
	form.append("name", nameArr);
	
	
	
	
	if (check == true) {
		
		$.ajax(
				{
						url : '/admin/createSerialRequest',
						type : 'POST',
						enctype: 'multipart/form-data',
						processData : false,
				       	contentType : false,
				
						 data: 
							
							form,

						 complete : function(res){ 		
							 var json = JSON.stringify(res);
							var json_ = JSON.parse(json);
						 	var json__ = JSON.parse(json_.responseText);
						 	var  list = json__.data;
		 	
							alert($('#num').val() + "장의 시리얼이 발행되었습니다.");
							
							document.getElementById("make").innerHTML = '<br><button class="btn btn-primary" id="exel" name="exel" >엑셀파일로 내보내기</button>';


							$(document).on("click","#exel",function(){
								
								$.ajax({
								    type : 'POST',
								    url : '/admin/getSerialExelFile',
								    dataType : 'text',
								    data : {data : JSON.stringify(json__.data)},
								    
									
								    success : function(result) {
										
							
								    	var arr2 = new Array();
								    	
								    	

								    	
								    	for(var i = 0; i<list.list.length; i++){
									    	var arr = new Array();	    		
								    		console.log(list.list[i]);
								    		
								    
								    		var serial_no = list.list[i].serial_no;
								    		var id = list.list[i].id;
						    		var qrCodeUrl = "QR CODE URI";
								arr.push(list.list[i].pcName);
arr.push(qrCodeUrl);
								    		arr.push(serial_no);
arr2.push(arr);
	
								    	}
			          generateCSV(arr2);

								    },
								    error : function(request, status, error) {
								        console.log(error)
								    }
								
								})
								
								
								
							});

							
						
						  					
					      }
					});     


	}else{
		return false;
	}
	
	
});

아이디랑 이름, 갯수 체크해서 일단 시리얼 생성해주고 끝나면 엑셀로 출력하는 버튼이 생긴다

엑셀로 출력하는 버튼을 클릭하면

function generateCSV(res) {
    var csv = '컬럼들\n';
    res.forEach(function(row) {
        csv += row.join(',');
        csv += "\n";
    });

    var hiddenElement = document.createElement('a');
    hiddenElement.href = 'data:text/csv;charset=utf-8,' + encodeURI(csv);
    hiddenElement.target = '_blank';
    hiddenElement.download = 'data.csv';
    hiddenElement.click();
}

함수 호출, 끝!

profile
음악하다가 개발자로 취업한 썰 푼다

0개의 댓글