Hoe JavaScript-array-info naar CSV (op clientzijde) exporteren?

Ik weet dat er veel vragen van deze aard zijn, maar ik moet dit doen met JavaScript. Ik gebruik Dojo 1.8en laat alle attribuutinformatie in array, die er als volgt uitziet:

[["name1", "city_name1", ...]["name2", "city_name2", ...]]

Enig idee hoe ik dit kan exporteren naar CSVaan de clientzijde?


Antwoord 1, Autoriteit 100%

U kunt dit doen in Native JavaScript. U zult uw gegevens moeten ontleden in het juiste CSV-formaat, zoals ook (ervan uitgaande dat u een reeks arrays gebruikt voor uw gegevens zoals in de vraag):

const rows = [
    ["name1", "city1", "some other info"],
    ["name2", "city2", "more info"]
];
let csvContent = "data:text/csv;charset=utf-8,";
rows.forEach(function(rowArray) {
    let row = rowArray.join(",");
    csvContent += row + "\r\n";
});

of de kortere manier (met behulp van pijl-functies ):

const rows = [
    ["name1", "city1", "some other info"],
    ["name2", "city2", "more info"]
];
let csvContent = "data:text/csv;charset=utf-8," 
    + rows.map(e => e.join(",")).join("\n");

Dan kunt u JavaScript’s window.openen encodeURIFuncties gebruiken om het CSV-bestand zoals SO te downloaden:

var encodedUri = encodeURI(csvContent);
window.open(encodedUri);

Bewerken:

Als u uw bestand een specifieke naam wilt geven, moet u dingen een beetje anders doen, aangezien dit niet wordt ondersteund toegang tot een gegevens URI met behulp van het venster window.openmethode. Om dit te bereiken, kunt u een verborgen <a>DOM-knooppunt maken en de downloadAttribuut als volgt:

var encodedUri = encodeURI(csvContent);
var link = document.createElement("a");
link.setAttribute("href", encodedUri);
link.setAttribute("download", "my_data.csv");
document.body.appendChild(link); // Required for FF
link.click(); // This will download the data file named "my_data.csv".

Antwoord 2, Autoriteit 29%

Op basis van de bovenstaande antwoorden heb ik deze functie gemaakt die ik heb getest op IE 11, Chrome 36 en Firefox 29

function exportToCsv(filename, rows) {
    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 = '';
    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);
    } 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);
            link.style.visibility = 'hidden';
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
        }
    }
}

Bijvoorbeeld:
https://jsfiddle.net/jossef/m3rrLzk0/


Antwoord 3, autoriteit 8%

Deze oplossing zou moeten werken met Internet Explorer 10+, Edge,oude en nieuwe versies van Chrome, FireFox, Safari, ++

Het geaccepteerde antwoord werkt niet met IE en Safari.

// Example data given in question text
var data = [
  ['name1', 'city1', 'some other info'],
  ['name2', 'city2', 'more info']
];
// Building the CSV from the Data two-dimensional array
// Each column is separated by ";" and new line "\n" for next row
var csvContent = '';
data.forEach(function(infoArray, index) {
  dataString = infoArray.join(';');
  csvContent += index < data.length ? dataString + '\n' : dataString;
});
// The download function takes a CSV string, the filename and mimeType as parameters
// Scroll/look down at the bottom of this snippet to see how download is called
var download = function(content, fileName, mimeType) {
  var a = document.createElement('a');
  mimeType = mimeType || 'application/octet-stream';
  if (navigator.msSaveBlob) { // IE10
    navigator.msSaveBlob(new Blob([content], {
      type: mimeType
    }), fileName);
  } else if (URL && 'download' in a) { //html5 A[download]
    a.href = URL.createObjectURL(new Blob([content], {
      type: mimeType
    }));
    a.setAttribute('download', fileName);
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
  } else {
    location.href = 'data:application/octet-stream,' + encodeURIComponent(content); // only this mime type is supported
  }
}
download(csvContent, 'dowload.csv', 'text/csv;encoding:utf-8');

Antwoord 4, autoriteit 4%

Ik kwam hier op zoek naar wat meer RFC 4180-compliance en ik kon geen implementatie vinden, dus maakte ik een (mogelijk inefficiënte) implementatie voor mijn eigen behoeften. Ik dacht dat ik het met iedereen zou delen.

