Within a Django application, I'm using SlickGrid to bind some XHR data to a client-side spreadsheet:
var grid;
var review_url = '/api/reviews/?t=' + current_tcode;
$.getJSON(review_url, function(data) {
grid = new Slick.Grid("#myGrid", data, columns, options);
});
I'd also like to give the user the option to download the data as a CSV file. What is the best approach to doing this?
SlickGrid feels fully-featured enough that it might have something in-built to output CSV, but I can't find anything on a quick search.
For export to CSV you may use this function:
$("#exporticon").click(function() {
var processRow = function (row) {
var finalVal = '';
for (var j = 0; j < row.length; j++) {
var innerValue = row[j] === null ? '' : row[j].toString();
if (row[j] instanceof Date) {
innerValue = row[j].toLocaleString();
};
var result = innerValue.replace(/"/g, '""');
if (result.search(/("|,|;|\n)/g) >= 0)
result = '"' + result + '"';
if (j > 0)
finalVal += ',';
finalVal += result;
}
return finalVal + '\n';
};
var csvFile = '';
var rows = [];
var colname = [];
for (var j = 0, len = grid.getColumns().length; j < len; j++) {
colname.push(grid.getColumns()[j].name);
}
rows.push(colname);
var singlerow = [];
for (var i = 0, l = dataView.getLength(); i < l; i++) {
for (var j = 0, len = grid.getColumns().length; j < len; j++) {
singlerow.push(grid.getDataItem(i)[grid.getColumns()[j].field]);
}
rows.push(singlerow);
singlerow = [];
}
for (var i = 0; i < rows.length; i++) {
csvFile += processRow(rows[i]);
}
var blob = new Blob([csvFile], { type: 'text/csv;charset=utf-8;' });
if (navigator.msSaveBlob) { // IE 10+
navigator.msSaveBlob(blob, "filename.csv");
} else {
var link = document.createElement("a");
if (link.download !== undefined) { // feature detection
// Browsers that support HTML5 download attribute
var url = URL.createObjectURL(blob);
link.setAttribute("href", url);
link.setAttribute("download", "filename.csv");
link.style.visibility = 'hidden';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
}
});