成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

js實(shí)現(xiàn)txt/excel文件下載

娣辯孩 / 1195人閱讀

摘要:出于安全考慮,無(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)保存功能。
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è)下載的功能。
HTML5的download屬性

這個(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)亂碼:
原因就是少了一個(gè)ufeffBOM頭,所以在data里面添加一個(gè)ufeff解決了
文字換行問(wèn)題
文字換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

相關(guān)文章

  • python大佬的養(yǎng)成計(jì)劃----os,datetime,time模塊補(bǔ)充

    摘要:是否則檢驗(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í),...

    frank_fun 評(píng)論0 收藏0
  • MySQL學(xué)習(xí)從這里出發(fā)!

    摘要:聚合函數(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ù)呢? (一...

    adam1q84 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<