2012-06-18 6 views
6

Ho la seguente funzione che esporta un html per eccellere:Esporta tabella HTML per Excel caratteri speciali funzione JavaScript cambiati

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

Un problema è che i personaggi especial nei dati vengono trasformati in altri simboli:

  • 1º = 1º
  • E = Ã ©

Come w potresti aggiustarlo? C'è qualche carattere sostitutivo per l'html per impedirlo? Qualche opzione di codifica?

+0

Hai provato l'aggiunta di una codifica esplicita dichiarazione al tipo di media? 'dati: application/vnd.ms-excel; charset = UTF-8' – Pointy

+0

Sì, era una delle soluzioni che ho trovato e provato prima di chiedere qui, non ha funzionato con i diversi set di caratteri che ho provato ... Dettagli qui: http: //www.weblogism.com/item/270/why-does-e-become-a e http://www.weblogism.com/item/271/why-does-e-become-a-ii – VSP

risposta

7

Sostituzione di caratteri è una cattiva soluzione.

Ho sostituito encodeURIComponent per l'escape e funziona bene, ma l'escape è deprecato poiché ECMAScript v3.

Questo problema si verifica perché encodeURIComponent funziona con UTF-8 ed Excel no.

Un modo migliore per me.

Codificare i dati su base64 ed esportarli in questo modo. Ho usato plugin-Base64 jquery da https://github.com/carlo/jquery-base64/blob/master/jquery.base64.min.js

E il codice modifica:

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

Se non si desidera utilizzare jQuery, è possibile utilizzare questa funzione base64_encode http://phpjs.org/functions/base64_encode

"codifica Base64/la decodifica è già una funzione nativa nei browser moderni (tm): btoa (str) e atob (str) sono le funzioni che dovrebbero essere utilizzate senza alcuna reimplementazione esterna. " - chipairon

+0

È una buona idea, se si potesse aggiungere una funzione EncodetoBase64 diretta() per la vostra risposta per le persone che non volete utilizzare i plugin extra come jQuery io darò la risposta a voi – VSP

+4

Base64 codifica/decodifica è già una funzione nativa nella moderna (tm) browser: 'btoa (str)' e 'atob (str)' sono le funzioni che dovrebbero essere usate senza alcuna reimplementazione esterna. Date un'occhiata a https://developer.mozilla.org/en-US/docs/Web/JavaScript/Base64_encoding_and_decoding – chipairon

+0

ho impostato la risposta come quella corretta, come promesso, ma se si potrebbe aggiungere l'opzione funzione nativa contributo di @ chipairon alla risposta per le altre persone di vederlo sarebbe grande ^^ – VSP

3

Risolto l'aggiunta di una sostituzione per i simboli problematici:

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

Più semplice (anche più veloce): 'html = html.replace (/ á/g, '$ aacute;');' ecc. - la "g" dopo la regex lo fa eseguire la sostituzione in tutta la stringa, quindi non serve il ciclo 'while'. – Pointy

+1

@Pointy Funziona ma la sostituzione sarebbe html = html.replace (/ A/G, '& aacute;'); non $, se lo metti come risposta lo accetterò – VSP

+1

Penso che sia una soluzione scadente, abbiamo così tanti simboli da sostituire tutti. Ho sostituito encodeURIComponent per la fuga e funziona bene. –

3

Ho lo stesso problema, basta sostituire encodeURIComponent per la fuga.

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

Funziona per me ...

+1

Come diceva Pedro Muniz, 'escape' è stato deprecato. È preferibile utilizzare la codifica base64. – chipairon

2

Basta sostituire encodeURIComponent con escape.

0

Nel mio caso io uso la funzione generateexcel precedentemente pubblicato, solo l'aggiunta di lettere maiuscole di caratteri speciali in modo da farlo funzionare

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

Speranza che aiuta ...