Экспорт таблицы html в Excel javascript функции специальные символы изменены

У меня есть следующая функция, которая экспортирует 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, чтобы предотвратить его? Любая опция кодирования?

Ответ 1

Замена символов - это плохое решение.

Я заменил encodeURIComponent на escape и отлично работает, но escape не рекомендуется с ECMAScript v3.

Эта проблема возникает из-за того, что encodeURIComponent работает с UTF-8 и Excel не делает.

Лучший способ для меня.

Кодировать данные в base64 и экспортировать как это. Я использовал плагин jquery-base64 из https://github.com/carlo/jquery-base64/blob/master/jquery.base64.min.js

И измените код на:

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) - это функции, которые следует использовать без какой-либо внешней повторной реализации". - chipairon

Ответ 2

Решено добавить замену для проблемных символов:

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

Ответ 3

У меня такая же проблема, просто замените encodeURIComponent на escape.

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

Это работает для меня...

Ответ 4

Просто замените encodeURIComponent на escape.

Ответ 5

В моем случае я использую функцию 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));
}

Надеюсь, что это поможет...