2009-05-28 15 views
30

Ich verwende die jQuery-Tabelle zu CSV-Plugin. Ich habe das Popup so geändert, dass es den Browser anweist, eine CSV-Datei herunterzuladen.jQuery Tabelle zu CSV-Export

Es war:

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

Es funktioniert, zum größten Teil:

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; 
} 

ich es geändert haben. Es ist immer noch erforderlich, dass Sie Ihre Tabellenkalkulationssoftware finden und einen eigenen Dateinamen erstellen ... weil er einen seltsamen Dateinamen erzeugt (Beispiel: 14YusqG_.csv.part).

Haben Sie Vorschläge, wie Sie das verbessern können?

+4

jQuery Tabelle in der CSV-Plugin: http://www.kunalbabre.com/projects/table2CSV.php dank Kunal BABRE – timborden

Antwort

20

eine Lösung gefunden, die (mit Hilfe von http://www.topsemtips.com/2008/11/save-html-table-to-excel-using-jquery/) arbeitet:

ich die Funktion geändert:

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; 
} 

und erstellt die Datei 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']; 

?> 

-Update : Eine mehr IE7 freundliche Version:

<?php 

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

    print $_POST['exportdata']; 

?> 
+0

+1 für mich gearbeitet. Allerdings habe ich $ ("body") verwendet. Append ([enter-form-here]); – Eddie

+5

Beachten Sie, dass dies einen Server-Round-Trip aller Daten erfordert. Wenn Sie viele Daten auf dem Client haben, ist dies nicht optimal. – desau

+5

Dies ist eindeutig eine schlechte Praxis. Wenn Sie unreine clientseitige Daten verwenden, sollten Sie zumindest vermeiden, den Server in diese einzubeziehen. Also entweder Daten vom Server generieren und echo oder einfach mit js direkt machen. –

6

Ich empfehle nicht, CSV-Daten auf diese Weise "herunterzuladen". IE7 erlaubt nur bis zu 2000 Zeichen in der Adressleiste, so dass die Wahrscheinlichkeit hoch ist, dass Ihre Datei abgeschnitten wird.

7

danke für deine frage und antwort, funktionierte gut für mich. Hier ist die (fast identisch) ASP.Net-Version Ihrer Lösung, die ich verwende:

ändern table2CSV.js Popup-Funktion:

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; 
} 

in Anbetracht der Änderung von export.php zu einem .ashx generischer Handler.

Der generische Handler-Code:

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"]); 
} 
1

Nicht kompatibel mit allen Browsern, aber keine Server-Seite erforderlich! Versuchen Sie den Code unter using JSFiddle und sagen Sie uns, ob es in Ihrem Browser läuft.

$('<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(); 
});