2017-05-03 38 views
1

我想創建一個基於我的網頁上的表格中顯示的數據的CSV文件。如何從我的csv文件中刪除BOM標題?

問題

我每次觸發「保存到CSV」功能,該文件將在Excel中打開了,但它不會解析出各個字段(用逗號分隔)。一切都會出現在一列中。它會適當地打破不同的路線。 經過多次測試/故障排除以及來自stackoverflow的幫助後,我的真正問題是BOM表頭被添加並且似乎在搞亂它。當我在Notepad ++中打開csv文件並更改編碼以刪除BOM標題,然後在Excel中重新打開該文件時,它看起來很好。

代碼

這是代碼的樣子:(注:非IE路徑工作得很好)

function exportTableToCSV($tableName, fileName) { 
    var csv = GetCellValues($tableName); 
    console.log(csv); 
    console.log("filename is:" + fileName); 

    if (navigator.userAgent.search("Trident") >= 0) { 

    //this is the path that is execute in IE10 browser... 
    window.CsvExpFrame.document.open("text/html", "replace"); 
    window.CsvExpFrame.document.write(csv); 
    window.CsvExpFrame.document.close(); 
    window.CsvExpFrame.focus(); 
    window.CsvExpFrame.document.execCommand('SaveAs', true, fileName + ".csv"); 
    } else { 
    var uri = "data:text/csv;charset=utf-8," + escape(csv); 
    var downloadLink = document.createElement("a"); 
    downloadLink.href = uri; 
    downloadLink.download = fileName + ".csv"; 
    document.body.appendChild(downloadLink); 
    downloadLink.click(); 
    document.body.removeChild(downloadLink); 
    } 
}; 

問題

我如何編程刪除BOM表頭?

就我嘗試遠

到目前爲止,我已經試過下面的代碼更改:

  1. 嘗試變更/指定編碼像這樣:(所有線路在這裏被註釋掉......但是我循環遍歷每一個並重新導出)

    //window.CsvExpFrame.document.open("text/html「,」replace「); //window.CsvExpFrame.document.open('data:text/csv;windows-1252; ') //window.CsvExpFrame.document.open('data:text/csv;charset=utf-8;') //window.CsvExpFrame.document.open('data:text/csv;charset=utf-8,')

  2. 試圖刪除報頭,像這樣:

    // CSV = csv.replace (/ \ uFFFD /克, '') CSV = csv.replace(/ \ uFEFF /克, '') window.CsvExpFrame.document.write(CSV);

到目前爲止,沒有任何工作。如果您對我有任何建議,我會很感激。我一直在閱讀其他類似的帖子在stackoverflow和嘗試他們,但迄今爲止,這是一個不行。我沒有'找到一個這是JavaScript的具體..

謝謝。

編輯1

由於張貼這個問題,我已經發現了一些額外的/有益的文物:

當我用記事本打開該文件++中,編碼設置爲「UCS-2 LE BOM 」。
我注意到,將文件保存爲:

"UTF-8 BOM" fixes the issue. 
    "UTF-8" (aka no BOM) fixes the issue 
    "UCS-2 BE BOM" almost works but it adds some funky characters the first field's header, so it looks like this: 

    þÿ"Group Name" 

我試圖改變我的代碼,以明確添加BOM頭,像這樣:

window.CsvExpFrame.document.open("text/html", "replace"); 
window.CsvExpFrame.document.write("\uFEFF"+csv); // ADD BOM 
//window.CsvExpFrame.document.write(csv); 
window.CsvExpFrame.document.close(); 
window.CsvExpFrame.focus(); 
window.CsvExpFrame.document.execCommand('SaveAs', true, fileName + ".csv"); 

但按記事本++,這段代碼沒」不改變編碼。它仍然設置爲LE BOM。
最後,我創建了這個csv文件的2個版本。兩者都是由Web應用程序生成的。但對於第二個文件,我使用Notepad ++將編碼更改爲可用的編碼。然後我用「Meld」嘗試對兩個文件進行差異化處理,但它們顯示爲相同。

EDIT 2

如果我改變邏輯,以便有針對IE的三叉戟沒有條件檢查,但代碼只是始終做到這一點:

function exportTableToCSV($tableName, fileName) { 
    var csv = GetCellValues($tableName); 
    console.log(csv); 
    console.log("filename is:" + fileName); 
    var uri = "data:text/csv;charset=utf-8," + encodeURIComponent(csv); 
    var downloadLink = document.createElement("a"); 
    downloadLink.href = uri; 
    downloadLink.download = fileName + ".csv"; 
    document.body.appendChild(downloadLink); 
    downloadLink.click(); 
    document.body.removeChild(downloadLink); 
} 

IE炸彈,出現以下錯誤:

SCRIPT122:傳遞給系統調用的數據區域太小。

它在「downloadLink.click();」上失敗呼叫。

+0

只是一個問題,爲什麼不忘記'三叉戟'的情況下,並使用其他方法,這是一個很好的和安全的方式,也可能適用,如果瀏覽器是IE三叉戟。 –

+0

@JavierRey這是一個很好的建議。但它失敗並出現錯誤。請參閱編輯2 – dot

+0

噢,是的,這不是我想象的那麼好。鏈接網址的大小在瀏覽器中是有限的,在IE中爲2080,在其他網址中則更多,但對於大的CSV字符串而言仍然太小。我會試着找到解決這個下載限制問題的解決方法,然後回到這裏。 –

回答

1

這裏是解決方案,我認爲,轉換CSV StringBlob,然後ObjectURL,而且,對於IE10 +,使用navigator.msSaveBlob

function exportCSV(csv, filename) { 
    if (!filename) {filename = 'export.csv';} 
    var blob = new Blob([csv], {type: 'text/csv;charset=utf-8;'}); 
    if (!navigator.msSaveBlob) { 
    var link = document.createElement("a"); 
    var url = URL.createObjectURL(blob); 
    link.setAttribute("href", url); 
    link.setAttribute("download", filename); 
    link.style.visibility = 'hidden'; 
    document.body.appendChild(link); 
    link.click(); 
    document.body.removeChild(link); 
    URL.revokeObjectURL(blob); 
    } else { 
    navigator.msSaveBlob(blob, filename); // IE 10+ 
    } 
} 

以下的實現:

function exportTableToCSV($tableName, fileName) { 
    var csv = GetCellValues($tableName); console.log(fileName, csv); 
    exportCSV(csv, fileName); 
} 

測試中Chrome,Firefox和IE11,有數千行。

+0

完美的作品。非常感謝 – dot