js導出word和excel

有些時候,我們想把網(wǎng)頁上的一些數(shù)據(jù)下載下來蜓耻,我們想要把它們用word和excel的方式保存茫舶,但是總是找不到合適的方法,最近我也遇到了這樣的問題刹淌,在網(wǎng)上搜羅一圈下來饶氏,也倒是有很多這方面的文章,但是主要是適用于IE瀏覽器的有勾,對于其他瀏覽器幾乎都是用的插件疹启,我就想用js自己寫一個可以導出文件的頁面。在搜尋了一些資料后蔼卡,自己寫了一個比較簡潔的喊崖。
一般情況下,我們導出的內(nèi)容為表格數(shù)據(jù)居多雇逞,所以我們就以表格為例荤懂,導出頁面內(nèi)容

html頁面內(nèi)容

頁面就一個基本的表格,和兩個按鈕塘砸,分別用于導出word和excel

   <body>
   <table id="score">
      <tr>
        <th>Name</th>
        <th>Grade</th>
        <th>Math</th>
        <th>History</th>
      </tr>
      <tr>
        <td>Like</td>
        <td>1</td>
        <td>65</td>
        <td>83</td>
      </tr>
      <tr>
        <td>Mary</td>
        <td>1</td>
        <td>34</td>
        <td>89.5</td>
      </tr>
      <tr>
        <td>Lily</td>
        <td>2</td>
        <td>90</td>
        <td>95</td>
      </tr>
      <tr>
        <td>BOb</td>
        <td>2</td>
        <td>76.3</td>
        <td>80.1</td>
      </tr>
      <tr>
        <td>Sendy</td>
        <td>3</td>
        <td>60</td>
        <td>79</td>
      </tr>
  </table>
     <input id="Button1" type="button" value="導出word" onclick="tableExport('doc')" />
     <input id="Button1" type="button" value="導出excel" onclick="tableExport('excel')" />
    </body>
js內(nèi)容
  • IE瀏覽器
    IE瀏覽器是最特別的势誊,它的excel導出是用到activex方式,使用js/vbs調(diào)用excel對象谣蠢,下面這種方法僅限于IE,所以局限性比較大查近。在我的另一個文章中已經(jīng)寫了如何判斷瀏覽器類型請點擊這里進入:JavaScript判斷瀏覽器類型
    if(getExplorer()=='ie')
    {
    var curTbl = document.getElementById(tableid);
    var oXL = new ActiveXObject("Excel.Application");

              //創(chuàng)建AX對象excel 
              var oWB = oXL.Workbooks.Add();
              //獲取workbook對象 
              var xlsheet = oWB.Worksheets(1);
              //激活當前sheet 
              var sel = document.body.createTextRange();
              sel.moveToElementText(curTbl);
              //把表格中的內(nèi)容移到TextRange中 
              sel.select;
              //全選TextRange中內(nèi)容 
              sel.execCommand("Copy");
              //復制TextRange中內(nèi)容  
              xlsheet.Paste();
              //粘貼到活動的EXCEL中       
              oXL.Visible = true;
              //設置excel可見屬性
    
              try {
                  var fname = oXL.Application.GetSaveAsFilename("Excel.xls", "Excel Spreadsheets (*.xls), *.xls");
              } catch (e) {
                  print("Nested catch caught " + e);
              } finally {
                  oWB.SaveAs(fname);
    
                  oWB.Close(savechanges = false);
                  //xls.visible = false;
                  oXL.Quit();
                  oXL = null;
                  //結(jié)束excel進程眉踱,退出完成
                  //window.setInterval("Cleanup();",1);
                  idTmr = window.setInterval("Cleanup();", 1);
    
              }
    
          }
    
  • 其他主流瀏覽器(Chrome、Firefox等)
    其實只要懂這個基本步驟和原理霜威,導出文件就變得輕而易舉了谈喳。下面的代碼是以導出word為例
    function tableExport(type){
    if(type=='doc'){
    var doc="";
    doc+="<table>";
    var html=document.getElementById("score").innerHTML;
    doc+=html;
    doc+="</table>";
    var docFile="<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:x='urn:schemas-microsoft-com:office:"+doc+"' xmlns='http://www.w3.org/TR/REC-html40'>";
    docFile=docFile+"<head></head>"+doc+"</body></html>";
    var base64data="base64,"+window.btoa(unescape(encodeURIComponent(docFile)));
    window.open('data:application/msword;'+ base64data);
    }
    }
    下面為導出word的示例圖片



    我們來詳細解讀一下代碼,首先漢化參數(shù)里的type是點擊按鈕是傳過去的對應的類型戈泼,doc或者excel婿禽,當判斷為doc時,定義變量doc大猛,doc的值就是table(也就是要導出的)內(nèi)容扭倾,然后把doc放在docFile這樣的形式中,encodeURIComponent()函數(shù)可把字符串作為 URI 組件進行編碼,該方法不會對 ASCII 字母和數(shù)字進行編碼挽绩,也不會對這些 ASCII 標點符號進行編碼: - _ . ! ~ * ' ( ),unescape()通過找到形式為 %xx 和 %uxxxx 的字符序列(x 表示十六進制的數(shù)字)膛壹,用 Unicode 字符 \u00xx 和 \uxxxx 替換這樣的字符序列進行解碼,btoa()就是把需要轉(zhuǎn)碼的進行base64編碼,編碼后才能被識別。

