회사에서 프로젝트를 하는데,


jqGrid 내용을 excel로 다운로드 받게 해달라는 요건이 있었다.


금융쪽 SI 프로젝트라서 아무래도 개발환경이 구버전이었따!!


jdk 1.5환경에다가, 이번에 고도화하는 시스템을 15년이상 사용해왔다고 하니 말 다 했지...



jqGrid도 3.xx버전을 사용해서 그런지 table2Excel 도 잘안되는 거 같아서 하다가 포기하고 ㅠㅠ


복잡한 Jakarta POI ?? 이런 것은 사용하지 않았다...


오로지 JSP로만ㅎㅎ;





무튼 본론으로 들어가서!!


1. jqGrid 하단에 엑셀저장 버튼 추가


아래 예제에서는 jqGrid 내에 있는 모든 컬럼들 ( 보이지 않는 컬럼들 포함 ) 을 그대로 엑셀 출력됩니다. (물론 커스터마이징 가능)



$("#jqgridname").jqGrid('navButtonAdd', div_id, {

id : 'pager_excel'

, caption : ''

, title : '엑셀 저장'

, onClickButton : function(e) {

exportExcel($("#jqgridname"), "test.xls");

}

, buttonicon : 'ui-icon-disk'

});





이렇게 해도 버튼이 보이지 않는다면,


아래와 같이 jqGrid navigator 속성을 설정해주세요^^


$("#jqgridname").jqGrid("navGrid", "#pager-jqgridname", {

 add : false        //추가버튼

, edit : false       //수정버튼

, del : false        //삭제버튼

, search : false   //검색버튼

, refresh : false   //갱신버튼

});


이렇게 설정하면 jqGrid의 왼쪽 아래에 디스크모양으로


엑셀버튼이 추가가 될겁니다.





2. export_excel.jsp 


<script type="text/javascript">
     //excel로 출력
     function exportExcel ( pGridObj, pFileName ) {
          var mya = pGridObj.getDataIDs();
          var data = pGridObj.getRowData(mya[0]);     
          var colNames=new Array();
          var ii=0;
          for (var d in data){ colNames[ii++] = d; }    
      
          //컬럼 헤더 가져오기 
          var columnHeader = pGridObj.jqGrid('getGridParam','colNames') + '';
          var arrHeader = columnHeader.split(',');
          var html="<table border=1><tr>";
          for ( var y = 1; y < arrHeader.length; y++ ) {
               html = html + "<td><b>" + encodeURIComponent(arrHeader[y])  + "</b></td>";
          }
          

          html = html + "</tr>";
  
          //값 불러오기
          for(var i=0;i< mya.length;i++) {

/**

* 서브 그리드 사용하시는 분들은 이쪽 커스터마이징 해주시면 되겠죠!??

*/

               var datac= pGridObj.getRowData(mya[i]); 
               html = html +"<tr>";
               for(var j=0; j< colNames.length;j++) html=html + '<td>' + encodeURIComponent(datac[colNames[j]])+"</td>"
               html = html+"</tr>";  
          }

          html=html+"</table>";  // end of line at the end
          document.EXCEL_.csvBuffer.value = html;
          document.EXCEL_.fileName.value = encodeURIComponent(pFileName);
          document.EXCEL_.target='_new';
          document.EXCEL_.submit();
 }
</script>

 

<body>

     <form id="EXCEL_" name="EXCEL_" action="down_excel.jsp" method="post">
          <input type="hidden" name="csvBuffer" id="csvBuffer" value="">
          <input type="hidden" name="fileName" id="fileName" value="">
     </form>

</body>


코드를 대충 보면 이해되겠지만,


jqGrid 옵션을 통해 colNames와 값들을 불러와 


<table>

<tr>

<td></td>

<td></td>

<td></td>

</tr>

<table>


요런 식으로 만들어 줍니다.


이 값들을 form에 셋팅하여 post방식으로 전송!


근데 404 not found 가 뜰 수 있어요^^


경로가 잘못되어서 그런거니 당황하지마시고, form태그의 action을 수정해주세요.





3. down_excel.jsp 


