/* * 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 * * 江鸿宾(QQ:33080907)修改过 * 最后修改日期:2019.02.26 */ (function ($, window, document) { var pluginName = 'table2excel', defaults = { exclude: '.no-xls', name: 'Table2Excel', filename: 'table2excel', exclude_img: true, exclude_links: true, exclude_inputs: true } // The actual plugin constructor function Plugin(element, filename) { 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, { filename: filename }) this._defaults = defaults this._name = pluginName this.init() } Plugin.prototype = { init: function () { var e = this var utf8Heading = '' e.template = { head: '' + utf8Heading + '', table: { head: '', tail: '
' }, foot: '' } e.tableRows = [] // get contents of table except for exclude $(e.element).each(function (i, o) { var tempRows = '' $(o).find('tr').not(e.settings.exclude).filter(':visible').each(function (i, p) { tempRows += '' $(p).find('td,th').not(e.settings.exclude).filter(':visible').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), style: $(this).attr('style') } if (rc.flag.length > 0) { tempRows += '' // exclude it! } else { tempRows += ' 0) { tempRows += ' rowspan="' + rc.rows + '"' } if (rc.cols > 0) { tempRows += ' colspan="' + rc.cols + '"' } tempRows += '>' + $(q).html() } tempRows += '' } }) tempRows += '' // console.log(tempRows) }) // 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)) { for (i in table) { // 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)) { for (i in table) { 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') + '.xls' } // Removes all img tags function exclude_img(string) { var _patt = /(\s+alt\s*=\s*"([^"]*)"|\s+alt\s*=\s*'([^']*)')/i return string.replace(/]*>/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>/gi, '') } // Removes input params function exclude_inputs(string) { var _patt = /(\s+value\s*=\s*"([^"]*)"|\s+value\s*=\s*'([^']*)')/i return string.replace(/]*>|<\/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)