2012-06-18 29 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º
  • é= A©

如何w ^你能解決這個問題嗎?是否有任何字符替換爲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以進行轉義並且正常工作,但轉義已過時,因爲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)是應該可以在沒有任何外部重新實現的情況下使用的函數。「 - 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,'á');不是$,如果你把它作爲答案我會接受它 – VSP

+1

我認爲這是一個糟糕的解決方案,我們有很多符號來代替所有。我換了encodeURIComponent for 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

正如Pedro Muniz所說,「逃避」已被棄用。最好使用base64編碼。 – chipairon

2

只需將encodeURIComponent替換爲escape即可。

0

在我來說,我用以前發佈的,只是添加的特殊字符,大寫字母,以使其工作

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

希望它可以幫助generateexcel功能...