it-swarm.asia

كيفية تصدير معلومات صفيف JavaScript إلى ملف CSV (من جانب العميل)؟

أعلم أن هناك الكثير من الأسئلة من هذا النوع لكنني بحاجة إلى القيام بذلك باستخدام JavaScript. أنا أستخدم Dojo 1.8 ولدي كل معلومات السمة في الصفيف ، والتي تبدو كما يلي:

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

أي فكرة كيف يمكنني تصدير هذا إلى CSV من جانب العميل؟

431
Sam007

استنادًا إلى الإجابات أعلاه ، قمتُ بإنشاء هذه الوظيفة التي اختبرتها في IE 11 و Chrome 36 و 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);
        }
    }
}

على سبيل المثال: https://jsfiddle.net/jossef/m3rrLzk0/

199
Xavier John

يجب أن يعمل هذا الحل مع Internet Explorer 10+ و Edge و الإصدارات القديمة والجديدة من Chrome و FireFox و Safari و ++

لن تعمل الإجابة المقبولة مع IE و 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');

سيؤدي تشغيل مقتطف الشفرة إلى تنزيل البيانات الوهمية كـ csv

ائتمانات إلى dandavis https://stackoverflow.com/a/16377813/1350598

67
Arne H. Bitubekk

جئت إلى هنا للبحث عن المزيد من الامتثال RFC 4180 وفشلت في العثور على التنفيذ ، لذلك قمت (ربما غير فعال) لاحتياجاتي الخاصة. اعتقدت أنني سأشاركها مع الجميع.

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');

نأمل أن هذا سوف يساعد شخص ما في المستقبل. يجمع هذا بين كل من ترميز ملف CSV مع إمكانية تنزيل الملف. في المثال الخاص بي على jsfiddle . يمكنك تنزيل الملف (على افتراض متصفح HTML 5) أو عرض الإخراج في وحدة التحكم.

تحديث:

يبدو أن Chrome الآن فقد القدرة على تسمية الملف. لست متأكدًا مما حدث أو كيفية إصلاحه ، ولكن كلما استخدمت هذا الرمز (بما في ذلك jsfiddle) ، أصبح الملف الذي تم تنزيله الآن هو download.csv.

34
Uxonith

يعمل الحل منDefault بشكل مثالي على Chrome (شكرًا جزيلاً على ذلك!) ولكن واجهت مشكلة في IE.

إليك حل (يعمل على 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")
31
Dzarek

في تحديث Chrome 35 ، تم تغيير سلوك سمة التنزيل.

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

للعمل هذا في الكروم ، استخدم هذا

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();
15
Monu

العمل لجميع اللغات

        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', '日本語'],
    ])
14
Serdar Didan

ها أنت ذا :

<!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>  
12
Madhulika Mukherjee
//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
7
Mauri

إنشاء blob باستخدام csv data .ie var blob = new Blob([data], type:"text/csv");

إذا كان المستعرض يدعم حفظ النقاط ، أي if window.navigator.mSaveOrOpenBlob)===true ، فاحفظ بيانات ملف CSV باستخدام: window.navigator.msSaveBlob(blob, 'filename.csv')

إذا كان المتصفح لا يدعم حفظ وفتح النقط ، فقم بحفظ بيانات ملف CSV على النحو التالي:

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

مقتطف الشفرة الكامل:

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(); 
}
5
Liyosi

هناك سؤالان هنا:

  1. كيفية تحويل مجموعة إلى سلسلة CSV
  2. كيفية حفظ هذه السلسلة إلى ملف

كل الإجابات على السؤال الأول (باستثناء إجابة Milimetric) هنا تبدو مبالغة. والواحد من Milimetric لا يغطي متطلبات altrenative ، مثل السلاسل المحيطة مع اقتباسات أو تحويل صفائف الكائنات.

وهنا يأخذ بلدي على هذا:

بالنسبة إلى ملف CSV البسيط ، يكفي وجود خريطة واحدة () ووصلة ():

    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

تتيح لك هذه الطريقة أيضًا تحديد فاصل أعمدة غير فاصلة في الصلة الداخلية. على سبيل المثال علامة تبويب: d.join('\t')

من ناحية أخرى ، إذا كنت ترغب في القيام بذلك بشكل صحيح وإحاطة السلاسل في علامات اقتباس "" ، فيمكنك استخدام بعض السحر JSON:

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

إذا كان لديك مجموعة من الأشياء مثل:

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, '');
4
Konstantin

