将HTML表格导出为Excel的JavaScript

42

当用户点击“导出”按钮时,我需要将页面中的HTML表格导出到Excel中。现在,我在stackoverflow上找到了一个在Firefox中工作的解决方案。

在Firefox浏览器中使用javascript将动态HTML表格导出到Excel

现在,它不能处理特殊字符,如我们在这里使用的语言中常见的ö、ü、ö,因此我想问问是否有人知道如何成功地导出它们而不会出现问题?

这是我的代码:

 function tabletoExcel(table, name) {
    var uri = 'data:application/vnd.ms-excel;base64,'
          , 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"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body><table>{table}</table></body></html>'
          , base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))); }
          , format = function (s, c) { return s.replace(/{(\w+)}/g, function (m, p) { return c[p]; }); };
        if (!table.nodeType) table = document.getElementById(table);
        var ctx = { worksheet: name || 'Worksheet', table: table.innerHTML };
        window.location.href = uri + base64(format(template, ctx));

}

使用这种方法,您只能导出页面上可见的内容。您对这种方法满意吗? - Candide
是的,这就是我想做的。有时候,有些名称带有特殊字符,导出时会出现乱码。因此,我想知道应该使用什么编码? - Tulips
3
在IE浏览器中无法正常工作。 - Nayeem
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - sampopes
我该如何扩展这个JS,以便将多个HTML表格导出到Excel中? - Ignacio Chiazzo
3个回答

68

如果您添加:

<meta http-equiv="content-type" content="text/plain; charset=UTF-8"/>
在文档头部,它将按预期开始工作。
<script type="text/javascript">
var tableToExcel = (function() {
  var uri = 'data:application/vnd.ms-excel;base64,'
    , 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"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>'
    , base64 = function(s) { return window.btoa(unescape(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.getElementById(table)
    var ctx = {worksheet: name || 'Worksheet', table: table.innerHTML}
    window.location.href = uri + base64(format(template, ctx))
  }
})()
</script>

这里是更新后的Fiddle示例。


这在IE 11中对我不起作用。当您单击“导出”按钮时,它只会显示页面正在等待。 - Jason Ebersey
11
“download.xls”的文件格式和扩展名不匹配,这是一个问题,因为最终用户不希望看到这个并点击“是”…… - Tom Stickel
我该如何使用这个js导出多个表格? - Ignacio Chiazzo
非常感谢你,你让我的一天变得美好 :) - Tarun Nagpal
1
文件已下载,但在使用MS Excel打开文件时,会显示不匹配的标题和扩展名警告。 - codemirror
显示剩余7条评论

6

如果需要进行UTF-8转换和货币符号导出,请使用以下方法:

var tableToExcel = (function() {
  var uri = 'data:application/vnd.ms-excel;base64,'
    , 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"><head><!--[if gte mso 9]><?xml version="1.0" encoding="UTF-8" standalone="yes"?><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body><table>{table}</table></body></html>'
    , base64 = function(s) { return window.btoa(unescape(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.getElementById(table)
      var ctx = { worksheet: name || 'Worksheet', table: table.innerHTML }
    window.location.href = uri + base64(format(template, ctx))
  }
})()

1
ShieldUI的导出到Excel功能应该已经支持所有特殊字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接