摘要:出于安全考慮,無(wú)法直接調(diào)用寫(xiě)文件到磁盤(pán),但是卻可以通過(guò)下載來(lái)變相實(shí)現(xiàn)保存功能。生成文件并下載是一種逗號(hào)分隔的表格文件格式,可以很好的被支持,由于其文件格式簡(jiǎn)單,所以經(jīng)常用在簡(jiǎn)單的表格上面。
出于安全考慮,JS無(wú)法直接調(diào)用FileAPI寫(xiě)文件到磁盤(pán),但是卻可以通過(guò)下載來(lái)變相實(shí)現(xiàn)保存功能。HTML5的download屬性
JS要實(shí)現(xiàn)下載功能,一般都是這么幾個(gè)過(guò)程:生成下載的URL,動(dòng)態(tài)創(chuàng)建一個(gè)A標(biāo)簽,并將其href指向生成的URL,然后觸發(fā)A標(biāo)簽的單擊事件,這樣就會(huì)彈出下載對(duì)話框,從而實(shí)現(xiàn)了一個(gè)下載的功能。
這個(gè)屬性很重要,它可以指定下載文件名,并且可以告訴瀏覽器目標(biāo)鏈接是一個(gè)下載鏈接,不是一個(gè)普通鏈接,我們看下面代碼就能看出區(qū)別了:
下載1 下載2
可以發(fā)現(xiàn),下載1按鈕能夠?qū)崿F(xiàn)下載,點(diǎn)擊下載2鏈接時(shí)直接在瀏覽器打開(kāi)文件內(nèi)容了。
JS生成CSV文件并下載csv是一種逗號(hào)分隔的表格文件格式,可以很好的被Excel支持,由于其文件格式簡(jiǎn)單,所以經(jīng)常用在簡(jiǎn)單的表格上面。最重要的是它是一種純文本格式,可以很輕松地用JS來(lái)生成而不借助第三方庫(kù)。
不考慮兼容性的保存CSV方法:/** * 保存CSV文件 * @params csv csv文件內(nèi)容 * @params saveName 保存的文件名 */ function saveCSV(csv, saveName){ var a = document.createElement("a"); a.href = "data:text/csv;charset=utf-8,ufeff" + encodeURIComponent(csv); a.download = saveName; a.click(); }
雖然我們用的是UTF-8編碼,下載后你會(huì)發(fā)現(xiàn),用文本編輯器打開(kāi)沒(méi)問(wèn)題,但是用Excel打開(kāi)亂碼:文字換行問(wèn)題
原因就是少了一個(gè)ufeffBOM頭,所以在data里面添加一個(gè)ufeff解決了
文字換csv的最大問(wèn)題就是如何處理?yè)Q行,很簡(jiǎn)單,使用` `,` `后再用encodeURIComponent編碼一下就可以了。
大部分瀏覽器可能都沒(méi)啥問(wèn)題,但是一些比較老的Chrome可能下載的時(shí)候指定的download就是不生效,此時(shí)可以用blob來(lái)解決:(測(cè)試此方法測(cè)試在微軟Edge瀏覽器和IE11下都無(wú)法下載)
考慮兼容性的保存CSV方法:/** * 保存CSV文件 * @params csv csv文件內(nèi)容 * @params saveName 保存的文件名 */ function saveCSV(csv, saveName) { var blob = new Blob(["ufeff" + csv], {type: "text/csv,charset=UTF-8"}); openDownloadDialog(blob, saveName); }
此方法測(cè)試在微軟Edge瀏覽器可以實(shí)現(xiàn)下載,但是在IE11下還是無(wú)法下載
封裝下載函數(shù)const openDownloadDialog = (url, saveName) => { if (typeof url === "object" && url instanceof Blob) { url = URL.createObjectURL(url); // 創(chuàng)建blob地址 } const aLink = document.createElement("a"); aLink.href = url; aLink.download = saveName; aLink.click(); };txt文件
下載text文件只需要修改一下文件類(lèi)型就行了
function saveTXT(csv, saveName) { var blob = new Blob(["ufeff" + csv], {type: "text/txt,charset=UTF-8"}); openDownloadDialog(blob, saveName); }注意事項(xiàng)
保存文件的文件名后綴會(huì)影響打開(kāi)方式,如果是.csv的文件名,默認(rèn)打開(kāi)為excel,.txt文件結(jié)尾的默認(rèn)打開(kāi)方式為text文件。所以這點(diǎn)需要注意
參考代碼我自己在項(xiàng)目中的封裝
downLoadTools.js
const openDownloadDialog = (url, saveName) => { if (typeof url === "object" && url instanceof Blob) { url = URL.createObjectURL(url); // 創(chuàng)建blob地址 } const aLink = document.createElement("a"); aLink.href = url; aLink.download = saveName; aLink.click(); }; export default { /** * 保存CSV文件 * @params csv csv文件內(nèi)容 * @params saveName 保存的文件名 */ saveCSV: (csv, saveName) => { const blob = new Blob(["ufeff" + csv], {type: "text/csv,charset=UTF-8"}); openDownloadDialog(blob, `${saveName}.csv`); }, saveTXT: (csv, saveName) => { // const href = "data:text/txt;charset=utf-8,ufeff" + encodeURIComponent(csv); // ie瀏覽器不支持 const blob = new Blob(["ufeff" + csv], {type: "text/tet,charset=UTF-8"}); openDownloadDialog(blob, `${saveName}.txt`); } };
頁(yè)面引用
import downLoadTools from "@/utils/downLoadTools"; // 引入 downLoadTools.saveTXT(csv, "文件名"); // csv是一個(gè)字符串, 最終會(huì)下載一個(gè) 文件名.txt 的文件
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95429.html
摘要:是否則檢驗(yàn)指定的對(duì)象是否存在。由于的模塊實(shí)現(xiàn)主要調(diào)用庫(kù),所以各個(gè)平臺(tái)可能有所不同。時(shí)間格式時(shí)間戳的方式通常來(lái)說(shuō),時(shí)間戳是指格林威治時(shí)間年月日時(shí)分秒北京時(shí)間年月日時(shí)分秒起至現(xiàn)在的總秒數(shù)。元組方式元組共有個(gè)元素,返回的函數(shù)主要有,,。 os模塊 os模塊提供了多數(shù)操作系統(tǒng)的功能接口函數(shù)。當(dāng)os模塊被導(dǎo)入后,它會(huì)自適應(yīng)于不同的操作系統(tǒng)平臺(tái),根據(jù)不同的平臺(tái)進(jìn)行相應(yīng)的操作,在python編程時(shí),...
摘要:聚合函數(shù)將一列數(shù)據(jù)作為一個(gè)整體,進(jìn)行縱向的計(jì)算。計(jì)算個(gè)數(shù)一般選擇非空的列主鍵計(jì)算最大值計(jì)算最小值計(jì)算和計(jì)算平均值注意聚合函數(shù)的計(jì)算,排除值。 MySQL數(shù)據(jù)庫(kù) 開(kāi)發(fā)學(xué)習(xí)中,想滿(mǎn)足一些需求,無(wú)疑需要經(jīng)常與數(shù)據(jù)打交道,例如,我們?cè)谑褂肐O的一些技術(shù)的時(shí)候,常常需要將一些數(shù)據(jù)存儲(chǔ)到外部文件,可能大家會(huì)問(wèn),我們初學(xué)的時(shí)候常常會(huì)簡(jiǎn)單的保存一些數(shù)據(jù)到 .txt 文件中,為什么還需要數(shù)據(jù)庫(kù)呢? (一...
閱讀 3680·2021-09-02 15:11
閱讀 4623·2021-08-16 10:47
閱讀 1575·2019-08-29 18:35
閱讀 3061·2019-08-28 17:54
閱讀 2859·2019-08-26 11:37
閱讀 1512·2019-08-23 16:51
閱讀 1823·2019-08-23 14:36
閱讀 1818·2019-08-23 14:21