<%@ page import="java.net.URLDecoder, java.net.URLEncoder" %>

     <%
           try {   
  
               String docName  = "";
               String data = request.getParameter("csvBuffer");
               String fileName = request.getParameter("fileName");
  
               //헤더 선택
               String header = request.getHeader("User-Agent");
               if (header.contains("MSIE"))       { header = "MSIE";   }   
               else if(header.contains("Chrome")) { header = "Chrome"; } 
               else if(header.contains("Opera"))  { header  = "Opera"; }
    
               if (data != null && fileName != null ) {
                    data = URLDecoder.decode(data, "UTF-8");
                    fileName = URLDecoder.decode(fileName, "UTF-8");
                    response.setContentType("application/vnd.ms-excel");
   
                    if (header.contains("MSIE")) {
                         docName = URLEncoder.encode(fileName,"UTF-8").replaceAll("\\+""%20");
                         response.setHeader("Content-Disposition""attachment;filename=" + docName + ".xls;");
                    } else if (header.contains("Firefox")) {
                         docName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1"); 
                         response.setHeader("Content-Disposition""attachment; filename=\"" + docName + ".xls\"");
                    } else if (header.contains("Opera")) {
                         docName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1"); 
                         response.setHeader("Content-Disposition""attachment; filename=\"" + docName + ".xls\"");
                    } else if (header.contains("Chrome")) {
                         docName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1"); 
                         response.setHeader("Content-Disposition""attachment; filename=\"" + docName + ".xls\"");
                    }
   
                    response.setHeader("Pragma""no-cache;");
                    response.setHeader("Expires", "-1;");
                    out.println(data);
               }//end of if
           } catch ( Exception e ) {
                e.printStackTrace();
                out.println(e.toString());
           }
%>


브라우져 마다 옵션이 다르기 때문에, response의 헤더만 변경해주고 


엑셀파일 출력을 처리해주시면 됩니다.


\다음 ""주의하세요 ㅋㅋㅋ


+ Opera나 Firefox 사용안할 거 같으면 요령껏 빼주시면 되요!!



전 서브 그리드를 사용해서 커스터마이징을 해줘야합니다...ㅠㅠㅎㅎ


childGridIdList를 넘겨받아서, parentGrid랑 똑같은 방식으로 구현하면 되겠죠!? 





[출처] https://letter20.tistory.com/34




이태원 만두 맛집으로 소문난 쟈니 덤플링!


이태원역 근처에만 3~4개 정도?? 있는듯


장사 엄청 잘되나봐요ㅎㅎ





입구는 요롷게 ㅋㅋㅋ 첨에 간판보고 


별로 고급지게 생기진 않았는데?? 라고 느꼈는데 


내부인테리어는 생각보다 깔끔하고 잘되어있어요


이번에 간 곳은 쟈니덤플링 1호점인듯.








메뉴판!


가격대가 꽤나 저렴해서 평일에도


회사원들이 자주 찾을거 같음...


우리가 시킨 건 군만두 + 만두국 + 마파두부덮밥!


(참고로 둘이서 갔음ㅋㅋㅋㅋㅋ)








군만두가 젤 첨에 나왔는데


비쥬얼이 심상치 않았다ㅋㅋㅋㅋ


그리고 군만두인데 겉은 바삭하지 않고,


육즙이 꽤나 많이 있어서 물만두같았음!!


근데 이게 제일 맛있었음 :D


여태까지 먹어본 만두중에 세 손가락 안에 들었어요~ Good!







이거 홍합탕 아님. 만두국임 ㅋㅋㅋㅋㅋ


메뉴 나오자마자 만두와 홍합의 조합???


첨보는 조합인데... 생각들었지만 그냥 저냥 먹을만 했음.







이건 홍합 다 까고 사진 찍은거 ㅋㅋㅋ


짬뽕같은거 시키면 홍합껍데기 싹다 제거하고 


집도 하는 편이라서...^^







마지막으로 마파두부덮밥.


보시다시피 두부, 소스, 밥 뿐입니다 ㅠㅠ


제 입맛에 이건 생각보다 별로였어요...


군대에서 먹은 마파두부덮밥하고 별 차이 못느꼈음...






풀샷^^




메뉴3개를 시킨다면 식사2, 만두1 보단, 


식사1, 만두2를 추천합니다 ㅎㅎ



평점 3.8/5.0 


만두가 땡길 땐 요기를 다시 찾겠지만,


식사하러 가지는 않을듯 ㅎㅎ


만두가 메인입니다!




