2012-06-18 2 views
6

я следующая функция, которая экспортирует HTML, чтобы преуспеть:Экспорт HTML таблицы в Excel Javascript функция специальные символы изменили

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

Одна проблема заключается в том, что особенные символы в данных преобразуются в другие символы:

  • 1º = 1º
  • é = Ã ©

Как ш вы это исправите? Есть ли какой-либо символ, заменяющий html, чтобы предотвратить его? Любой вариант кодирования?

+0

Вы пытались добавить явное кодирование объявление для типа СМИ? 'data: application/vnd.ms-excel; charset = UTF-8' – Pointy

+0

Да, это было одно из решений, которые я нашел и попробовал, прежде чем спрашивать здесь, он не работал с разными кодировками, которые я пробовал ... Подробнее здесь: http: //www.weblogism.com/item/270/why-does-e-become-a и http://www.weblogism.com/item/271/why-does-e-become-a-ii – VSP

ответ

7

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

Я заменил encodeURIComponent на побег и отлично работает, но 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

+0

Его хорошая идея, если бы вы могли добавить прямую функцию EncodetoBase64() для своего ответа для людей, которые не хотят использовать дополнительные плагины, такие как jquery, я дам вам ответ – VSP

+4

Base64 кодирование/декодирование уже является родной функцией в современных (tm): 'btoa (str)' и 'atob (str)' - это функции, которые следует использовать без какой-либо внешней повторной реализации. Взгляните на https://developer.mozilla.org/en-US/docs/Web/JavaScript/Base64_encoding_and_decoding – chipairon

+0

Я установил ваш ответ как правильный, как и обещал, но если вы можете добавить параметр родной функции, предоставленный @ chipairon к ответу для других людей, чтобы увидеть, что это будет здорово ^^ – VSP

3

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

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

Упрощенный (быстрее): 'html = html.replace (/ á/g, '$ aacute;');' и т. д. - «g» после регулярного выражения заставляет его выполнять замену по всей строке, поэтому вы не выполняете нужен цикл while. – Pointy

+1

@Pointy Это работает, но заменой будет html = html.replace (/ á/g, '& aacute;'); а не $, если вы ответите, я приму это – VSP

+1

Я думаю, что это плохое решение, у нас так много символов, чтобы заменить все. Я заменил encodeURIComponent на escape и отлично работает. –

3

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

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

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

+1

Как сказал Педро Мунис, «побег» устарел. Предпочтительно использовать кодировку base64. – chipairon

2

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

0

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

Надеются, что это помогает ...