자바스크립트로 HTML 테이블을 엑셀로 Export 하기

참조 https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md

위 참조 경로에서 txt파일이나 csv파일로 저장하는 방법 확인할 수 있음.

  1. 전체 소스코드

        
       <head>
       <script type="text/javascript" src="js/filesaver.js"></script>   
       </head>
       <body>
         <table id="table_id">
           <tr>                                                                
             <th width="140">산출지표</th>
             <th width="95">A</th>
             <th width="95">B</th>
             <th width="95">C</th>
             <th width="95">Total</th>
           </tr>
           <tr>                                                                
             <th width="140">예산</th>
             <th width="95">10,000,000</th>
             <th width="95">120,000,000</th>
             <th width="95">10,800,000</th>
             <th width="95">90,000,000</th>
           </tr>
         </table>
         <br/>
         <input type="button" id="exportExcel" value="Save as Excel" onclick="javascript:fnExcelReport('table_id', '파일명1');" />            
       </body>
           
       <script type="text/javascript">
         function fnExcelReport(id, name) {
               var tab_text = '<html xmlns:x="urn:schemas-microsoft-com:office:excel">';
               tab_text = tab_text + '<head><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>';
               tab_text = tab_text + '<x:Name>Sheet1</x:Name>';
               tab_text = tab_text + '<x:WorksheetOptions><x:Panes></x:Panes></x:WorksheetOptions></x:ExcelWorksheet>';
               tab_text = tab_text + '</x:ExcelWorksheets></x:ExcelWorkbook></xml></head><body>';
               tab_text = tab_text + "<table border='1px'>";
               var exportTable = $('#' + id).clone();
               exportTable.find('input').each(function (index, elem) { $(elem).remove(); });
               tab_text = tab_text + exportTable.html();
               tab_text = tab_text + '</table></body></html>';
               var fileName = name + '.xls';
        
               //Save the file
               var blob = new Blob([tab_text], { type: "application/vnd.ms-excel;charset=euc-kr" })
               window.saveAs(blob, fileName);     
           }
         </script>
        
    

    fnExcelReport(id, name) 에서, id: 테이블 id name: 저장하고자 하는 파일명

  2. 해당 작업을 실행시키려면, 아래 js 코드를 ../js/FileSaver.js 로 저장

        
       /* FileSaver.js
        * A saveAs() FileSaver implementation.
        * 2014-07-25
        *
        * By Eli Grey, http://eligrey.com
        * License: X11/MIT
        *   See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md
        */
        
       /*global self */
       /*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */
        
       /*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
        
       var saveAs = saveAs
         // IE 10+ (native saveAs)
         || (typeof navigator !== "undefined" &&
             navigator.msSaveOrOpenBlob && navigator.msSaveOrOpenBlob.bind(navigator))
         // Everyone else
         || (function(view) {
         "use strict";
         // IE <10 is explicitly unsupported
         if (typeof navigator !== "undefined" &&
             /MSIE [1-9]\./.test(navigator.userAgent)) {
             return;
         }
         var
               doc = view.document
               // only get URL when necessary in case Blob.js hasn't overridden it yet
             , get_URL = function() {
                 return view.URL || view.webkitURL || view;
             }
             , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
             , can_use_save_link = !view.externalHost && "download" in save_link
             , click = function(node) {
                 var event = doc.createEvent("MouseEvents");
                 event.initMouseEvent(
                     "click", true, false, view, 0, 0, 0, 0, 0
                     , false, false, false, false, 0, null
                 );
                 node.dispatchEvent(event);
             }
             , webkit_req_fs = view.webkitRequestFileSystem
             , req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem
             , throw_outside = function(ex) {
                 (view.setImmediate || view.setTimeout)(function() {
                     throw ex;
                 }, 0);
             }
             , force_saveable_type = "application/octet-stream"
             , fs_min_size = 0
             // See https://code.google.com/p/chromium/issues/detail?id=375297#c7 for
             // the reasoning behind the timeout and revocation flow
             , arbitrary_revoke_timeout = 10
             , revoke = function(file) {
                 var revoker = function() {
                     if (typeof file === "string") { // file is an object URL
                         get_URL().revokeObjectURL(file);
                     } else { // file is a File
                         file.remove();
                     }
                 };
                 if (view.chrome) {
                     revoker();
                 } else {
                     setTimeout(revoker, arbitrary_revoke_timeout);
                 }
             }
             , dispatch = function(filesaver, event_types, event) {
                 event_types = [].concat(event_types);
                 var i = event_types.length;
                 while (i--) {
                     var listener = filesaver["on" + event_types[i]];
                     if (typeof listener === "function") {
                         try {
                             listener.call(filesaver, event || filesaver);
                         } catch (ex) {
                             throw_outside(ex);
                         }
                     }
                 }
             }
             , FileSaver = function(blob, name) {
                 // First try a.download, then web filesystem, then object URLs
                 var
                       filesaver = this
                     , type = blob.type
                     , blob_changed = false
                     , object_url
                     , target_view
                     , dispatch_all = function() {
                         dispatch(filesaver, "writestart progress write writeend".split(" "));
                     }
                     // on any filesys errors revert to saving with object URLs
                     , fs_error = function() {
                         // don't create more object URLs than needed
                         if (blob_changed || !object_url) {
                             object_url = get_URL().createObjectURL(blob);
                         }
                         if (target_view) {
                             target_view.location.href = object_url;
                         } else {
                             var new_tab = view.open(object_url, "_blank");
                             if (new_tab == undefined && typeof safari !== "undefined") {
                                 //Apple do not allow window.open, see http://bit.ly/1kZffRI
                                 view.location.href = object_url
                             }
                         }
                         filesaver.readyState = filesaver.DONE;
                         dispatch_all();
                         revoke(object_url);
                     }
                     , abortable = function(func) {
                         return function() {
                             if (filesaver.readyState !== filesaver.DONE) {
                                 return func.apply(this, arguments);
                             }
                         };
                     }
                     , create_if_not_found = {create: true, exclusive: false}
                     , slice
                 ;
                 filesaver.readyState = filesaver.INIT;
                 if (!name) {
                     name = "download";
                 }
                 if (can_use_save_link) {
                     object_url = get_URL().createObjectURL(blob);
                     save_link.href = object_url;
                     save_link.download = name;
                     click(save_link);
                     filesaver.readyState = filesaver.DONE;
                     dispatch_all();
                     revoke(object_url);
                     return;
                 }
                 // Object and web filesystem URLs have a problem saving in Google Chrome when
                 // viewed in a tab, so I force save with application/octet-stream
                 // http://code.google.com/p/chromium/issues/detail?id=91158
                 // Update: Google errantly closed 91158, I submitted it again:
                 // https://code.google.com/p/chromium/issues/detail?id=389642
                 if (view.chrome && type && type !== force_saveable_type) {
                     slice = blob.slice || blob.webkitSlice;
                     blob = slice.call(blob, 0, blob.size, force_saveable_type);
                     blob_changed = true;
                 }
                 // Since I can't be sure that the guessed media type will trigger a download
                 // in WebKit, I append .download to the filename.
                 // https://bugs.webkit.org/show_bug.cgi?id=65440
                 if (webkit_req_fs && name !== "download") {
                     name += ".download";
                 }
                 if (type === force_saveable_type || webkit_req_fs) {
                     target_view = view;
                 }
                 if (!req_fs) {
                     fs_error();
                     return;
                 }
                 fs_min_size += blob.size;
                 req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {
                     fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) {
                         var save = function() {
                             dir.getFile(name, create_if_not_found, abortable(function(file) {
                                 file.createWriter(abortable(function(writer) {
                                     writer.onwriteend = function(event) {
                                         target_view.location.href = file.toURL();
                                         filesaver.readyState = filesaver.DONE;
                                         dispatch(filesaver, "writeend", event);
                                         revoke(file);
                                     };
                                     writer.onerror = function() {
                                         var error = writer.error;
                                         if (error.code !== error.ABORT_ERR) {
                                             fs_error();
                                         }
                                     };
                                     "writestart progress write abort".split(" ").forEach(function(event) {
                                         writer["on" + event] = filesaver["on" + event];
                                     });
                                     writer.write(blob);
                                     filesaver.abort = function() {
                                         writer.abort();
                                         filesaver.readyState = filesaver.DONE;
                                     };
                                     filesaver.readyState = filesaver.WRITING;
                                 }), fs_error);
                             }), fs_error);
                         };
                         dir.getFile(name, {create: false}, abortable(function(file) {
                             // delete file if it already exists
                             file.remove();
                             save();
                         }), abortable(function(ex) {
                             if (ex.code === ex.NOT_FOUND_ERR) {
                                 save();
                             } else {
                                 fs_error();
                             }
                         }));
                     }), fs_error);
                 }), fs_error);
             }
             , FS_proto = FileSaver.prototype
             , saveAs = function(blob, name) {
                 return new FileSaver(blob, name);
             }
         ;
         FS_proto.abort = function() {
             var filesaver = this;
             filesaver.readyState = filesaver.DONE;
             dispatch(filesaver, "abort");
         };
         FS_proto.readyState = FS_proto.INIT = 0;
         FS_proto.WRITING = 1;
         FS_proto.DONE = 2;
        
         FS_proto.error =
         FS_proto.onwritestart =
         FS_proto.onprogress =
         FS_proto.onwrite =
         FS_proto.onabort =
         FS_proto.onerror =
         FS_proto.onwriteend =
             null;
        
         return saveAs;
       }(
            typeof self !== "undefined" && self
         || typeof window !== "undefined" && window
         || this.content
       ));
       // `self` is undefined in Firefox for Android content script context
       // while `this` is nsIContentFrameMessageManager
       // with an attribute `content` that corresponds to the window
        
       if (typeof module !== "undefined" && module !== null) {
         module.exports = saveAs;
       } else if ((typeof define !== "undefined" && define !== null) && (define.amd != null)) {
         define([], function() {
           return saveAs;
         });
       }