Hello World?

JQGrid 엑셀 출력기능 추가 본문

JQUERY/JQGRID

JQGrid 엑셀 출력기능 추가

쮠이 2015. 12. 24. 09:57

JQGrid 내에 있는 모든 컬럼들 ( 보이지 않는 컬럼들 포함 ) 을 그대로 엑셀 출력하기 위한 기능이다

 

JQGrid 에 버튼을 추가하고 버튼 클릭시 엑셀파일로 저장할 수 있도록 기능 추가를 해보도록 하자

 

우선 JQGrid 에서 저장버튼을 추가한다.

 

     $("#jqgridname").jqGrid('navButtonAdd', div_id, {
          id:'pager_excel'
          caption:'',
          title:'엑셀 다운',
          onClickButton : function(e) {
               exportExcel ( $("#jqgridname"), "test.xls" );
          }, buttonicon:'ui-icon-arrowthickstop-1-s'
     });  

 

위와 같이 아이콘을 추가했다면, JQGrid 아래에 툴팁으로 엑셀다운이라는 버튼이 추가가 될것이다.

 

 

이제 ExportExcel 이라는 파일을 구현해보도록 하자

 

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>

 

     <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>

 

JQGrid에서 제공하는 JQGrid 질의 함수를 통해 ColNames 를 모두 받아온다.

이때 반환되는 데이터는 , 로 나누어져 있기 때문에 잘라내서 엑셀 첫번째 줄에 세팅해준다.

테이블로 내용을 작성하여 폼의 hidden으로 데이터를 넘긴다.

excel_down.jsp 에서 파일을 다운받을 수 있도록 폼 서브밋을 실행한다

 

 

 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의 헤더만 변경해주고 엑셀파일을 출력하도록 처리하였다