2012-06-18 9 views
6

Ich habe die folgende Funktion, die ein HTML exportiert zu übertreffen:Export HTML-Tabelle in Excel-Javascript-Funktion Sonderzeichen geändert

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

Ein Problem ist, dass die besonderen Zeichen in den Daten zu anderen Symbolen transformiert werden:

  • 1º = 1º
  • é = Ã ©

Wie w Könntest du das reparieren? Gibt es irgendein Zeichen, das HTML ersetzt, um es zu verhindern? Irgendeine Kodierungsoption?

+0

Haben Sie versucht, eine explizite Codierung Hinzufügen Erklärung zum Medientyp? 'data: application/vnd.ms-excel; charset = UTF-8' – Pointy

+0

Ja, es war eine der Lösungen, die ich gefunden und ausprobiert habe, bevor ich hier gefragt habe, es hat nicht mit den verschiedenen Zeichensätzen funktioniert ... Details hier: http: //www.weblogism.com/item/270/why-does-e-be-come-a und http://www.weblogism.com/item/271/why-does-e-become-a-ii – VSP

Antwort

7

Zeichen zu ersetzen, ist eine schlechte Lösung.

Ich ersetzte encodeURIComponent für Escape und funktioniert gut, aber Escape ist seit ECMAScript v3 veraltet.

Dieses Problem tritt auf, weil encodeURIComponent mit UTF-8 und Excel nicht funktioniert.

Besserer Weg für mich.

Daten auf Base64 codieren und so exportieren. Früher habe ich jquery-base64-Plugin von https://github.com/carlo/jquery-base64/blob/master/jquery.base64.min.js

und ändern Code:

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

Wenn Sie jquery nicht verwenden möchten, können Sie diese Funktion base64_encode http://phpjs.org/functions/base64_encode

„Base64-Kodierung/Decodierung ist bereits eine native Funktion in modernen (tm) Browsern: btoa (str) und atob (str) sind die Funktionen, die ohne externe Reimplementierung verwendet werden sollten. " - chipairon

+0

Es ist eine gute Idee, wenn Sie eine direkte EncodetoBase64() -Funktion zu Ihrer Antwort für die Leute hinzufügen können, die keine zusätzlichen Plugins wie jquery verwenden wollen, werde ich die Antwort an Sie gewähren – VSP

+4

Base64-Codierung/Decodierung ist bereits eine native Funktion in modernen (tm) Browser: 'btoa (str)' und 'atob (str)' sind die Funktionen, die ohne externe Reimplementation verwendet werden können. Werfen Sie einen Blick auf https://developer.mozilla.org/en-US/docs/Web/JavaScript/Base64_encoding_and_decoding – chipairon

+0

Ich setze Ihre Antwort als die richtige wie versprochen, aber wenn Sie die native Funktion Option von @ beigetragen hinzufügen könnte chipairon auf die Antwort für andere Leute zu sehen, es wäre toll ^^ – VSP

3

eine für die problematischen Symbole ersetzen Gelöst Zusatz:

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

Simpler (auch prob. schneller): 'html = html.replace (/ á/g, '$ aacute;');' usw. - das "g" nach der Regex bewirkt, dass die Substitution durch die ganze Zeichenfolge ausgeführt wird, also nicht brauche die 'while' Schleife. – Pointy

+1

@ Pointy Es funktioniert, aber die Ersetzung wäre html = html.replace (/ á/g, '& aacute;'); nicht $, wenn Sie es als eine Antwort setzen, werde ich es akzeptieren – VSP

+1

Ich denke, es ist eine schlechte Lösung, wir haben so viele Symbole, um alle zu ersetzen. Ich habe encodeURIComponent für Escape ersetzt und funktioniert gut. –

3

Ich habe das gleiche Problem, nur encodeURIComponent für die Flucht ersetzen.

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

Es funktioniert für mich ...

+1

Wie Pedro Muniz sagte, ist 'Flucht 'veraltet. Es ist vorzuziehen, Base64-Codierung zu verwenden. – chipairon

2

Ersetzen Sie einfach durch escape.

0

In meinem Fall habe ich generateexcel Funktion zuvor geschrieben, nur das Hinzufügen Großbuchstaben von Sonderzeichen, um es

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

Hoffnung zu machen, arbeiten, es hilft ...