Wenn wir auf einem NodeJS-Server wären, könnten wir einen Header schreiben, einen MIME-Typ festlegen und ihn senden:
res.header("Content-Disposition", "attachment;filename="+name+".csv");
res.type("text/csv");
res.send(200, csvString);
Aufgrund der Header erstellt der Browser einen Download für die genannte CSV-Datei.
Wenn nützliche Daten in einem Browser generiert werden, besteht eine Lösung, um sie in eine CSV-Datei aufzunehmen, darin, Ajax zu verwenden, sie auf den Server hochzuladen (möglicherweise optional dort zu speichern) und den Server zu veranlassen, sie mit diesen Headern zurückzusenden, um a zu werden CSV-Download wieder im Browser.
Ich möchte jedoch eine 100% ige Browserlösung, die kein Ping-Pong mit dem Server beinhaltet.
So kam mir der Gedanke, dass man ein neues Fenster öffnen und versuchen könnte, den Header mit einem META-Tag-Äquivalent zu setzen.
In den letzten Chrome-Versionen funktioniert dies jedoch nicht.
Ich bekomme ein neues Fenster, das den csvString enthält, aber nicht als Download fungiert.
Ich denke, ich habe erwartet, dass ich entweder einen Download in einem unteren Tab oder ein leeres neues Fenster mit einem Download in einem unteren Tab bekomme.
Ich frage mich, ob die Meta-Tags korrekt sind oder ob auch andere Tags benötigt werden.
Gibt es eine Möglichkeit, dies zum Laufen zu bringen, ohne es auf den Server zu übertragen?
var A = [['n','sqrt(n)']]; // initialize array of rows with header row as 1st item
for(var j=1;j<10;++j){ A.push([j, Math.sqrt(j)]) }
var csvRows = [];
for(var i=0,l=A.length; i<l; ++i){
csvRows.push(A[i].join(',')); // unquoted CSV row
}
var csvString = csvRows.join("\n");
console.log(csvString);
var csvWin = window.open("","","");
csvWin.document.write('<meta name="content-type" content="text/csv">');
csvWin.document.write('<meta name="content-disposition" content="attachment; filename=data.csv"> ');
csvWin.document.write(csvString);