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

我想通过javascript / jQuery导出将HTML表格导出到Excel文档。 我到目前为止find了两个解决scheme,但都不符合我的要求:

HTML表格导出

  • 不导出内联样式(样式是必需的)

Table2Excel

  • 在所有IE版本中都不起作用(需要所有的浏览器兼容性)

我正在寻找一个尽可能less的解决scheme(这两个解决scheme都非常“整洁”,但根据我上面的评论,他们都有一个垮台,没有达到我的要求。

有谁知道更好的解决scheme? 我对这个出口的要求是:

  • 需要在所有浏览器上工作
  • 需要导出内联样式
  • 如果可能,这将是很好的能够命名该文件

将不胜感激这里的任何援助,拉我的头发,因为我不能成为第一个需要此function的人…

谢谢!

我假设PHP / Flash是不行的。 (如果没有,检出PHPExcel和DataTables的导出function。)

另外,如果没有某种types的服务器端编程,命名该文件几乎是不可能的。 我很确定这是大多数浏览器的安全问题。

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

  1. 您可能需要查找用于XLS的MS Office XML格式并进行自定义
  2. 一旦文件下载(这将是.xls),你可能会得到一个错误,如“这个文件说它是在XLS格式,但可能不是,你想要打开吗?
  3. 您可能需要“另存为”一些有效的Excel格式,以强制其在Excel文档体中从HTML转换。
  4. 我在Chrome / Firefox / Internet Explorer中使用了相当广泛的,但你应该testing自己。
  5. 目前设置为冻结行/列。 更改XML和/或冻结tableToExcel()函数顶部的variables。
  6. 客户端资源昂贵。 可能最好使用某种服务器端脚本。
  7. 根据javascriptvariables的大小,我猜(猜)的表的大小是有限制的。 我用它像一些像50×300表,但我不会推荐在更大的表。

它接受一个HTML表格文本(包括<table> )的string。 你可以使用内联样式来格式化这个HTML(不幸的是不能和CSS样式表一起工作)。

tableToExcel($('table').html(),'Worksheet Name');

这是function。 请享用!

 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; }