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