사실 이태원에 간 이유는 뮤지컬 아이다를 보러...!


다음엔 아이다 후기를 포스팅할게요~ ㅂㅂ


 

평점 4.2/5.0

 

 

유튜브에서 요즘 굉장히 인기를 끌고 있는 조던 피터슨.

 

유튜브에서 조던 피터슨을 처음 보았고, 사람들이 듣고 싶은 좋은 말을 하는 게 아니라,

 

자신의 생각을 있는 그대로 소신있게 말하는 그의 태도에 매료되었다.

 

뼈 때리는 말 너무 좋아요ㅠㅜ

 

 

 

이 영상은 앵커 캐시 뉴먼과 조던 피터슨이 남녀 임금격차에 대해 토론하는 꽤 유명한 영상이다.

 

22:10 쯤의 대화에서 나오는 피터슨의 순발력에 와아...

 

말을 어쩜 그리 잘해요?!! sexy guy 

 

 

1장은 바닷가재라는 흥미로운 얘깃거리로 시작한다.

 

암컷 바닷가재는 수컷바닷가재들의 서열 싸움이 끝날 때까지 지켜보다 최후의 승자가 결정되면 그 때 구애를 시작하여

 

모든 일을 치른 후, 암컷은 수정란을 잔뜩 품고 보금자리를 떠나고 또 다른 암컷이 찾아와 이를 반복한다.

 

바닷가재와 인간의 삶이 크게 다르지 않다는 생각이 들었고, 세상은 원래 불공평한 것이었다.

 

3억 5천만 년이라는 긴 세월을 거친 바닷가재의 역사를 통해 알 수 있는 사실은,

 

서열 구조가 생명체의 생존과 적응에 필수적이었다는 점이다.

 

 

 

 

심오한 그림이 기분 나쁘지 않고, 매력있다 :D

 

조던 피터슨이 유튜브나 공개적인 자리에서 자주 하는 말ㅋㅋㅋ

 

세상을 탓하기 전에 방부터 정리하세요^^

 

 

 

 

 

소크라테스가 지혜롭다고 평가받는 이유

 

 

 

기억에 남는 문장

 

들의 백합화가 어떻게 자라는가 생각하여 보라 수고도 아니하고 길쌈도 아니하느니라


그러나 내가 너희에게 말하노니 솔로몬의 모든 영광으로도 입은 것이 이 꽃 하나만 같지 못하였느니라


오늘 있다가 내일 아궁이에 던져지는 들풀도 하나님이 이렇게 입히시거든 하물며 너희일까보냐 믿음이 작은 자들아


그러므로 염려하여 이르기를 무엇을 먹을까 무엇을 마실까 무엇을 입을까 하지 말라


이는 다 이방인들이 구하는 것이라 너희 하늘 아버지께서 이 모든 것이 너희에게 있어야 할 줄을 아시느니라


그런즉 너희는 먼저 그의 나라와 그의 의를 구하라 그리하면 이 모든 것을 너희에게 더하시리라


그러므로 내일 일을 위하여 염려하지 말라 내일 일은 내일이 염려할 것이요 한 날의 괴로움은 그 날로 족하니라  

  

(마태복음 6장 28 ~34절)

 

 

p18.

우리 인생이 살 만한 가치가 있고 우리가 존재하는 이유가 있다는 것을 증명하기 위해서라도 짐을 짊어져야 한다.


p104. 

왜 살아야 하는지를 아는 사람, 삶의 의미를 아는 사람은 어떻게든 살아갈 수 있다

p139. 

그동안 고루하고 답답하다며 무시해 온 부모 세대 문화의 가치가 존재의 의미를 확인하고 충만한 삶을 사는 데 필요하다는 것을 깨닫게 되는 순간이 있다.

p146. 

행복은 산 정상에서 느끼는 잠깐의 만족이 아니라, 산을 오르는 길에서 느끼는 희망이다.

p154. 

원하는 것보다는 필요한 것을 얻는 게 훨씬 좋다.

p273. 

문제가 해결되면 사람들은 그런 문제가 있었다는 사실조차 잊어버린다.

p489. 

모든 것이 좋다. 지금만큼은.

 

 

'Culture > Book' 카테고리의 다른 글

테드창 - EXHALATION (숨)  (0) 2020.02.08

+ Recent posts