我想創建一個基於我的網頁上的表格中顯示的數據的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表頭?
就我嘗試遠
到目前爲止,我已經試過下面的代碼更改:
嘗試變更/指定編碼像這樣:(所有線路在這裏被註釋掉......但是我循環遍歷每一個並重新導出)
//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,')
試圖刪除報頭,像這樣:
// 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();」上失敗呼叫。
只是一個問題,爲什麼不忘記'三叉戟'的情況下,並使用其他方法,這是一個很好的和安全的方式,也可能適用,如果瀏覽器是IE三叉戟。 –
@JavierRey這是一個很好的建議。但它失敗並出現錯誤。請參閱編輯2 – dot
噢,是的,這不是我想象的那麼好。鏈接網址的大小在瀏覽器中是有限的,在IE中爲2080,在其他網址中則更多,但對於大的CSV字符串而言仍然太小。我會試着找到解決這個下載限制問題的解決方法,然後回到這裏。 –