반응형

자바스크립트에서 table 내용 엑셀 다운로드

 

HTML 로 table 을 생성하고, 해당 table 에 뿌려진 데이터를 엑셀로 다운로드 받을 수 있도록 하는 기능을 알아봅시다.

 

회사 프로젝트 내에 동일한 기능이 있었지만, Back-End 까지 코드를 수정해야하기 때문에 번거로웠습니다. 백엔드까지 가지않고, 프론트에서 해결할 수 있는 방법을 드디어 찾았습니다.

 

먼저, 엑셀 다운로드하고자 하는 table 에 class 또는 id 를 부여합니다. 예를 들면, 아래와 같이 구현되어있을 것입니다.

<table class="table" id="resultTable">
	<thead>
    	<tr>
          <td>sample</td>
          <td>sample</td>
          <td>sample</td>
        </tr>
    </thead>
   
   <tbody>
      <tr>
          <td>data1</td>
          <td>data2</td>
      </tr>
      <tr>
          <td>data3</td>
          <td>data4</td>
      </tr>	
      <tr>
          <td>data5</td>
          <td>data6</td>
      </tr>
    </tbody>
</table>

제가 회사에서 사용한 table 은 동적으로 생성되었으므로, 위에처럼 구성되어있진 않지만 참고용으로 만들었습니다. 그리고 엑셀 다운로드 버튼이 있어야겠죠?

<button type="button" id="btnExcel"><span>엑셀다운로드</span></button>

이러한 버튼을 추가해줍니다. 

 

위 버튼내에 onclick 이벤트를 만들어주거나 jQuery 를 사용하며 click event function 을 만들어줍니다. 그 안에 아래와 같은 코드만 넣어주면 성공!

// 엑셀 다운로드
function fnExcelDownload(id, title) {
    var tab_text = '<html xmlns:x="urn:schemas-microsoft-com:office:excel">';
    tab_text += '<head><meta http-equiv="content-type" content="application/vnd.ms-excel; charset=UTF-8">';
    tab_text += '<xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>'
    tab_text += '<x:Name>Sheet</x:Name>';
    tab_text += '<x:WorksheetOptions><x:Panes></x:Panes></x:WorksheetOptions></x:ExcelWorksheet>';
    tab_text += '</x:ExcelWorksheets></x:ExcelWorkbook></xml></head><body>';
    tab_text += "<table border='1px'>";
    var exportTable = $('#' + id).clone();
    exportTable.find('input').each(function (index, elem) { $(elem).remove(); });
    tab_text += exportTable.html();
    tab_text += '</table></body></html>';
    var data_type = 'data:application/vnd.ms-excel';
    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");
    var fileName = title + '.xls';

    // IE 환경에서 다운로드
    if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {
    if (window.navigator.msSaveBlob) {
    var blob = new Blob([tab_text], {
    type: "application/csv;charset=utf-8;"
    });
    navigator.msSaveBlob(blob, fileName);
    }
    } else {
    var blob2 = new Blob([tab_text], {
    type: "application/csv;charset=utf-8;"
    });
    var filename = fileName;
    var elem = window.document.createElement('a');
    elem.href = window.URL.createObjectURL(blob2);
    elem.download = filename;
    document.body.appendChild(elem);
    elem.click();
    document.body.removeChild(elem);
    }

};

 

저는 따로 함수로 만들어서 버튼을 클릭할 때마다 해당 함수가 실행되도록 만들었습니다. 위 코드는 Chrome 뿐만 아니라 IE 환경에서도 실행이 잘되는 것을 확인하였습니다. 

 

다만, 다중 시트를 만들어서 2개의 HTML table 을 Excel 로 export 하는 건 아직 진행중입니다 ㅠㅠ...

감사합니다. 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기