var content = [['1st title', '2nd title', '3rd title', 'another title'], ['a a a', 'bb\nb', 'cc,c', 'dd"d'], ['www', 'xxx', 'yyy', 'zzz']];
var finalVal = '';
for (var i = 0; i < content.length; i++) {
    var value = content[i];
    for (var j = 0; j < value.length; j++) {
        var innerValue =  value[j]===null?'':value[j].toString();
        var result = innerValue.replace(/"/g, '""');
        if (result.search(/("|,|\n)/g) >= 0)
            result = '"' + result + '"';
        if (j > 0)
            finalVal += ',';
        finalVal += result;
    }
    finalVal += '\n';
}
console.log(finalVal);
var download = document.getElementById('download');
download.setAttribute('href', 'data:text/csv;charset=utf-8,' + encodeURIComponent(finalVal));
download.setAttribute('download', 'test.csv');

Hopelijk helpt dit iemand in de toekomst. Dit combineert zowel de codering van de CSV als de mogelijkheid om het bestand te downloaden. In mijn voorbeeld op jsfiddle. U kunt het bestand downloaden (uitgaande van een HTML 5-browser) of de uitvoer in de console bekijken.

UPDATE:

Chrome lijkt nu de mogelijkheid te hebben verloren om het bestand een naam te geven. Ik weet niet zeker wat er is gebeurd of hoe ik het moet oplossen, maar wanneer ik deze code gebruik (inclusief de jsfiddle), heet het gedownloade bestand nu download.csv.


Antwoord 5, autoriteit 3%

De oplossing van @Default werkt perfect in Chrome (heel erg bedankt daarvoor!) maar ik had een probleem met IE.

Hier is een oplossing (werkt op IE10):

var csvContent=data; //here we load our csv data 
var blob = new Blob([csvContent],{
    type: "text/csv;charset=utf-8;"
});
navigator.msSaveBlob(blob, "filename.csv")

Antwoord 6, autoriteit 3%

In de Chrome 35-update is het gedrag van het downloadkenmerk gewijzigd.

https://code.google.com/p/chromium/ issues/detail?id=373182

om dit in chrome te werken, gebruik dit

var pom = document.createElement('a');
var csvContent=csv; //here we load our csv data 
var blob = new Blob([csvContent],{type: 'text/csv;charset=utf-8;'});
var url = URL.createObjectURL(blob);
pom.href = url;
pom.setAttribute('download', 'foo.csv');
pom.click();

Antwoord 7, autoriteit 2%

Mensen proberen hun eigen csv-tekenreeks te maken, die mislukken in edge-cases, b.v. speciale tekens, dit is toch zeker een opgelost probleem?

papaparse– gebruik voor JSON naar CSV-codering. Papa.unparse().

import Papa from "papaparse";
const downloadCSV = (args) => {  
  let filename = args.filename || 'export.csv';
  let columns = args.columns || null;
  let csv = Papa.unparse({ data: args.data, fields: columns})
  if (csv == null) return;
  var blob = new Blob([csv]);
  if (window.navigator.msSaveOrOpenBlob)  // IE hack; see http://msdn.microsoft.com/en-us/library/ie/hh779016.aspx
      window.navigator.msSaveBlob(blob, args.filename);
  else
  {
      var a = window.document.createElement("a");
      a.href = window.URL.createObjectURL(blob, {type: "text/plain"});
      a.download = filename;
      document.body.appendChild(a);
      a.click();  // IE: "Access is denied"; see: https://connect.microsoft.com/IE/feedback/details/797361/ie-10-treats-blob-url-as-cross-origin-and-denies-access
      document.body.removeChild(a);
  }
}

Voorbeeld van gebruik

downloadCSV({ 
  filename: "filename.csv",
  data: [{"a": "1", "b": "2"}],
  columns: ["a","b"]
});

https://github.com/mholt/PapaParse/issues/175– Zie deze opmerking voor discussie over browserondersteuning.


Antwoord 8, autoriteit 2%

Werkt voor alle talen

       function convertToCsv(fName, rows) {
        var csv = '';
        for (var i = 0; i < rows.length; i++) {
            var row = rows[i];
            for (var j = 0; j < row.length; j++) {
                var val = row[j] === null ? '' : row[j].toString();
                val = val.replace(/\t/gi, " ");
                if (j > 0)
                    csv += '\t';
                csv += val;
            }
            csv += '\n';
        }
        // for UTF-16
        var cCode, bArr = [];
        bArr.push(255, 254);
        for (var i = 0; i < csv.length; ++i) {
            cCode = csv.charCodeAt(i);
            bArr.push(cCode & 0xff);
            bArr.push(cCode / 256 >>> 0);
        }
        var blob = new Blob([new Uint8Array(bArr)], { type: 'text/csv;charset=UTF-16LE;' });
        if (navigator.msSaveBlob) {
            navigator.msSaveBlob(blob, fName);
        } else {
            var link = document.createElement("a");
            if (link.download !== undefined) {
                var url = window.URL.createObjectURL(blob);
                link.setAttribute("href", url);
                link.setAttribute("download", fName);
                link.style.visibility = 'hidden';
                document.body.appendChild(link);
                link.click();
                document.body.removeChild(link);
                window.URL.revokeObjectURL(url);
            }
        }
    }
    convertToCsv('download.csv', [
        ['Order', 'Language'],
        ['1', 'English'],
        ['2', 'Español'],
        ['3', 'Français'],
        ['4', 'Português'],
        ['5', 'čeština'],
        ['6', 'Slovenščina'],
        ['7', 'Tiếng Việt'],
        ['8', 'Türkçe'],
        ['9', 'Norsk bokmål'],
        ['10', 'Ελληνικά'],
        ['11', 'беларускі'],
        ['12', 'русский'],
        ['13', 'Українська'],
        ['14', 'հայերեն'],
        ['15', 'עִברִית'],
        ['16', 'اردو'],
        ['17', 'नेपाली'],
        ['18', 'हिंदी'],
        ['19', 'ไทย'],
        ['20', 'ქართული'],
        ['21', '中国'],
        ['22', '한국어'],
        ['23', '日本語'],
    ])

Antwoord 9, Autoriteit 2%

U kunt het onderstaande stuk code gebruiken om de array naar het CSV-bestand te exporteren met JavaScript.

Dit handgrepen ook een deel van speciale tekens

var arrayContent = [["Séjour 1, é,í,ú,ü,ű"],["Séjour 2, é,í,ú,ü,ű"]];
var csvContent = arrayContent.join("\n");
var link = window.document.createElement("a");
link.setAttribute("href", "data:text/csv;charset=utf-8,%EF%BB%BF" + encodeURI(csvContent));
link.setAttribute("download", "upload_data.csv");
link.click(); 

Hier is de link naar Werken JSFiddle


Antwoord 10

Daar ga je:

<!doctype html>  
<html>  
<head></head>  
<body>
<a href='#' onclick='downloadCSV({ filename: "stock-data.csv" });'>Download CSV</a>
<script type="text/javascript">  
    var stockData = [
        {
            Symbol: "AAPL",
            Company: "Apple Inc.",
            Price: "132.54"
        },
        {
            Symbol: "INTC",
            Company: "Intel Corporation",
            Price: "33.45"
        },
        {
            Symbol: "GOOG",
            Company: "Google Inc",
            Price: "554.52"
        },
    ];
    function convertArrayOfObjectsToCSV(args) {
        var result, ctr, keys, columnDelimiter, lineDelimiter, data;
        data = args.data || null;
        if (data == null || !data.length) {
            return null;
        }
        columnDelimiter = args.columnDelimiter || ',';
        lineDelimiter = args.lineDelimiter || '\n';
        keys = Object.keys(data[0]);
        result = '';
        result += keys.join(columnDelimiter);
        result += lineDelimiter;
        data.forEach(function(item) {
            ctr = 0;
            keys.forEach(function(key) {
                if (ctr > 0) result += columnDelimiter;
                result += item[key];
                ctr++;
            });
            result += lineDelimiter;
        });
        return result;
    }
    window.downloadCSV = function(args) {
        var data, filename, link;
        var csv = convertArrayOfObjectsToCSV({
            data: stockData
        });
        if (csv == null) return;
        filename = args.filename || 'export.csv';
        if (!csv.match(/^data:text\/csv/i)) {
            csv = 'data:text/csv;charset=utf-8,' + csv;
        }
        data = encodeURI(csv);
        link = document.createElement('a');
        link.setAttribute('href', data);
        link.setAttribute('download', filename);
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
       }
</script>  
</body>  
</html>  

Antwoord 11

//It work in Chrome and IE ... I reviewed and readed a lot of answer. then i used it and tested in both ... 
var link = document.createElement("a");
if (link.download !== undefined) { // feature detection
    // Browsers that support HTML5 download attribute
    var blob = new Blob([CSV], { type: 'text/csv;charset=utf-8;' });
    var url = URL.createObjectURL(blob);            
    link.setAttribute("href", url);
    link.setAttribute("download", fileName);
    link.style = "visibility:hidden";
}
if (navigator.msSaveBlob) { // IE 10+
   link.addEventListener("click", function (event) {
     var blob = new Blob([CSV], {
       "type": "text/csv;charset=utf-8;"
     });
   navigator.msSaveBlob(blob, fileName);
  }, false);
}
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
//Regards

Antwoord 12

Oude vraag met veel goede antwoorden, maar hier is nog een eenvoudige optie die afhankelijk is van twee populaire bibliotheken om het voor elkaar te krijgen. Sommige antwoorden noemen Papa Parsemaar rollen hun eigen oplossing voor het downloadgedeelte. Door Papa Parse en FileSaver.jste combineren, kunt u het volgende proberen:

const dataString = Papa.unparse(data, config);
const blob = new Blob([dataString], { type: 'text/csv;charset=utf-8' });
FileSaver.saveAs(blob, 'myfile.csv');

De configopties voor unparseworden beschreven hier.


Antwoord 13

Een pijlfunctie met ES6:

const dataToCsvURI = (data) => encodeURI(
`data:text/csv;charset=utf-8,${data.map((row, index) =>  row.join(',')).join(`\n`)}`
);

Dan :

window.open(
  dataToCsvURI(
   [["name1", "city_name1"/*, ...*/], ["name2", "city_name2"/*, ...*/]]
  )
);

Als iemand dit nodig heeft voor reactjs, react-csvis daar voor


Antwoord 14

Er zijn hier twee vragen:

  1. Een array converteren naar een csv-tekenreeks
  2. Hoe sla je die string op in een bestand

Alle antwoorden op de eerste vraag (behalve die van Milimetric) lijken hier overdreven. En die van Milimetric dekt geen alternatieve vereisten, zoals het omringen van strings met aanhalingstekens of het converteren van arrays van objecten.

Dit is mijn mening hierover:

Voor een eenvoudige csv zijn één map() en een join() voldoende:

   var test_array = [["name1", 2, 3], ["name2", 4, 5], ["name3", 6, 7], ["name4", 8, 9], ["name5", 10, 11]];
    var csv = test_array.map(function(d){
        return d.join();
    }).join('\n');
    /* Results in 
    name1,2,3
    name2,4,5
    name3,6,7
    name4,8,9
    name5,10,11

Met deze methode kunt u ook een ander kolomscheidingsteken dan een komma in de inner join opgeven. bijvoorbeeld een tabblad: d.join('\t')

Aan de andere kant, als je het goed wilt doen en strings tussen aanhalingstekens “” wilt plaatsen, dan kun je wat JSON-magie gebruiken:

var csv = test_array.map(function(d){
       return JSON.stringify(d);
    })
    .join('\n') 
    .replace(/(^\[)|(\]$)/mg, ''); // remove opening [ and closing ]
                                   // brackets from each line 
/* would produce
"name1",2,3
"name2",4,5
"name3",6,7
"name4",8,9
"name5",10,11

als je een array van objecten hebt zoals :

var data = [
  {"title": "Book title 1", "author": "Name1 Surname1"},
  {"title": "Book title 2", "author": "Name2 Surname2"},
  {"title": "Book title 3", "author": "Name3 Surname3"},
  {"title": "Book title 4", "author": "Name4 Surname4"}
];
// use
var csv = data.map(function(d){
        return JSON.stringify(Object.values(d));
    })
    .join('\n') 
    .replace(/(^\[)|(\]$)/mg, '');

Antwoord 15

Veel rol-uw-eigen oplossingen hier voor het converteren van gegevens naar CSV, maar zo ongeveer allemaal zullen verschillende kantlijnen hebben in termen van het type gegevens dat ze correct zullen formatteren zonder Excel of de voorkeuren op te treden.

Waarom niet iets bewezens gebruiken: Papa parse

Papa.unparse(data[, config])

Combineer dit dan gewoon met een van de lokale downloadoplossingen. Die door @arnehb ziet er goed uit.


Antwoord 16

Het volgende is een native JS-oplossing.

function export2csv() {
  let data = "";
  const tableData = [];
  const rows = [
    ['111', '222', '333'],
    ['aaa', 'bbb', 'ccc'],
    ['AAA', 'BBB', 'CCC']
  ];
  for (const row of rows) {
    const rowData = [];
    for (const column of row) {
      rowData.push(column);
    }
    tableData.push(rowData.join(","));
  }
  data += tableData.join("\n");
  const a = document.createElement("a");
  a.href = URL.createObjectURL(new Blob([data], { type: "text/csv" }));
  a.setAttribute("download", "data.csv");
  document.body.appendChild(a);
  a.click();
  document.body.removeChild(a);
}
<button onclick="export2csv()">Export array to csv file</button>

Antwoord 17

Maak een BOB met de CSV-gegevens .ie var blob = new Blob([data], type:"text/csv");

Als de browser het opslaan van blobs ondersteunt, ie if window.navigator.mSaveOrOpenBlob)===true, slaat u vervolgens de CSV-gegevens op met: window.navigator.msSaveBlob(blob, 'filename.csv')

Als de browser niet ondersteunt opslaan en openen van blobs, sla dan CSV-gegevens op als:

var downloadLink = document.createElement('<a></a>');
downloadLink.attr('href', window.URL.createObjectURL(blob));
downloadLink.attr('download', filename);
downloadLink.attr('target', '_blank');
document.body.append(downloadLink);

Volledige code Snippet:

var filename = 'data_'+(new Date()).getTime()+'.csv';
var charset = "utf-8";
var blob = new Blob([data], {
     type: "text/csv;charset="+ charset + ";"
});
if (window.navigator.msSaveOrOpenBlob) {
     window.navigator.msSaveBlob(blob, filename);
} else {
    var downloadLink = document.element('<a></a>');
    downloadLink.attr('href', window.URL.createObjectURL(blob));
    downloadLink.attr('download', filename);
    downloadLink.attr('target', '_blank');  
    document.body.append(downloadLink); 
    downloadLink[0].click(); 
}

Antwoord 18

van reageren- admin :

function downloadCsv(csv, filename) {
    const fakeLink = document.createElement('a');
    fakeLink.style.display = 'none';
    document.body.appendChild(fakeLink);
    const blob = new Blob([csv], { type: 'text/csv' });
    if (window.navigator && window.navigator.msSaveOrOpenBlob) {
        // Manage IE11+ & Edge
        window.navigator.msSaveOrOpenBlob(blob, `${filename}.csv`);
    } else {
        fakeLink.setAttribute('href', URL.createObjectURL(blob));
        fakeLink.setAttribute('download', `${filename}.csv`);
        fakeLink.click();
    }
};
downloadCsv('Hello World', 'any-file-name.csv');

Antwoord 19

Zo download ik CSV-bestanden aan de clientzijde in mijn Java GWT-toepassing. Speciale dank aan Xavier John voor zijn oplossing. Het is geverifieerd om te werken in FF 24.6.0, IE 11.0.20 en Chrome 45.0.2454.99 (64-bit). Ik hoop dat dit iemand wat tijd bespaart:

public class ExportFile 
{
    private static final String CRLF = "\r\n";
    public static void exportAsCsv(String filename, List<List<String>> data) 
    {
        StringBuilder sb = new StringBuilder();
        for(List<String> row : data) 
        {
            for(int i=0; i<row.size(); i++)
            {
                if(i>0) sb.append(",");
                sb.append(row.get(i));
            }
            sb.append(CRLF);
        }
        generateCsv(filename, sb.toString());
    }
    private static native void generateCsv(String filename, String text)
    /*-{
        var blob = new Blob([text], { type: 'text/csv;charset=utf-8;' });
        if (navigator.msSaveBlob) // IE 10+
        { 
            navigator.msSaveBlob(blob, filename);
        } 
        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);
                link.style.visibility = 'hidden';
                document.body.appendChild(link);
                link.click();
                document.body.removeChild(link);
            }
        }
    }-*/;
}

Antwoord 20

Een minimalistische maar functie-complete oplossing 🙂

/** Convert a 2D array into a CSV string
 */
function arrayToCsv(data){
  return data.map(row =>
    row
    .map(String)  // convert every value to String
    .map(v => v.replaceAll('"', '""'))  // escape double colons
    .map(v => `"${v}"`)  // quote it
    .join(',')  // comma-separated
  ).join('\r\n');  // rows starting on new lines
}

Voorbeeld:

let csv = arrayToCsv([
  [1, '2', '"3"'],
  [true, null, undefined],
]);

Resultaat:

"1","2","""3"""
"true","null","undefined"

Download het nu als een bestand:


/** Download contents as a file
 * Source: https://stackoverflow.com/questions/14964035/how-to-export-javascript-array-info-to-csv-on-client-side
 */
function downloadBlob(content, filename, contentType) {
  // Create a blob
  var blob = new Blob([content], { type: contentType });
  var url = URL.createObjectURL(blob);
  // Create a link to download it
  var pom = document.createElement('a');
  pom.href = url;
  pom.setAttribute('download', filename);
  pom.click();
}

Download het:

downloadBlob(csv, 'export.csv', 'text/csv;charset=utf-8;')


Antwoord 21

Ik toegevoegd aan Xavier Johns functie om ook de veldkoppen als dat nodig is, gebruik maakt van jQuery wel. De $ .each beetje zal moeten veranderen voor een native javascript lus

function exportToCsv(filename, rows, headers = false) {
    var processRow = function (row) {
        row = $.map(row, function(value, index) {
            return [value];
        });
        var finalVal = '';
        for (var j = 0; j < row.length; j++) {
            if(i == 0 && j == 0 && headers == true){
                var ii = 0;
                $.each(rows[i], function( index, value ) {
                    //console.log(index);
                    var fieldName = index === null ? '' : index.toString();
                    //console.log(fieldName);
                    var fieldResult = fieldName.replace(/"/g, '""');
                    //console.log(fieldResult);
                    if (fieldResult.search(/("|,|\n)/g) >= 0){
                        fieldResult = '"' + fieldResult + '"';
                    }
                    //console.log(fieldResult);
                    if (ii > 0){
                        finalVal += ',';
                        finalVal += fieldResult;
                    }else{
                        finalVal += fieldResult;
                    }
                    ii++;
                    //console.log(finalVal);
                });
                finalVal += '\n';
                //console.log('end: '+finalVal);
            }
            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;
            }else{
                finalVal += result;
            }
        }
        return finalVal + '\n';
    };
    var csvFile = '';
    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);
    }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);
            link.style.visibility = 'hidden';
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
        }
    }
}

