利用a標(biāo)簽導(dǎo)出csv文件

原文

博客原文

大綱

1哟旗、需求分析
2贩据、通過a標(biāo)簽實(shí)現(xiàn)文件導(dǎo)出
3、實(shí)現(xiàn)方式

1闸餐、需求分析

導(dǎo)出文件饱亮,使用最多的方式還是服務(wù)器端來處理。比如jsp中使用response的方式舍沙。
但是近上,有時(shí)候可能就想使用web前端是否也可以把頁面上的內(nèi)容導(dǎo)出來呢?比如說场勤,導(dǎo)出頁面的一個(gè)表格戈锻。
這個(gè)需求肯定是有答案的,只是對(duì)于各瀏覽器處理會(huì)稍微不一樣和媳。(主要是IE和其他瀏覽器的區(qū)別)格遭。
在IE中使用ActiveXObject 實(shí)現(xiàn),在firefox 和Chrome 中使用a標(biāo)簽(或者js)就可以實(shí)現(xiàn)了留瞳。
前端導(dǎo)出文件大部分還是通過服務(wù)器端的方式生成文件拒迅,然后傳遞到客戶端。但很多情況下當(dāng)我們導(dǎo)出CSV時(shí)并不需要后端參與她倘,甚至沒有后端璧微。
做過WebGIS的同學(xué)經(jīng)常會(huì)碰到這種場景,用戶的興趣點(diǎn)數(shù)據(jù)以csv文件形式上傳到web應(yīng)用中以表格形式展示硬梁,并可以編輯屬性信息前硫,編輯完成后需要將數(shù)據(jù)下載到本地。特別是對(duì)一些敏感數(shù)據(jù)荧止,用戶不希望傳遞到應(yīng)用服務(wù)器端屹电,整個(gè)過程完全在客戶端進(jìn)行。

2跃巡、通過a標(biāo)簽實(shí)現(xiàn)文件導(dǎo)出
2.1危号、通過a標(biāo)簽實(shí)現(xiàn)導(dǎo)出文件有兩種方式

1、通過href屬性來實(shí)現(xiàn)文件導(dǎo)出
2素邪、通過download屬性來實(shí)現(xiàn)文件導(dǎo)出(IE不兼容)
3外莲、通過navigator.msSaveBlob來實(shí)現(xiàn)(IE專屬,谷歌火狐不兼容)

2.2兔朦、需要注意

1偷线、IE有獨(dú)有的方法
2磨确、谷歌和火狐推薦使用結(jié)合Bolb、createObjectURL的方式(需要注意這兩者可能在低版本瀏覽器不兼容的情況)
3淋昭、需要注意的是在將數(shù)據(jù)導(dǎo)出成csv的時(shí)候需要先將數(shù)據(jù)轉(zhuǎn)換成對(duì)應(yīng)的格式俐填,這樣才能整齊導(dǎo)出

3、實(shí)現(xiàn)方式
3.1翔忽、IE瀏覽器
3.1.1英融、IE瀏覽器(IE10以下)

IE10以下,利用execCommand方法來保存csv文件
在實(shí)際應(yīng)用中瀏覽器會(huì)打開一個(gè)新窗口歇式,并彈出保存文件對(duì)話框驶悟,而對(duì)話框中保存類型時(shí),只有html和text兩項(xiàng)可選材失,此時(shí)需要在文件名中手動(dòng)加上“.csv”后綴痕鳍。

<html> 
  <head>  
  <meta http-equiv="content-type" content="text/html; charset=utf-8">  
  <meta name="author" content="oscar999">  
  <title>  
  </title>  
  </head>  
  <body>  
    <a id="mylink" href="#" onclick="clickDownload()">download</a>  
  </body> 
  <script> 
    function clickDownload(){
        var text = "欄位1,欄位2,欄位3\n值1,值2,值3"; 
        var fileName = "test.csv"
        
        var oWin = window.top.open("about:blank", "_blank");
        oWin.document.write('sep=,\r\n' + text);
        oWin.document.close();
        oWin.document.execCommand('SaveAs', true, fileName);
        oWin.close();
    }   
  </script>     
</html>  
3.1.2、IE瀏覽器(IE10以上)

IE10以及Edge瀏覽器使用navigator.msSaveBlob(blob)龙巨;雖然這些瀏覽器也支持execCommand的方法笼呆,但可以避免需要手動(dòng)添加文件后綴。
msSaveBlob是IE的私有方法旨别,只有IE10及以上和Edge瀏覽器支持诗赌。

<html> 
  <head>  
  <meta http-equiv="content-type" content="text/html; charset=utf-8">  
  <meta name="author" content="oscar999">  
  <title>  
  </title>  
  </head>  
  <body>  
    <a id="mylink" href="#" onclick="clickDownload()">download</a>  
  </body> 
  <script> 
    function clickDownload(){
        var text = "欄位1,欄位2,欄位3\n值1,值2,值3";
        var BOM = "\uFEFF";
        var fileName = "test.csv"http://名字不要寫錯(cuò),尤其是后綴秸弛,這關(guān)系到下載的文件格式
        var csvData = new Blob([BOM + text], { type: 'text/csv' });
        navigator.msSaveBlob(csvData, fileName);
    }
  </script>     
