我正在导出一个HTML表格到和Excel格式文件,然后下载它作为一个.xls
。这在Firefox、Chrome等浏览器中运行得很好,但在IE中却不像预期的那样。
下面是我正在使用的函数。最后的if
语句会发现浏览器是IE还是其他浏览器。
function exportTable(obj) {
var tab_text="<table border='2px'><tr>";
var textRange; var j=0;
tab = obj;
for(j = 0 ; j < tab.rows.length ; j++){
tab_text=tab_text+tab.rows[j].innerHTML+"</tr>";
//tab_text=tab_text+"</tr>";
}
tab_text=tab_text+"</table>";
tab_text= tab_text.replace(/<A[^>]*>|<\/A>/g, "");//remove if you want links in your table
tab_text= tab_text.replace(/<img[^>]*>/gi,""); // remove if you want images in your table
tab_text= tab_text.replace(/<input[^>]*>|<\/input>/gi, ""); // removes input params
var ua = window.navigator.userAgent;
var msie = ua.indexOf("MSIE ");
if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) // If Internet Explorer
{
txtArea1 = window.open();
txtArea1.document.open("txt/html","replace");
txtArea1.document.write(tab_text);
txtArea1.document.close();
txtArea1.focus();
sa=txtArea1.document.execCommand("SaveAs",false,"export.xls");
txtArea1.window.close()
} else { //other browser not tested on IE 11
sa = window.open('data:application/vnd.ms-excel,' + encodeURIComponent(tab_text));
return (sa);
}
}
如果是IE,则创建一个新窗口,将HTML输出写入其中,然后询问用户保存文件的位置。当对话框出现时,用户被迫将文件保存为.html
或.txt
。
这就是它变得奇怪的地方。尽管“另存为”框强制用户将其下载为.html
或.txt
,但文件本身被保存为.xls
。
可以禁用此提示吗?还是还有别的工作要做呢?我不希望最终用户对此感到困惑。
发布于 2015-12-18 14:59:41
尝试使用隐藏的iframe而不是新的窗口。为我解决了很多问题。为了支持IE9,我最后得到了以下代码片段:
if (event.data.browser !== 'IE') {
$.util.open('data:application/vnd.ms-excel,' + event.data.content);
return true;
}
else {
// The iframe already has to be included in the HTML, or you'll get a 'no access error'.
frame.document.open("txt/html","replace");
frame.document.write(event.data.content);
frame.document.close();
frame.focus();
command = frame.document.execCommand("SaveAs", true, "data_table.xls");
return command;
}
唯一的缺点是它不是一个“真实的”excel .xls文件,直到您第一次打开它并将它作为一个.xls重新保存,这种技术只是利用了优秀的能力来理解基本的html标记。
一个更好但更复杂的方法是实际构造一个base64编码的'string‘,如msdn文档所示,但最终这对项目来说已经足够了。
或者和所有的东西一样,有很多lotsa库可以帮你做到这一点。
https://stackoverflow.com/questions/34358041
复制相似问题