Antwoord 22

Hier is een hoekvriendelijke versie:

 constructor(private location: Location, private renderer: Renderer2) {}
  download(content, fileName, mimeType) {
    const a = this.renderer.createElement('a');
    mimeType = mimeType || 'application/octet-stream';
    if (navigator.msSaveBlob) {
      navigator.msSaveBlob(new Blob([content], {
        type: mimeType
      }), fileName);
    }
    else if (URL && 'download' in a) {
      const id = GetUniqueID();
      this.renderer.setAttribute(a, 'id', id);
      this.renderer.setAttribute(a, 'href', URL.createObjectURL(new Blob([content], {
        type: mimeType
      })));
      this.renderer.setAttribute(a, 'download', fileName);
      this.renderer.appendChild(document.body, a);
      const anchor = this.renderer.selectRootElement(`#${id}`);
      anchor.click();
      this.renderer.removeChild(document.body, a);
    }
    else {
      this.location.go(`data:application/octet-stream,${encodeURIComponent(content)}`);
    }
  };

Antwoord 23

De bovenstaande antwoorden werken, maar houd er rekening mee dat als je opent in het .xls-formaat, de kolommen ~~misschien~~ gescheiden worden door '\t'in plaats van ',', het antwoord https://stackoverflow.com/a/14966131/6169225werkte goed voor mij , zolang ik .join('\t')op de arrays gebruikte in plaats van .join(',').