導出excel

      if(type=='excel'){
            var doc="";
            doc+="<table>";
            var html=document.getElementById("score").innerHTML;
            doc+=html;
            doc+="</table>";
            var docFile="<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:x='urn:schemas-microsoft-com:office:"+doc+"' xmlns='http://www.w3.org/TR/REC-html40'>";
            docFile=docFile+"<head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head>"+doc+"</body></html>";
            var base64data="base64,"+window.btoa(unescape(encodeURIComponent(docFile)));
            window.open('data:application/vnd.ms-excel;'+ base64data);
        }

下面為導出excel的示例圖片



你可以發(fā)現(xiàn)導出word和excel的代碼幾乎相同模聋,所以我們可以合并他們肩民,寫的更簡潔。

  function tableExport(type){
        var doc="";
        doc+="<table>";
        var html=document.getElementById("score").innerHTML;
        doc+=html;
        doc+="</table>";
        var a=document.body.innerHTML;
        var docFile="<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:x='urn:schemas-microsoft-com:office:"+a+"' xmlns='http://www.w3.org/TR/REC-html40'>";
        docFile=docFile+"<head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head>"+doc+"</body></html>";
        var base64data="base64,"+window.btoa(unescape(encodeURIComponent(docFile)));
        if(type=='doc'){
            window.open('data:application/msword;'+ base64data);
        }else if(type=='excel'){
            window.open('data:application/vnd.ms-excel;'+ base64data);
        }
    }

但是唯一不同的是MIME類型链方,也就是代碼中window.open里的內(nèi)容不同持痰,如果需要查看更多網(wǎng)頁中的重要MIME類型列表,點擊這里

擴展名 文檔類型 MIME Type
.doc Microsoft Word application/msword
.xls Microsoft Excel application/vnd.ms-excel
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末祟蚀,一起剝皮案震驚了整個濱河市工窍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌暂题,老刑警劉巖移剪,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異薪者,居然都是意外死亡纵苛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門言津,熙熙樓的掌柜王于貴愁眉苦臉地迎上來攻人,“玉大人,你說我怎么就攤上這事悬槽』澄牵” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵初婆,是天一觀的道長蓬坡。 經(jīng)常有香客問我,道長磅叛,這世上最難降的妖魔是什么屑咳? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮弊琴,結(jié)果婚禮上兆龙,老公的妹妹穿的比我還像新娘。我一直安慰自己敲董,他們只是感情好紫皇,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腋寨,像睡著了一般聪铺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上萄窜,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天计寇,我揣著相機與錄音锣杂,去河邊找鬼。 笑死番宁,一個胖子當著我的面吹牛元莫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蝶押,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼踱蠢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了棋电?” 一聲冷哼從身側(cè)響起茎截,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赶盔,沒想到半個月后企锌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡于未,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年撕攒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烘浦。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡抖坪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出闷叉,到底是詐尸還是另有隱情擦俐,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布握侧,位于F島的核電站蚯瞧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏品擎。R本人自食惡果不足惜埋合,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望孽查。 院中可真熱鬧,春花似錦坦喘、人聲如沸盲再。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽答朋。三九已至,卻和暖如春棠笑,著一層夾襖步出監(jiān)牢的瞬間梦碗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留洪规,地道東北人印屁。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像斩例,于是被迫代替她去往敵國和親雄人。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

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

  • 事件源對象 event.srcElement.tagName event.srcElement.type 捕獲釋放...
    孤魂草閱讀 888評論 0 0
  • 總的來說念赶,兩種方法:服務器端生成和瀏覽器端生成础钠。 服務器端生成就是:根據(jù)用戶請求,獲取相應的數(shù)據(jù)叉谜,使用poi/jx...
    顏之有霧閱讀 3,485評論 0 2
  • 第一章: JS簡介 從當初簡單的語言旗吁,變成了現(xiàn)在能夠處理復雜計算和交互,擁有閉包停局、匿名函數(shù)很钓, 甚至元編程等...
    LaBaby_閱讀 1,670評論 0 6
  • (20141008周三) 人人都說開卷有益,其實到了現(xiàn)在這個時代翻具,許多事履怯,不一定還像過去一樣非從看書中了解不可。喜...
    不完整的容器閱讀 871評論 5 12
  • 第一章 :悅來客棧 大唐隴州裆泳,敦煌郡有一處地方叹洲,喚作十里鄉(xiāng),位于沙城和玉門關的必經(jīng)之路上工禾。十里鄉(xiāng)周圍茫茫一片戈壁运提,...
    興海客閱讀 370評論 0 4