data协议方式:对于支持data协议的浏览器,可以将html或是csv先用js base64处理,然后前缀data:application/vnd.ms-excel;base64,,即可使浏览器将其中的数据当做excel来处理,浏览器将提示下载或打开excel文件,可惜的是ie不支持。extjs的官网有一个grid的plugin,实现导出xhtml格式的伪excel文件,就是这么做的。 (except IE)
具体js如下(template变量的内容因为新浪博客无法正常显示,只能用图片插入):
var tableToExcel = (function() {
var uri = 'data:application/vnd.ms-excel;base64,',
template =
base64 = function(s) { return window.btoa((encodeURIComponent(s))) },
format = function(s, c) { return s.replace(/{(\w+)}/g, function(m, p) { return c[p]; }) }
return function(table, name) {
if (!table.nodeType) table = document.getElementByIdx_x_x_x_x_x_x(table)
var ctx = {worksheet: name || 'Worksheet', table: table.innerHTML}
window.location.href = uri + base64(format(template, ctx))
}
})()
其中format函数中m、p代表什么,理解如下:
format = function(s, c){
return s.replace(/{(\w+)}/g, function(m, p) {
console.log(m + ", " + p);//打印参数。
return c[p];
})
}
执行:
console.log(format("a{b}c"
, {b : "BBB"}));
输出如下:
{b}, b
aBBBc <-最终结果。
正则表达式:/{(\w+)}/g,意思要全局匹配带有花括号并且之间至少一个字母的字符串,m是匹配成功的字符串,正则中的括号是得到匹配成功的字符传中分组匹配的结果,比如上面的例子,匹配 “a{b}c”,m 的值为{b},那么分组匹配的结果就是 b,改正则的意图:寻找出字符传s中花括号所包含的的字符对应的C的属性的值,替换掉整个花括号的内容。
' {table}',