7

我有以下将 html 导出到 excel 的函数:

function generateexcel(tableid) {
  var table= document.getElementById(tableid);
  var html = table.outerHTML;
  window.open('data:application/vnd.ms-excel,' + encodeURIComponent(html));
}

一个问题是数据中的特殊字符被转换为其他符号:

  • 1º = 1º
  • é = é

你会如何解决这个问题?是否有任何字符替换到 html 以防止它?任何编码选项?

4

5 回答 5

9

替换字符是一个糟糕的解决方案。

我将 encodeURIComponent 替换为转义并且工作正常,但自 ECMAScript v3 以来已弃用转义。

出现此问题的原因是 encodeURIComponent 适用于 UTF-8 而 Excel 不适用。

对我来说更好的方式。

将数据编码为base64并像这样导出。我使用了来自https://github.com/carlo/jquery-base64/blob/master/jquery.base64.min.js的 jquery-base64 插件

并将代码更改为:

window.open('data:application/vnd.ms-excel;base64,' + $.base64.encode(html));

如果不想使用 jquery,可以使用这个 base64_encode 函数 http://phpjs.org/functions/base64_encode

“Base64 编码/解码已经是现代 (tm) 浏览器中的本机功能:btoa(str) 和 atob(str) 是无需任何外部重新实现即可使用的功能。” - 芯片

于 2013-04-02T15:41:11.943 回答
4

解决了为有问题的符号添加替换:

function generateexcel(tableid) {
  var table= document.getElementById(tableid);
  var html = table.outerHTML;

  //add more symbols if needed...
  while (html.indexOf('á') != -1) html = html.replace('á', 'á');
  while (html.indexOf('é') != -1) html = html.replace('é', 'é');
  while (html.indexOf('í') != -1) html = html.replace('í', 'í');
  while (html.indexOf('ó') != -1) html = html.replace('ó', 'ó');
  while (html.indexOf('ú') != -1) html = html.replace('ú', 'ú');
  while (html.indexOf('º') != -1) html = html.replace('º', 'º');

  window.open('data:application/vnd.ms-excel,' + encodeURIComponent(html));
}
于 2012-06-18T15:16:26.960 回答
3

我有同样的问题,只需将 encodeURIComponent 替换为转义即可。

function generateexcel(tableid) {
 var table= document.getElementById(tableid);
 var html = table.outerHTML;
 window.open('data:application/vnd.ms-excel,' + escape(html));
}

这个对我有用...

于 2013-03-27T16:44:00.713 回答
2

只需替换encodeURIComponentescape.

于 2013-06-21T12:33:52.673 回答
1

在我的情况下,我使用之前发布的 generateexcel 函数,只需添加特殊字符的大写字母以使其工作

    function generateexcel(tableid) {
      var table= document.getElementById(tableid);
      var html = table.outerHTML;
      while (html.indexOf('á') != -1) html = html.replace('á', 'á');
      while (html.indexOf('Á') != -1) html = html.replace('Á', 'Á');
      while (html.indexOf('é') != -1) html = html.replace('é', 'é');
      while (html.indexOf('É') != -1) html = html.replace('É', 'É');
      while (html.indexOf('í') != -1) html = html.replace('í', 'í');
      while (html.indexOf('Í') != -1) html = html.replace('Í', 'Í');
      while (html.indexOf('ó') != -1) html = html.replace('ó', 'ó');
      while (html.indexOf('Ó') != -1) html = html.replace('Ó', 'Ó');
      while (html.indexOf('ú') != -1) html = html.replace('ú', 'ú');
      while (html.indexOf('Ú') != -1) html = html.replace('Ú', 'Ú');
      while (html.indexOf('º') != -1) html = html.replace('º', 'º');
      while (html.indexOf('ñ') != -1) html = html.replace('ñ', 'ñ'); 
      while (html.indexOf('Ñ') != -1) html = html.replace('Ñ', 'Ñ');  

  window.open('data:application/vnd.ms-excel,' + encodeURIComponent(html));
}

希望能帮助到你...

于 2015-07-27T21:57:31.237 回答