table2excel.js 8.54 KB
Newer Older
葛齐林's avatar
葛齐林 committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
/*
 *  jQuery table2excel - v1.1.1
 *  jQuery plugin to export an .xls file in browser from an HTML table
 *  https://github.com/rainabba/jquery-table2excel
 *
 *  Made by rainabba
 *  Under MIT License
 *  
 *  添加功能:导出表格边框,文字居中
 */
//table2excel.js
;(function ( $, window, document, undefined ) {
  var pluginName = "table2excel",

  defaults = {
      exclude: ".noExl",
      name: "Table2Excel",
      filename: "table2excel",
      fileext: ".xls",
      exclude_img: true,
      exclude_links: true,
      exclude_inputs: true
  };

  // The actual plugin constructor
  function Plugin ( element, options ) {
          this.element = element;
          // jQuery has an extend method which merges the contents of two or
          // more objects, storing the result in the first object. The first object
          // is generally empty as we don't want to alter the default options for
          // future instances of the plugin
          //
          this.settings = $.extend( {}, defaults, options );
          this._defaults = defaults;
          this._name = pluginName;
          this.init();
  }

  Plugin.prototype = {
      init: function () {
          var e = this;

          var utf8Heading = "<meta http-equiv=\"content-type\" content=\"application/vnd.ms-excel; charset=UTF-8\">";
          e.template = {
              head: "<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns=\"http://www.w3.org/TR/REC-html40\">" + utf8Heading + "<head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets>",
              sheet: {
                  head: "<x:ExcelWorksheet><x:Name>",
                  tail: "</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet>"
              },
              mid: "</x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body>",
              table: {
                  head: "<table border='1'>",//表格边框
                  tail: "</table>"
              },
              foot: "</body></html>"
          };

          e.tableRows = [];

          // get contents of table except for exclude
          $(e.element).each( function(i,o) {
              var tempRows = "";
              $(o).find("tr").not(e.settings.exclude).each(function (i,p) {

                  tempRows += "<tr align='center' valign='center' >"; //文字居中
                  $(p).find("td,th").not(e.settings.exclude).each(function (i,q) { // p did not exist, I corrected

                      var rc = {
                          rows: $(this).attr("rowspan"),
                          cols: $(this).attr("colspan"),
                          flag: $(q).find(e.settings.exclude)
                      };

                      if( rc.flag.length > 0 ) {
                          tempRows += "<td align='center' valign='center' > </td>"; // exclude it!! //文字居中
                      } else {
                          tempRows += "<td align='center' valign='center' "; //文字居中
                          if( rc.rows > 0) {
                              tempRows += " rowspan=\'" + rc.rows + "\' ";
                          }
                          if( rc.cols > 0) {
                              tempRows += " colspan=\'" + rc.cols + "\' ";
                          }
                          tempRows += "/>" + $(q).html() + "</td>";
                      }
                  });

                  tempRows += "</tr>";

              });
              // exclude img tags
              if(e.settings.exclude_img) {
                  tempRows = exclude_img(tempRows);
              }

              // exclude link tags
              if(e.settings.exclude_links) {
                  tempRows = exclude_links(tempRows);
              }

              // exclude input tags
              if(e.settings.exclude_inputs) {
                  tempRows = exclude_inputs(tempRows);
              }
              e.tableRows.push(tempRows);
          });

          e.tableToExcel(e.tableRows, e.settings.name, e.settings.sheetName);
      },

      tableToExcel: function (table, name, sheetName) {
          var e = this, fullTemplate="", i, link, a;

          e.format = function (s, c) {
              return s.replace(/{(\w+)}/g, function (m, p) {
                  return c[p];
              });
          };

          sheetName = typeof sheetName === "undefined" ? "Sheet" : sheetName;

          e.ctx = {
              worksheet: name || "Worksheet",
              table: table,
              sheetName: sheetName
          };

          fullTemplate= e.template.head;

          if ( $.isArray(table) ) {
               Object.keys(table).forEach(function(i){
                    //fullTemplate += e.template.sheet.head + "{worksheet" + i + "}" + e.template.sheet.tail;
                    fullTemplate += e.template.sheet.head + sheetName + i + e.template.sheet.tail;
              });
          }

          fullTemplate += e.template.mid;

          if ( $.isArray(table) ) {
               Object.keys(table).forEach(function(i){
                  fullTemplate += e.template.table.head + "{table" + i + "}" + e.template.table.tail;
              });
          }

          fullTemplate += e.template.foot;

          for (i in table) {
              e.ctx["table" + i] = table[i];
          }
          delete e.ctx.table;

          var isIE = /*@cc_on!@*/false || !!document.documentMode; // this works with IE10 and IE11 both :)
          //if (typeof msie !== "undefined" && msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./))      // this works ONLY with IE 11!!!
          if (isIE) {
              if (typeof Blob !== "undefined") {
                  //use blobs if we can
                  fullTemplate = e.format(fullTemplate, e.ctx); // with this, works with IE
                  fullTemplate = [fullTemplate];
                  //convert to array
                  var blob1 = new Blob(fullTemplate, { type: "text/html" });
                  window.navigator.msSaveBlob(blob1, getFileName(e.settings) );
              } else {
                  //otherwise use the iframe and save
                  //requires a blank iframe on page called txtArea1
                  txtArea1.document.open("text/html", "replace");
                  txtArea1.document.write(e.format(fullTemplate, e.ctx));
                  txtArea1.document.close();
                  txtArea1.focus();
                  sa = txtArea1.document.execCommand("SaveAs", true, getFileName(e.settings) );
              }

          } else {
              var blob = new Blob([e.format(fullTemplate, e.ctx)], {type: "application/vnd.ms-excel"});
              window.URL = window.URL || window.webkitURL;
              link = window.URL.createObjectURL(blob);
              a = document.createElement("a");
              a.download = getFileName(e.settings);
              a.href = link;

              document.body.appendChild(a);

              a.click();

              document.body.removeChild(a);
          }

          return true;
      }
  };

  function getFileName(settings) {
      return ( settings.filename ? settings.filename : "table2excel" );
  }

  // Removes all img tags
  function exclude_img(string) {
      var _patt = /(\s+alt\s*=\s*"([^"]*)"|\s+alt\s*=\s*'([^']*)')/i;
      return string.replace(/<img[^>]*>/gi, function myFunction(x){
          var res = _patt.exec(x);
          if (res !== null && res.length >=2) {
              return res[2];
          } else {
              return "";
          }
      });
  }

  // Removes all link tags
  function exclude_links(string) {
      return string.replace(/<a[^>]*>|<\/a>/gi, "");
  }

  // Removes input params
  function exclude_inputs(string) {
      var _patt = /(\s+value\s*=\s*"([^"]*)"|\s+value\s*=\s*'([^']*)')/i;
      return string.replace(/<input[^>]*>|<\/input>/gi, function myFunction(x){
          var res = _patt.exec(x);
          if (res !== null && res.length >=2) {
              return res[2];
          } else {
              return "";
          }
      });
  }

  $.fn[ pluginName ] = function ( options ) {
      var e = this;
          e.each(function() {
              if ( !$.data( e, "plugin_" + pluginName ) ) {
                  $.data( e, "plugin_" + pluginName, new Plugin( this, options ) );
              }
          });

      // chain jQuery functions
      return e;
  };

})( jQuery, window, document );