微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用javascript / jQuery的HTML表格到Excel(xls)

我试图通过 javascript / jquery导出将html表导出到Excel文档.到目前为止我找到了2个解决方案,但都不符合我的要求:

HTML Table Export

>不导出内联样式(样式是必须要求)

Table2Excel

>不适用于所有IE版本(需要所有浏览器兼容性)

我正在寻找尽可能小的解决方案(这两种解决方案都非常“整洁”但是根据我上面的评论,它们都有一个不符合我要求的垮台.

有谁知道更好的解决方案?我对此出口的要求是:

>需要适用于所有浏览器
>需要导出内联样式
>如果可能的话,能够命名文件会很好

非常感谢这里的任何帮助,拉我的头发,因为我不能成为第一个需要此功能的人…

谢谢!

解决方法

我假设PHP / Flash是不行的. (如果没有,请结帐 PHPExcelDataTables‘导出功能.)

此外,如果没有某种类型的服务器端编程,则几乎不可能命名文件.我很确定这对大多数浏览器来说都是一个安全问题.

在我们开始使用代码之前,有一些限制:

>您可能需要查找MS Office XML formats for XLS并进行自定义
>一旦文件下载(它将是.xls),你可能会收到类似“这个文件说它是XLS格式但可能不是,你想要打开吗?”的错误.
>您可能需要“另存为”一些有效的Excel格式,以强制它从Excel文档正文中的HTML转换.
>我在Chrome / Firefox / Internet Explorer中相当广泛地使用了这个,但你应该自己测试一下.
>目前设置为冻结行/列.更改tabletoExcel()函数顶部的XML和/或冻结变量.
>客户端资源昂贵.可能最好使用某种服务器端脚本.
>根据javascript变量的大小,(我猜)表的大小是有限制的.我用了一些像50×300这样的表,但我不建议在更大的表上使用它.

它接受一串HTML表格文本(包括< table>).您可以使用内联样式格式化HTML(遗憾的是,不能使用CSS样式表).

tabletoExcel($(‘table’).html(),’Worksheet Name’);
 

这是功能.请享用!

function b64toBlob(b64Data,contentType,sliceSize) {
    contentType = contentType || '';
    sliceSize = sliceSize || 512;

    var byteCharacters = atob(b64Data);
    var byteArrays = [];

    for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
        var slice = byteCharacters.slice(offset,offset + sliceSize);

        var byteNumbers = new Array(slice.length);
        for (var i = 0; i < slice.length; i++) {
            byteNumbers[i] = slice.charCodeAt(i);
        }

        var byteArray = new Uint8Array(byteNumbers);

        byteArrays.push(byteArray);
    }

    var blob = new Blob(byteArrays,{type: contentType});
    return blob;
}

function tabletoExcel(table,name) {
	var freezetopRowNumber = '4';
	var freezeColNumber = '6';
	var template = '<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">';
	template += '<head><!--[if gte mso 9]>';
	template += '<xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name>';
	template += '<x:Worksheetoptions><x:Selected/><x:FreezePanes/><x:FrozenNoSplit/><x:SplitHorizontal>'+freezetopRowNumber+'</x:SplitHorizontal><x:TopRowBottomPane>'+freezetopRowNumber+'</x:TopRowBottomPane>';
	template += '<x:SplitVertical>'+freezeColNumber+'</x:SplitVertical><x:LeftColumnRightPane>'+freezeColNumber+'</x:LeftColumnRightPane>';
	template += '<x:ActivePane>2</x:ActivePane><x:Panes><x:Pane><x:Number>3</x:Number></x:Pane><x:Pane><x:Number>2</x:Number></x:Pane></x:Panes>';
	template += '<x:ProtectContents>False</x:ProtectContents><x:ProtectObjects>False</x:ProtectObjects><x:ProtectScenarios>False</x:ProtectScenarios>';
	template += '<x:displayGridlines/></x:Worksheetoptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head>';
	template += '<body>{table}</body></html>';
	var base64 = function(s) { return window.btoa(unescape(encodeURIComponent(s))) };
	var format = function(s,c) { return s.replace(/{(\w+)}/g,function(m,p) { return c[p]; }) };
	var ctx = {worksheet: name || 'Worksheet',table: table};
	var b = base64(format(template,ctx));

	var blob = b64toBlob(b,'application/vnd.ms-excel');
	var blobURL = URL.createObjectURL(blob);
	window.location.href = blobURL;


}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