On my MVC project I have a HTML table bound with Knockout.
I’m trying to Export the table to Excel.
I tried on client side with JavaScript:
self.exportToExcel = function () { javascript: window.open('data:application/vnd.ms-excel,' + $("#tableToprint").innerHTML()); }
OR:
var tableToExcel = (function () { var uri = 'data:application/vnd.ms-excel;base64,' , 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 cellspacing="0" rules="rows" border="1" style="color:Black;background-color:White;border-color:#CCCCCC;border-width:1px;border-style:None;width:100%;border-collapse:collapse;font-size:9pt;text-align:center;">{table}</table></body></html>' , base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))) } , format = function (s, c) { return s.replace(/{(w+)}/g, function (m, p) { return c[p]; }) } return function (table, name) { if (!table.nodeType) table = document.getElementById(table) var ctx = { worksheet: name || 'Worksheet', table: table.innerHTML } if (navigator.msSaveBlob) { var blob = new Blob([format(template, ctx)], { type: 'application/vnd.ms-excel', endings: 'native' }); navigator.msSaveBlob(blob, 'export.xlsx') } else { window.location.href = uri + base64(format(template, ctx)) } } })()
But both codes work in Chrome but not in IE.
I would like to do it on client side using JavaScript or jQuery but if there is not a solution that is supported by both browsers I can also do it in server side with an AJAX Post Request to my Web API.
How can I export a HTML table to Excel supported by Chrome and IE using JavaScript/jQuery OR AJAX and Web API?
Any advice?
Advertisement
Answer
I use the eligrey.filesaver then just use it as
window.saveAs(blob,filename);
based on jparaya’s answer I created a little sample in plunker, to save the file with filesaver It does the same as jparaya’s code except for the saving part:
function fnExcelReport(id, name) { var tab_text = '<html xmlns:x="urn:schemas-microsoft-com:office:excel">'; tab_text = tab_text + '<head><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>'; tab_text = tab_text + '<x:Name>Test Sheet</x:Name>'; tab_text = tab_text + '<x:WorksheetOptions><x:Panes></x:Panes></x:WorksheetOptions></x:ExcelWorksheet>'; tab_text = tab_text + '</x:ExcelWorksheets></x:ExcelWorkbook></xml></head><body>'; tab_text = tab_text + "<table border='1px'>"; var exportTable = $('#' + id).clone(); exportTable.find('input').each(function (index, elem) { $(elem).remove(); }); tab_text = tab_text + exportTable.html(); tab_text = tab_text + '</table></body></html>'; var fileName = name + '_' + parseInt(Math.random() * 10000000000) + '.xls'; //Save the file var blob = new Blob([tab_text], { type: "application/vnd.ms-excel;charset=utf-8" }) window.saveAs(blob, fileName); }