Antwoord 24

Ik gebruik deze functie om een string[][]om te zetten naar een csv-bestand. Het citeert een cel, als het een ", een ,of andere witruimte bevat (behalve spaties):

/**
 * Takes an array of arrays and returns a `,` sparated csv file.
 * @param {string[][]} table
 * @returns {string}
 */
function toCSV(table) {
    return table
        .map(function(row) {
            return row
                .map(function(cell) {
                    // We remove blanks and check if the column contains
                    // other whitespace,`,` or `"`.
                    // In that case, we need to quote the column.
                    if (cell.replace(/ /g, '').match(/[\s,"]/)) {
                        return '"' + cell.replace(/"/g, '""') + '"';
                    }
                    return cell;
                })
                .join(',');
        })
        .join('\n'); // or '\r\n' for windows
}

Opmerking: werkt niet op Internet Explorer < 11 tenzij mappolygevuld is.

Opmerking: als de cellen getallen bevatten, kunt u cell=''+celltoevoegen vóór if (cell.replace...om getallen naar strings om te zetten.

Of je kunt het in één regel schrijven met ES6:

t.map(r=>r.map(c=>c.replace(/ /g, '').match(/[\s,"]/)?'"'+c.replace(/"/g,'""')+'"':c).join(',')).join('\n')

Antwoord 25

Probeer dit eens, sommige antwoorden hier behandelen geen Unicode-gegevens en gegevens met een komma, bijvoorbeeld datum.

function downloadUnicodeCSV(filename, datasource) {
    var content = '', newLine = '\r\n';
    for (var _i = 0, datasource_1 = datasource; _i < datasource_1.length; _i++) {
        var line = datasource_1[_i];
        var i = 0;
        for (var _a = 0, line_1 = line; _a < line_1.length; _a++) {
            var item = line_1[_a];
            var it = item.replace(/"/g, '""');
            if (it.search(/("|,|\n)/g) >= 0) {
                it = '"' + it + '"';
            }
            content += (i > 0 ? ',' : '') + it;
            ++i;
        }
        content += newLine;
    }
    var link = document.createElement('a');
    link.setAttribute('href', 'data:text/csv;charset=utf-8,%EF%BB%BF' + encodeURIComponent(content));
    link.setAttribute('download', filename);
    link.style.visibility = 'hidden';
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
};

Antwoord 26

CSV-bestand downloaden

 let csvContent = "data:text/csv;charset=utf-8,";
  rows.forEach(function (rowArray) {
    for (var i = 0, len = rowArray.length; i < len; i++) {
      if (typeof (rowArray[i]) == 'string')
        rowArray[i] = rowArray[i].replace(/<(?:.|\n)*?>/gm, '');
      rowArray[i] = rowArray[i].replace(/,/g, '');
    }
    let row = rowArray.join(",");
    csvContent += row + "\r\n"; // add carriage return
  });
  var encodedUri = encodeURI(csvContent);
  var link = document.createElement("a");
  link.setAttribute("href", encodedUri);
  link.setAttribute("download", "fileName.csv");
  document.body.appendChild(link);
  link.click();

Antwoord 27

In het geval iemand dit nodig heeft voor knockout js, het werkt goed met in principe de voorgestelde oplossing:

html:

<a data-bind="attr: {download: filename, href: csvContent}">Download</a>

model bekijken:

// for the download link
this.filename = ko.computed(function () {
    return ko.unwrap(this.id) + '.csv';
}, this);
this.csvContent = ko.computed(function () {
    if (!this.csvLink) {
        var data = ko.unwrap(this.data),
            ret = 'data:text/csv;charset=utf-8,';
        ret += data.map(function (row) {
            return row.join(',');
        }).join('\n');
        return encodeURI(ret);
    }
}, this);

Antwoord 28

Dit is een aangepast antwoord op basis van het geaccepteerde antwoord waarbij de gegevens afkomstig zouden zijn van JSON.

           JSON Data Ouptut:
             0 :{emails: "SAMPLE Co., [email protected]"}, 1:{emails: "Another CO. , [email protected]"}
            JS:
            $.getJSON('yourlink_goes_here', { if_you_have_parameters}, function(data) {
            var csvContent = "data:text/csv;charset=utf-8,";
            var dataString = '';
             $.each(data, function(k, v) {
                dataString += v.emails + "\n";
             });
            csvContent += dataString;
            var encodedUri = encodeURI(csvContent);
            var link = document.createElement("a");
            link.setAttribute("href", encodedUri);
            link.setAttribute("download", "your_filename.csv");
            document.body.appendChild(link); // Required for FF
            link.click();
        });

Antwoord 29

Als u op zoek bent naar een echt snelle oplossing, kunt u ook een kans geven aan deze kleine bibliotheek die een CSV-bestand voor u zal maken en downloaden: https://github.com/mbrn/filefy

Het gebruik is heel eenvoudig:

import { CsvBuilder } from 'filefy';
var csvBuilder = new CsvBuilder("user_list.csv")
  .setColumns(["name", "surname"])
  .addRow(["Eve", "Holt"])
  .addRows([
    ["Charles", "Morris"],
    ["Tracey", "Ramos"]
  ])
  .exportFile();

Other episodes