30 votes

jQuery Table to CSV export

J'utilise le plugin jQuery Table to CSV. J'ai modifié la fenêtre contextuelle pour qu'elle demande au navigateur de télécharger un fichier CSV.

C'était :

function popup(data) {
  var generator = window.open('', 'csv', 'height=400,width=600'); 
  generator.document.write('<html><head><title>CSV</title>'); 
  generator.document.write('</head><body >'); 
  generator.document.write('<textArea cols=70 rows=15 wrap="off" >'); 
  generator.document.write(data); 
  generator.document.write('</textArea>'); 
  generator.document.write('</body></html>'); 
  generator.document.close();
  return true; 
}

Je l'ai changé en :

function popup(data) {
  window.location='data:text/csv;charset=utf8,' + encodeURIComponent(data);
  return true; 
}

Cela fonctionne, en grande partie. Il faut quand même que vous trouviez votre logiciel de tableur, et que vous créiez votre propre nom de fichier... parce qu'il crée un nom de fichier étrange (exemple : 14YuskG_.csv.part).

Avez-vous des suggestions sur la façon d'améliorer cette situation ?

20voto

timborden Points 820

J'ai trouvé une solution qui fonctionne (avec l'aide de http://www.topsemtips.com/2008/11/save-html-table-to-excel-using-jquery/ ) :

J'ai changé la fonction en :

function popup(data) {
    $("#main div.inner").append('<form id="exportform" action="export.php" method="post" target="_blank"><input type="hidden" id="exportdata" name="exportdata" /></form>');
    $("#exportdata").val(data);
    $("#exportform").submit().remove();
    return true; 
}

Et créé le fichier export.php :

<?php

    header("Content-type: application/vnd.ms-excel; name='excel'");
    header("Content-Disposition: filename=export.csv");
    header("Pragma: no-cache");
    header("Expires: 0");

    print $_REQUEST['exportdata'];

?>

Mise à jour : Une version plus conviviale pour IE7 :

<?php

    header('Content-Type: application/force-download');
    header('Content-disposition: attachment; filename=filename.csv');

    print $_POST['exportdata'];

?>

7voto

Zac Points 561

Merci pour votre question et votre réponse, cela a bien fonctionné pour moi. Voici la version ASP.Net (presque identique) de votre solution que j'utilise :

Changer la fonction popup de table2CSV.js en :

function popup(data) {
       $("body").append('<form id="exportform" action="CsvExport.ashx" method="post" target="_blank"><input type="hidden" id="exportdata" name="exportdata" /></form>');
       $("#exportdata").val(data);
       $("#exportform").submit().remove();
       return true;
} 

Je note le passage de export.php à un gestionnaire générique .ashx.

Le code du gestionnaire générique :

 public void ProcessRequest (HttpContext context) {
    context.Response.ContentType = "application/force-download";
    context.Response.AddHeader("content-disposition", "filename=filename.csv");

    context.Response.Write(context.Request.Form["exportdata"]);
}

6voto

Franz Points 652

Je ne recommande pas de "télécharger" des données CSV de cette façon. IE7 n'autorise que 2000 caractères maximum dans la barre d'adresse, il y a donc de fortes chances que votre fichier soit tronqué.

1voto

italo Points 3353

Pas compatible avec tous les navigateurs, mais aucun côté serveur n'est nécessaire ! Essayez le code ci-dessous en utilisant JSFiddle et dites-nous s'il fonctionne dans votre navigateur.

$('<a></a>')
    .attr('id','downloadFile')
    .attr('href','data:text/csv;charset=utf8,' + encodeURIComponent(data))
    .attr('download','filename.csv')
    .appendTo('body');

$('#downloadFile').ready(function() {
    $('#downloadFile').get(0).click();
});

0voto

Registered Alias Points 523

Je recommande vivement d'utiliser http://datatables.net/extras/tabletools/ il est très facile de jouer avec les tableaux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X