2014/10/1

Question:
Excel可以直接開啟HTML裡的Table Tag,
所以想要將網頁裡的某個Table直接輸出成Excel的檔案。

Solve:
程式如下~
HTML:
<a id="dlink" style="display:none;"></a>
//需要一個隱藏的超連結,id="dlink"

<input type="button" value="下載"
       onclick="tableToExcel('myTableId', 'myTableId', 'myExcelFile.xls')" />
//給使用者按的下載按鈕,點擊後呼叫tableToExcel
//傳入參數為(要匯出的Table的Id, 定義一個名字, 匯出後的Excel檔名)

<table id="myTableId">...</table>
//要匯出的Table,記得定id

Javascript:
function tableToExcel(table, name, filename) {
  var uri = 'data:application/vnd.ms-excel;base64,';
  //定義格式及編碼方式

  var template = '<html xmlns:o="urn:schemas-microsoft-com:office:office"'
               + '      xmlns:x="urn:schemas-microsoft-com:office:excel"'
               + '      xmlns="http://www.w3.org/TR/REC-html40">'
               + '<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>'
               + '<body>'
               + '  <table>{table}</table>'
               + '</body>'
               + '</html>';
  //Excel的基本框架

  if (!table.nodeType)
    table = document.getElementById(table)

  var ctx = { worksheet: name || 'Worksheet', table: table.innerHTML }

  document.getElementById("dlink").href = uri + base64(format(template, ctx));
  //將超連結指向Excel內容
  document.getElementById("dlink").download = filename;
  //定義超連結下載的檔名
  document.getElementById("dlink").click();
  //執行點擊超連結的動作來下載檔案
  
}

function base64(s) {
  return window.btoa(unescape(encodeURIComponent(s)))
}
//將文字編譯成Base64格式

function format(s, c) {
  return s.replace(/{(\w+)}/g, function (m, p) { return c[p]; })
}
//將文字裡的{worksheet}和{table}替換成相對應文字
//把Table內容塞進Excel框架內

這樣點擊下載按鈕後就可以直接把Table轉成Excel檔案並下載囉!

提醒一下~
這方式是用Excel硬開HTML的檔案而已,所以並不是真正的Excel檔,
開啟時Excel會出現提醒訊息,不過基本的操作應該是沒問題的,
檔案實際使用的狀況還是要看使用者而定囉!

p.s.
IE因為不能用Data URI scheme所以這個方式可能不適用,非IE瀏覽器則可正常執行!
一定要IE可使用的話可能還是要想Server Side的程式來作業。

1 意見:

  1. 網誌管理員已經移除這則留言。

    回覆刪除