web-dev-qa-db-fra.com

Exportation de tableaux HTML vers Excel (.xls) dans une feuille séparée

J'ai une simple page HTML (générée par une application externe) qui contient une vue tabulaire. J'essaie de gratter les tableaux de la page et de les mettre dans un classeur Excel. J'ai réussi à mettre tout le contenu HTML dans un classeur en utilisant la méthode disponible ici .

Code de la question connexe:

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>{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}
    window.location.href = uri + base64(format(template, ctx))
  }
})()

Cependant, la méthode ne prend pas en charge plusieurs feuilles de calcul. Ce dont j'ai besoin, c'est que chaque table HTML se trouve dans sa propre feuille de calcul dans le même classeur Excel. Quelque chose comme ça: enter image description here

J'ai essayé de créer un exemple de document Excel avec deux feuilles de calcul, puis de le désosser en regardant une exportation au format .html. Malheureusement, je n'ai pas compris comment recréer la connexion entre un classeur et ses feuilles.

Autant que je puisse comprendre, la fonction format() fait la combinaison "magique" des données de la feuille de calcul et du modèle Excel. La fonction me semble très cryptique, donc je n'ai aucune idée de comment la modifier.

Ce dont j'ai besoin en fin de partie, c'est d'avoir la possibilité d'appeler quelque chose comme. tableToExcel(document.getElementsByTagName('table'), 'Workbook Name');

Avez-vous des idées si cela est possible, et si oui - comment y arriver?

13
Atanas Bozhkov

Découvrez ce billet de blog: http://www.kubilayerdogan.net/?p=218

 $(document).ready(function() {
    $("#btnExport").click(function(e) {
        //getting values of current time for generating the file name
        var dt = new Date();
        var day = dt.getDate();
        var month = dt.getMonth() + 1;
        var year = dt.getFullYear();
        var hour = dt.getHours();
        var mins = dt.getMinutes();
        var postfix = day + "." + month + "." + year + "_" + hour + "." + mins;
        //creating a temporary HTML link element (they support setting file names)
        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('dvData');
        var table_html = table_div.outerHTML.replace(/ /g, '%20');
        a.href = data_type + ', ' + table_html;
        //setting the file name
        a.download = 'exported_table_' + postfix + '.xls';
        //triggering the function
        a.click();
        //just in case, prevent default behaviour
        e.preventDefault();
    });
});

Vous pouvez le voir en action dans jsfiddle: http://jsfiddle.net/kublaios/8ZQN4/1/

3
muek