From 7ba8c8dfd9e8f3a63ac84601025fc3e8accdcefb Mon Sep 17 00:00:00 2001 From: Erick Ruano Date: Thu, 18 May 2017 18:46:15 -0600 Subject: [PATCH 1/4] Add jQuery support If jQuery is present Sizzle will be used instead of native selector. Backwards compatible. --- saveAsExcel.js | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/saveAsExcel.js b/saveAsExcel.js index 7bb1b7e..640b3c6 100644 --- a/saveAsExcel.js +++ b/saveAsExcel.js @@ -4,7 +4,18 @@ function saveAsExcel(id, fileName) var table_text=""; //Table Intialization, CSS included var textRange; var index=0; - var table = document.getElementById(id); // Read table using id + + // Use jQuery selector engine Sizzle when available + var jQuery = window.jQuery || 'undefined'; + if(jQuery !== 'undefined'){ + if(jQuery(id).length){ + var table = jQuery(id)[0]; + }else{ + var table = jQuery('#'+id)[0]; + } + }else{ + var table = document.getElementById(id); // Read table using id + } /* Read Table Data and append to table_text */ @@ -51,7 +62,15 @@ function saveAsExcel(id, fileName) var a = document.createElement('a'); //getting data from our div that contains the HTML table var data_type = 'data:application/vnd.ms-excel'; - var table_div = document.getElementById(id); + if(jQuery !== 'undefined'){ + if(jQuery(id).length){ + var table_div = jQuery(id)[0]; + }else{ + var table_div = jQuery('#'+id)[0]; + } + }else{ + var table_div = document.getElementById(id); // Read table using id + } var table_html = table_div.outerHTML.replace(/ /g, '%20'); table_html = table_html.replace(/]*>|<\/a>/g, ""); a.href = data_type + ', ' + table_html; From f5ca37c6ec214a569924d0da9faa52c5dfb9e57c Mon Sep 17 00:00:00 2001 From: Erick Ruano Date: Thu, 18 May 2017 18:48:17 -0600 Subject: [PATCH 2/4] Promise based error handling Added promise based error handling. --- saveAsExcel.js | 151 ++++++++++++++++++++++++++----------------------- 1 file changed, 79 insertions(+), 72 deletions(-) diff --git a/saveAsExcel.js b/saveAsExcel.js index 640b3c6..3fd2c86 100644 --- a/saveAsExcel.js +++ b/saveAsExcel.js @@ -1,83 +1,90 @@ function saveAsExcel(id, fileName) { - - var table_text="
"; //Table Intialization, CSS included - var textRange; - var index=0; + // Promise based error handling, though it all works synchronously, parameter-based callbacks are avoided. + return new Promise(function(resolve, reject){ + try{ + var table_text="
"; //Table Intialization, CSS included + var textRange; + var index=0; - // Use jQuery selector engine Sizzle when available - var jQuery = window.jQuery || 'undefined'; - if(jQuery !== 'undefined'){ - if(jQuery(id).length){ - var table = jQuery(id)[0]; - }else{ - var table = jQuery('#'+id)[0]; - } - }else{ - var table = document.getElementById(id); // Read table using id - } - /* - Read Table Data and append to table_text - */ - - for(index = 0 ; index < table.rows.length ; index++) - { - table_text=table_text+table.rows[index].innerHTML+""; - - } - - table_text=table_text+"
"; // table close - table_text= table_text.replace(/]*>|<\/a>/g, ""); //removes links embedded in - table_text= table_text.replace(/]*>/gi,""); //removes images embeded in - table_text= table_text.replace(/]*>|<\/input>/gi, ""); //removes input tag elements - - var userAgent = window.navigator.userAgent; //check client user agent to determine browser - var msie = userAgent.indexOf("MSIE "); // If it is Internet Explorer user Aget will have string MSIE - - if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) // If Internet Explorer - { - //Since IE > 10 supports blob, check for blob support and use if we can - if (typeof Blob !== "undefined") { - //Bolb Data is ArrayStorage, convert to array - table_text = [table_text]; - var blob = new Blob(table_text); - window.navigator.msSaveBlob(blob, ''+fileName); - } - else{ - //If Blob is unsupported, create an iframe in HTML Page, and call that blank iframe - - textArea.document.open("text/html", "replace"); - textArea.document.write(table_text); - textArea.document.close(); - textArea.focus(); - textArea.document.execCommand("SaveAs", true, fileName); - - } - } - - //Other Browsers - else - //Can use below statement if client machine has Excel Application installed - //window.open('data:application/vnd.ms-excel,' + encodeURIComponent(table_text)); - var a = document.createElement('a'); - //getting data from our div that contains the HTML table - var data_type = 'data:application/vnd.ms-excel'; + // Use jQuery selector engine Sizzle when available + var jQuery = window.jQuery || 'undefined'; if(jQuery !== 'undefined'){ if(jQuery(id).length){ - var table_div = jQuery(id)[0]; + var table = jQuery(id)[0]; }else{ - var table_div = jQuery('#'+id)[0]; + var table = jQuery('#'+id)[0]; } }else{ - var table_div = document.getElementById(id); // Read table using id + var table = document.getElementById(id); // Read table using id } - var table_html = table_div.outerHTML.replace(/ /g, '%20'); - table_html = table_html.replace(/]*>|<\/a>/g, ""); - a.href = data_type + ', ' + table_html; - - //setting the file name - a.download = ''+fileName; - //triggering the function - a.click(); + /* + Read Table Data and append to table_text + */ + + for(index = 0 ; index < table.rows.length ; index++) + { + table_text=table_text+table.rows[index].innerHTML+""; + + } + + table_text=table_text+""; // table close + table_text= table_text.replace(/]*>|<\/a>/g, ""); //removes links embedded in + table_text= table_text.replace(/]*>/gi,""); //removes images embeded in + table_text= table_text.replace(/]*>|<\/input>/gi, ""); //removes input tag elements + + var userAgent = window.navigator.userAgent; //check client user agent to determine browser + var msie = userAgent.indexOf("MSIE "); // If it is Internet Explorer user Aget will have string MSIE + + if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) // If Internet Explorer + { + //Since IE > 10 supports blob, check for blob support and use if we can + if (typeof Blob !== "undefined") { + //Bolb Data is ArrayStorage, convert to array + table_text = [table_text]; + var blob = new Blob(table_text); + window.navigator.msSaveBlob(blob, ''+fileName); + } + else{ + //If Blob is unsupported, create an iframe in HTML Page, and call that blank iframe + + textArea.document.open("text/html", "replace"); + textArea.document.write(table_text); + textArea.document.close(); + textArea.focus(); + textArea.document.execCommand("SaveAs", true, fileName); + + } + } + + //Other Browsers + else + //Can use below statement if client machine has Excel Application installed + //window.open('data:application/vnd.ms-excel,' + encodeURIComponent(table_text)); + var a = document.createElement('a'); + //getting data from our div that contains the HTML table + var data_type = 'data:application/vnd.ms-excel'; + if(jQuery !== 'undefined'){ + if(jQuery(id).length){ + var table_div = jQuery(id)[0]; + }else{ + var table_div = jQuery('#'+id)[0]; + } + }else{ + var table_div = document.getElementById(id); // Read table using id + } + var table_html = table_div.outerHTML.replace(/ /g, '%20'); + table_html = table_html.replace(/]*>|<\/a>/g, ""); + a.href = data_type + ', ' + table_html; + + //setting the file name + a.download = ''+fileName; + //triggering the function + a.click(); + resolve(); + }catch(err){ + reject(err); + } + }); } From c1979ee22f0c7fa07b912a56b79c885d07d74712 Mon Sep 17 00:00:00 2001 From: Erick Ruano Date: Thu, 18 May 2017 18:52:18 -0600 Subject: [PATCH 3/4] Added charset support Added optional charset parameter. --- saveAsExcel.js | 175 +++++++++++++++++++++++++------------------------ 1 file changed, 88 insertions(+), 87 deletions(-) diff --git a/saveAsExcel.js b/saveAsExcel.js index 3fd2c86..a8414ac 100644 --- a/saveAsExcel.js +++ b/saveAsExcel.js @@ -1,90 +1,91 @@ -function saveAsExcel(id, fileName) - { - // Promise based error handling, though it all works synchronously, parameter-based callbacks are avoided. - return new Promise(function(resolve, reject){ - try{ - var table_text=""; //Table Intialization, CSS included - var textRange; - var index=0; +function saveAsExcel(id, fileName, charset) { + // Promise based error handling, though it all works synchronously, parameter-based callbacks are avoided. + return new Promise(function(resolve, reject) { + try { + var charset = charset || 'UTF-8'; // Document charset, defaults to UTF-8 + var prepend = "" + var append = "" + var table_text = prepend + "
"; //Document and table Intialization, UTF-8 and CSS included + var textRange; + var index = 0; - // Use jQuery selector engine Sizzle when available - var jQuery = window.jQuery || 'undefined'; - if(jQuery !== 'undefined'){ - if(jQuery(id).length){ - var table = jQuery(id)[0]; - }else{ - var table = jQuery('#'+id)[0]; - } - }else{ - var table = document.getElementById(id); // Read table using id - } - /* - Read Table Data and append to table_text - */ - - for(index = 0 ; index < table.rows.length ; index++) - { - table_text=table_text+table.rows[index].innerHTML+""; - - } + // Use jQuery selector engine Sizzle when available + var jQuery = window.jQuery || 'undefined'; + if (jQuery !== 'undefined') { + if (jQuery(id).length) { + var table = jQuery(id)[0]; + } else { + var table = jQuery('#' + id)[0]; + } + } else { + var table = document.getElementById(id); // Read table using id + } + /* + Read Table Data and append to table_text + */ - table_text=table_text+"
"; // table close - table_text= table_text.replace(/]*>|<\/a>/g, ""); //removes links embedded in - table_text= table_text.replace(/]*>/gi,""); //removes images embeded in - table_text= table_text.replace(/]*>|<\/input>/gi, ""); //removes input tag elements + for (index = 0; index < table.rows.length; index++) { + table_text = table_text + table.rows[index].innerHTML + ""; - var userAgent = window.navigator.userAgent; //check client user agent to determine browser - var msie = userAgent.indexOf("MSIE "); // If it is Internet Explorer user Aget will have string MSIE - - if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) // If Internet Explorer - { - //Since IE > 10 supports blob, check for blob support and use if we can - if (typeof Blob !== "undefined") { - //Bolb Data is ArrayStorage, convert to array - table_text = [table_text]; - var blob = new Blob(table_text); - window.navigator.msSaveBlob(blob, ''+fileName); - } - else{ - //If Blob is unsupported, create an iframe in HTML Page, and call that blank iframe - - textArea.document.open("text/html", "replace"); - textArea.document.write(table_text); - textArea.document.close(); - textArea.focus(); - textArea.document.execCommand("SaveAs", true, fileName); - - } - } - - //Other Browsers - else - //Can use below statement if client machine has Excel Application installed - //window.open('data:application/vnd.ms-excel,' + encodeURIComponent(table_text)); - var a = document.createElement('a'); - //getting data from our div that contains the HTML table - var data_type = 'data:application/vnd.ms-excel'; - if(jQuery !== 'undefined'){ - if(jQuery(id).length){ - var table_div = jQuery(id)[0]; - }else{ - var table_div = jQuery('#'+id)[0]; - } - }else{ - var table_div = document.getElementById(id); // Read table using id - } - var table_html = table_div.outerHTML.replace(/ /g, '%20'); - table_html = table_html.replace(/]*>|<\/a>/g, ""); - a.href = data_type + ', ' + table_html; - - //setting the file name - a.download = ''+fileName; - //triggering the function - a.click(); - resolve(); - }catch(err){ - reject(err); - } - }); - - } + } + + table_text = table_text + "" + append; // table close + table_text = table_text.replace(/]*>|<\/a>/g, ""); //removes links embedded in + table_text = table_text.replace(/]*>/gi, ""); //removes images embeded in + table_text = table_text.replace(/]*>|<\/input>/gi, ""); //removes input tag elements + + var userAgent = window.navigator.userAgent; //check client user agent to determine browser + var msie = userAgent.indexOf("MSIE "); // If it is Internet Explorer user Aget will have string MSIE + + if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) // If Internet Explorer + { + //Since IE > 10 supports blob, check for blob support and use if we can + if (typeof Blob !== "undefined") { + //Bolb Data is ArrayStorage, convert to array + table_text = [table_text]; + var blob = new Blob(table_text); + window.navigator.msSaveBlob(blob, '' + fileName); + } else { + //If Blob is unsupported, create an iframe in HTML Page, and call that blank iframe + + textArea.document.open("text/html", "replace"); + textArea.document.write(table_text); + textArea.document.close(); + textArea.focus(); + textArea.document.execCommand("SaveAs", true, fileName); + + } + } + + //Other Browsers + else + //Can use below statement if client machine has Excel Application installed + //window.open('data:application/vnd.ms-excel,' + encodeURIComponent(table_text)); + var a = document.createElement('a'); + //getting data from our div that contains the HTML table + var data_type = 'data:application/vnd.ms-excel'; + if (jQuery !== 'undefined') { + if (jQuery(id).length) { + var table_div = jQuery(id)[0]; + } else { + var table_div = jQuery('#' + id)[0]; + } + } else { + var table_div = document.getElementById(id); // Read table using id + } + var table_html = prepend + table_div.outerHTML + append; + table_html = table_html.replace(/ /g, '%20'); + table_html = table_html.replace(/]*>|<\/a>/g, ""); + a.href = data_type + ', ' + table_html; + + //setting the file name + a.download = '' + fileName; + //triggering the function + a.click(); + resolve(); + } catch (err) { + reject(err); + } + }); + +} From 2b3fb3f9483d8f7ffde719f27acb77b87801c680 Mon Sep 17 00:00:00 2001 From: Erick Ruano Date: Thu, 18 May 2017 18:53:45 -0600 Subject: [PATCH 4/4] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2321c3f..cc246c4 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,6 @@ JavaScript library to convert HTMLTable to Excel with cross browser functionlity How To USe: 1. Import saveAsExcel.js into HTML web page using