</html>  
3.2铭若、Firefox、Chrome递览、Safari
3.2.1叼屠、 download基本使用模式
<html> 
  <head>  
  <meta http-equiv="content-type" content="text/html; charset=utf-8">  
  <meta name="author" content="oscar999">  
  <title>  
  </title>  
  </head>  
  <body>  
    <a id="mylink" href="#" onclick="clickDownload()">download</a>  
  </body> 
  <script> 
    function clickDownload(){
        var text = "欄位1,欄位2,欄位3\n值1,值2,值3"; 
        var BOM = "\uFEFF";
        var fileName = "test.csv"
        var csvData = new Blob([BOM + text], { type: 'text/csv' });
        
        let downloadLink = document.createElement('a');
        downloadLink.href = 'data:attachment/csv;charset=utf-8,' + BOM + encodeURIComponent(text);
        downloadLink.target = '_blank';
        downloadLink.download = fileName;
        downloadLink.click();
    }   
  </script>     
</html>  
3.2.2、利用a標(biāo)簽的href和download屬性
<html> 
  <head>  
  <meta http-equiv="content-type" content="text/html; charset=utf-8">  
  <meta name="author" content="oscar999">  
  <title>  
  </title>  
  </head>  
  <body>  
    <a id="mylink" href="#" onclick="clickDownload()">download</a>  
  </body> 
  <script> 
    function clickDownload(){
        var text = "欄位1,欄位2,欄位3\n值1,值2,值3"; 
        var BOM = "\uFEFF";
        var fileName = "test.csv"
        var csvData = new Blob([BOM + text], { type: 'text/csv' });
        
        let downloadLink = document.createElement('a');
        downloadLink.href = 'data:attachment/csv;charset=utf-8,' + BOM + encodeURIComponent(text);
        downloadLink.target = '_blank';
        downloadLink.download = fileName;
        downloadLink.click();
    }   
  </script>     
</html>
3.2.3绞铃、對(duì)href的屬性進(jìn)行設(shè)置——使用createObjectURL創(chuàng)建連接镜雨,適用于較大的文件
<html> 
  <head>  
  <meta http-equiv="content-type" content="text/html; charset=utf-8">  
  <meta name="author" content="oscar999">  
  <title>  
  </title>  
  </head>  
  <body>  
    <a id="mylink" href="#" onclick="clickDownload()">download</a>  
  </body> 
  <script> 
    function clickDownload(){
        var text = "欄位1,欄位2,欄位3\n值1,值2,值3"; 
        var BOM = "\uFEFF";
        var fileName = "test.csv"
        var csvData = new Blob([BOM + text], { type: 'text/csv' }); 
        let downloadLink = document.createElement('a');
        downloadLink.href = window.URL.createObjectURL(csvData);
        downloadLink.download = fileName;
        document.body.appendChild(downloadLink);
        downloadLink.click();
        document.body.removeChild(downloadLink);
    }
  </script>     
</html>  
3.3.4、數(shù)據(jù)轉(zhuǎn)換成Blob形式再設(shè)置為href的值
<html> 
  <head>  
  <meta http-equiv="content-type" content="text/html; charset=utf-8">  
  <meta name="author" content="oscar999">  
  <title>  
  </title>  
  </head>  
  <body>  
    <a id="mylink" href="#" download="downlaod.csv">download</a>  
  </body> 
  <script>  
    var data = "欄位1,欄位2,欄位3\n值1,值2,值3"; 
    var blob = new Blob([data], { type: 'text/csv' }); //new way  
    var csvUrl = URL.createObjectURL(blob);  
    document.getElementById("mylink").href = csvUrl;    
  </script>     
</html>  
參考網(wǎng)址

https://www.cnblogs.com/dojo-lzz/p/4837041.html
http://blog.csdn.net/oscar999/article/details/16342699

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末儿捧,一起剝皮案震驚了整個(gè)濱河市冷离,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纯命,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痹栖,死亡現(xiàn)場離奇詭異亿汞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)揪阿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門疗我,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咆畏,“玉大人,你說我怎么就攤上這事吴裤【烧遥” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵麦牺,是天一觀的道長钮蛛。 經(jīng)常有香客問我,道長剖膳,這世上最難降的妖魔是什么魏颓? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮吱晒,結(jié)果婚禮上甸饱,老公的妹妹穿的比我還像新娘。我一直安慰自己仑濒,他們只是感情好叹话,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著墩瞳,像睡著了一般驼壶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上矗烛,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天辅柴,我揣著相機(jī)與錄音,去河邊找鬼瞭吃。 笑死碌嘀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的歪架。 我是一名探鬼主播股冗,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼和蚪!你這毒婦竟也來了止状?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤攒霹,失蹤者是張志新(化名)和其女友劉穎怯疤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體催束,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡集峦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塔淤。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡摘昌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出高蜂,到底是詐尸還是另有隱情聪黎,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布备恤,位于F島的核電站,受9級(jí)特大地震影響烘跺,放射性物質(zhì)發(fā)生泄漏湘纵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一滤淳、第九天 我趴在偏房一處隱蔽的房頂上張望梧喷。 院中可真熱鬧,春花似錦脖咐、人聲如沸铺敌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽偿凭。三九已至,卻和暖如春派歌,著一層夾襖步出監(jiān)牢的瞬間弯囊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工胶果, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留匾嘱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓早抠,卻偏偏與公主長得像霎烙,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蕊连,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5悬垃? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 27,485評(píng)論 1 45
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案甘苍? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,751評(píng)論 1 92
  • ??JavaScript 與 HTML 之間的交互是通過事件實(shí)現(xiàn)的载庭。 ??事件看彼,就是文檔或?yàn)g覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,490評(píng)論 1 11
  • 大片來襲
    Una520閱讀 122評(píng)論 0 1
  • 123一日禪:放下煩惱 眼前都是美景 冬天走了闲昭,是因?yàn)榇禾靵砹耍?太陽走了,是因?yàn)樵铝羴砹耍?云兒走了靡挥,是因?yàn)轱L(fēng)兒...
    123家庭大學(xué)_129rui閱讀 333評(píng)論 0 0