هناك الكثير من الحلول المتكاملة الخاصة هنا لتحويل البيانات إلى ملف CSV ، ولكن حولها جميعًا سيكون لها محاذير متنوعة فيما يتعلق بنوع البيانات التي ستقوم بتنسيقها بشكل صحيح دون زيادة تفوق Excel أو ما يعجبه.

لماذا لا تستخدم شيئًا مثبتًا: Papa Parse

Papa.unparse(data[, config])

ثم قم بدمج هذا مع أحد حلول التنزيل المحلية هنا على سبيل المثال. واحدة منArneHB تبدو جيدة.

3
John Rix

وظيفة سهم واحد مع ES6:

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

ثم :

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

في حالة احتياج أي شخص لهذا reactjs ، react-csv هل هناك لذلك

3
Abdennour TOUMI

يمكنك استخدام الجزء التالي من التعليمات البرمجية لتصدير صفيف إلى ملف CSV باستخدام Javascript.

هذا يعالج شخصيات خاصة جزء كذلك

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(); 

هنا هو الرابط للعمل jsfiddle

3
Vignesh Subramanian

إليك كيفية تنزيل ملفات CSV على جانب العميل في تطبيق Java GWT. شكر خاص لكزافييه جون لحله. تم التحقق من العمل في FF 24.6.0 و IE 11.0.20 و Chrome 45.0.2454.99 (64 بت). آمل أن ينقذ هذا الشخص بعض الوقت:

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);
            }
        }
    }-*/;
}
1
Justin Stein

إليك إصدارًا سهل الاستخدام Angular:

  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)}`);
    }
  };
1
Chrillewoodz

تعمل الإجابات أعلاه ، ولكن ضع في اعتبارك أنه في حالة فتحك بتنسيق .xls ، يمكن فصل الأعمدة ~~ عن طريق '\t' بدلاً من ',' ، والإجابة https://stackoverflow.com/a/14966131/6169225 عملت بشكل جيد بالنسبة لي ، طالما كنت .join('\t') في المصفوفات بدلاً من .join(',').

1
Marquistador

يحاول الناس إنشاء سلسلة CSV الخاصة بهم ، والتي تفشل في حالات Edge ، على سبيل المثال شخصيات خاصة ومثل ، بالتأكيد هذه مشكلة تم حلها بشكل صحيح؟

papaparse - استخدام لترميز JSON إلى CSV. 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);
  }

}

مثال للاستخدام

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

https://github.com/mholt/PapaParse/issues/175 - راجع هذا التعليق لمناقشة دعم المتصفح.

0
Glen Thompson

ما عليك سوى تجربة ذلك ، فبعض الإجابات هنا لا تتعامل مع بيانات وبيانات يونيكود التي تحتوي على فاصلة على سبيل المثال تاريخ.

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);
};
0
imal hasaranga perera

أضفت إلى وظيفة كزافييه جونز لتشمل أيضا رؤوس الحقول إذا لزم الأمر ، يستخدم jQuery رغم ذلك. سيحتاج كل بت $ .each إلى تغيير في حلقة جافا سكريبت أصلية

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);
        }
    }
}
0
Bim

أستخدم هذه الوظيفة لتحويل string[][] إلى ملف CSV. يقتبس خلية ، إذا كان يحتوي على " أو , أو مسافة بيضاء أخرى (باستثناء الفراغات):

/**
 * 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

}

ملاحظة : لا يعمل على Internet Explorer <11 ما لم يتم map polyfilled.

ملاحظة : إذا كانت الخلايا تحتوي على أرقام ، فيمكنك إضافة cell=''+cell قبل if (cell.replace... لتحويل الأرقام إلى سلاسل.

أو يمكنك كتابتها في سطر واحد باستخدام ES6:

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

في حالة احتياج أي شخص لهذا الأمر بالنسبة لقضية خروج المغلوب ، فإنه يعمل بشكل جيد مع الحل المقترح بشكل أساسي:

أتش تي أم أل:

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

عرض النموذج:

// 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);
0
Milimetric

هذه إجابة معدلة استنادًا إلى الإجابة المقبولة حيث ستأتي البيانات من 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();
        });
0
Ronald G

أوصي باستخدام مكتبة مثل PapaParse: https://github.com/mholt/PapaParse

للإجابة المقبولة حاليًا مشكلات متعددة بما في ذلك:

  • فشل إذا كانت البيانات تحتوي على فاصلة
  • فشل إذا كانت البيانات تحتوي على فاصل
  • يفشل (نوع من) إذا كانت البيانات تحتوي على علامة اقتباس
0
Falk Tandetzky