我试图通过
javascript / jquery导出将html表导出到Excel文档.到目前为止我找到了2个解决方案,但都不符合我的要求:
>不导出内联样式(样式是必须要求)
>不适用于所有IE版本(需要所有浏览器兼容性)
我正在寻找尽可能小的解决方案(这两种解决方案都非常“整洁”但是根据我上面的评论,它们都有一个不符合我要求的垮台.
有谁知道更好的解决方案?我对此出口的要求是:
>需要适用于所有浏览器
>需要导出内联样式
>如果可能的话,能够命名文件会很好
非常感谢这里的任何帮助,拉我的头发,因为我不能成为第一个需要此功能的人…
谢谢!
解决方法
我假设PHP / Flash是不行的. (如果没有,请结帐
PHPExcel和
DataTables‘导出功能.)
此外,如果没有某种类型的服务器端编程,则几乎不可能命名文件.我很确定这对大多数浏览器来说都是一个安全问题.
在我们开始使用代码之前,有一些限制:
>您可能需要查找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; }