JavaScript 배열 정보를 CSV로 내보내는 방법 (클라이언트 측)?


511

나는이 성격에 대해 많은 질문이 있다는 것을 알고 있지만 JavaScript를 사용 하여이 작업을 수행해야합니다. Dojo 1.8배열에 모든 속성 정보를 사용 하고 있으며 다음과 같습니다.

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

CSV클라이언트 쪽에서 어떻게 내보낼 수 있습니까?

답변:


837

기본 JavaScript에서이 작업을 수행 할 수 있습니다. 질문에 설명 된대로 데이터 배열을 사용한다고 가정하면 데이터를 올바른 CSV 형식으로 구문 분석해야합니다.

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

또는 짧은 방법 ( 화살표 기능 사용 ) :

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

그런 다음 JavaScript window.openencodeURI함수를 사용 하여 CSV 파일을 다음과 같이 다운로드 할 수 있습니다 .

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

편집하다:

파일에 특정 이름을 지정하려면 window.open메소드를 사용하여 데이터 URI에 액세스하는 것이 지원되지 않으므로 약간 다르게 수행해야합니다 . 이를 위해 숨겨진 <a>DOM 노드를 작성하고 download다음과 같이 속성을 설정할 수 있습니다 .

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".

4
내가 아는 것으로부터를 사용하여 그 방법을 찾을 수 없습니다 window.open. 그러나 download원하는 파일 이름 으로 속성이 설정된 숨겨진 링크를 만들 수 있습니다 . 그런 다음이 링크를 "클릭"하면 원하는 이름으로 파일이 다운로드되고 내 답변에 추가합니다.
기본값

14
document.body.appendChild(link);FF를 완벽하게 지원 하려면 추가 해야했습니다.
Hardbyte

9
이 답변은 잘못되었습니다 : 그것은 실패합니다 data = [["Hello, world"]]. 하나를 출력해야 할 때 두 개의 열을 출력합니다.
aredridel

18
~ 7000 행과 같이 잘 작동합니다. 그러나 NETWORK_INVALID_REQUEST 오류가 발생하기 시작합니다 . 다른 사람도이 문제에 직면하고 있습니까? encodeURIComponent()기능이나 다른 데이터에 대한 상한선이 있습니까? 브라우저로 Chrome을 사용하고 있습니다.
Abhidemon

13
@Abhidemon 대답은 큰 것을 위해 blob 유형을 사용해야하고 잘 작동한다는 것입니다. 예 : blob = new Blob ([csvContent], {type : "text / csv"}); href = window.URL.createObjectURL (blob); 자세한 내용 : stackoverflow.com/a/19328891/1854079
mdubez

256

위의 답변을 기반으로 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/


6
- 백 떨어질 수 window.openelse의를 link.download !== undefined.
MrYellow

2
이것은 좋은 코드입니다. SO 기본값 CC-BY-SA보다 더 자유로운 것으로 라이센스를 부여 할 수 있습니까? 예를 들어 CC0, MIT, BSD, Apache, X11입니다. . . meta.stackexchange.com/questions/12527/...는
joseph_morris

1
이 방법을 사용하여 일부 웹 응용 프로그램에서 Excel 내보내기를 구현했습니다. 그러나 Chrome 43 이상에서는 DOM 속성을 프로토 타입 체인으로 옮겼습니다. 에서 예외가 발생 link.style.visibility='hidden'합니다. B / c DOM 속성은 읽기 전용입니다. 자세한 내용은 updates.html5rocks.com/2015/04/… 에서 확인할 수 있습니다. "엄격 모드에서 읽기 전용 속성에 쓰는 경우 오류가 발생합니다"
Blaise

1
이 답변은 지금까지 가장 좋은 답변입니다. 특수 문자와 괄호가있는 경우가 포함됩니다.
블라디미르 코스 토프

2
이 답변의 다운로드 섹션을 사용했으며 Chrome에서 잘 작동했습니다. 감사합니다!
Liran H

77

이 솔루션은 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


1
(최소한 HTML5 코드)는.없이 작동합니다 setTimeout.
StubbornShowaGuy

내가 :) 예제 코드에서의 setTimeout 제거 할 수 있습니다 후 냉각 @StubbornShowaGuy
아르네 H. Bitubekk

최신 Chrome, IE 및 Firefox에서 작동합니다. 감사!
walla

여기서 진정한 크로스 브라우저 솔루션입니다. Safari 10.10 및 모바일 Safari에서 작동합니다. 그러나이 iframe섹션은 location.href = ...로 대체 될 수 있습니다.
Dan

2
참고 : 함수에 오타가 있습니다 (실제로 URL.createObjectURL끝나지 URL않습니다 Url).
Nathan Hinchey

35

나는 좀 더 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.


잘 잡는다 Chris, 나는 수치 데이터로 그것을 테스트하지 않았다 :)
Uxonith

마지막 null 확인이 반드시 예상되는 동작인지 모르겠습니다. 널은 빈 문자열과 매우 다릅니다. 이를 구현하려면 사용자 지정 null 값 (예 : '[[NULL]]')을 권장합니다. undefined에 대한 예외도 필요할 수 있지만 null을 빈 문자열로 바꾸지 않는 것이 좋습니다.
Uxonith

테스트 한 결과 당신이 옳다는 것을 알았습니다. 이것은 Chrome 및 Opera에서 작동하는 것 같습니다. Safari는 컨텐츠가있는 페이지를 엽니 다. Internet Explorer ... 글쎄 IE입니다. 내 상황에서는 CSV 서버 측을 생성하여 슬프게도 그렇게 할 것입니다.
Uxonith

33

@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")

23

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

1
: 당신은이 일 확인하실 수 있습니다 github.com/mholt/PapaParse/issues/175#issuecomment-201308792
가브리엘

이것은 현재 정답이며 승인 된 것으로 표시된 답변이 아닙니다!
meow

17

모든 언어에 대한 작업

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

감동적인! (+1). StackOverflow에 오신 것을 환영합니다, 친구!
Rann Lifshitz

UTF-16 코드 블록이 무엇이며 여기에 사용되는 것이 무엇인지 이해하도록 도와 줄 수 있습니까?
Mar1009

안녕하세요 Mar1009. 일부 언어에는 필요합니다. 예를 들어 키릴 알파벳입니다.
Serdar Didan

13

당신은 간다 :

<!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>  

1
멋진 답변입니다. 어떤 이유로 든 받아 들인 대답 으로이 것을 찬성합니다. 모든 것을 단일 열에 넣습니다. 이것은 모든 것을 별도의 열로 나누고 JSON과 같은 데이터 형식 지원은 매우 유용합니다.
Hoser

링크가 문서 본문에 처음 추가 된 다음 클릭이 호출 될 때 작동합니다. 그런 다음 돔에서 제거됩니다.
Jay Dubal

1
좋은 대답은 데이터에 열 구분 기호 ""(예 : 주소 : '10 무한 루프 레인, 방 56 ')가있는 경우 제대로 작동하지 않는다는 것입니다. 레인 뒤에 쉼표를 확인하십시오. 난 당신이 PapaParse 사용하는 것이 좋습니다 링크를 다음 실제 파일 다운로드 downloadCSV 방법 위의를 사용하여 CSV로 데이터를 변환

이것은 나에게 완벽하게 작동합니다. 하나의 문제가 있습니다 .'000002342 '와 같은 배열에 숫자가 있지만 csv로 내 보내면 선행 0이 제거됩니다. 이것을 막을 방법이 있습니까?
Aakarsh Dhawan

13

사람들은 특수 문자와 같은 가장자리 경우에 실패하는 자체 csv 문자열을 만들려고 노력하고 있습니다. 확실히 해결 된 문제입니까?

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- 브라우저 지원 토론에 대해서는이 주석을 참조하십시오.


10

아래 코드를 사용하여 Javascript를 사용하여 배열을 CSV 파일로 내보낼 수 있습니다.

특수 문자 부분도 처리합니다.

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에 대한 링크입니다


1
특별한 캐릭터를위한 최고의 답변
Alejandro

# (해시 태그)가 작동하지 않습니다!
Nakres

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

6

csv 데이터로 블롭 만들기 var blob = new Blob([data], type:"text/csv");

브라우저가 blob 저장을 지원하는 경우 (예 :) 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

여기에 두 가지 질문이 있습니다.

  1. 배열을 CSV 문자열로 변환하는 방법
  2. 해당 문자열을 파일에 저장하는 방법

여기에서 첫 번째 질문에 대한 모든 답변 (Milimetric의 답변 제외)은 과도하게 보입니다. 그리고 Milimetric의 문자열은 따옴표로 묶는 문자열이나 객체 배열 변환과 같은 대체 요구 사항을 다루지 않습니다.

여기에 내 취지가 있습니다 :

간단한 CSV의 경우 map () 및 join ()으로 충분합니다.

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

내가 실수하지 않으면 .replace중괄호와 대괄호를 지정해야 한다고 생각합니다 .
aaronbartell

.replacevalues()객체를 가져 와서 값의 배열을 반환하는 문자열에 의해 수행 됩니다
Konstantin

values()내가 코드를 시도 할 때 방법을 찾을 수 없습니다.
aaronbartell

감사! Chrome에서는에서 values()명시 적으로 호출하지 않고 작동 합니다 Object. 예제를 수정했습니다.
Konstantin

5

여기에 데이터를 CSV로 변환하기위한 많은 롤-온-솔루션이 있지만, 거의 모든 데이터는 Excel 등을 트립하지 않고 정확하게 포맷 할 데이터 유형의 측면에서 다양한 경고가 있습니다.

입증 된 것을 사용하지 않는 이유 : Papa Parse

Papa.unparse(data[, config])

그런 다음 여기에 로컬 다운로드 솔루션 중 하나와 결합하십시오. @ArneHB의 것이 좋습니다.


4

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"/*, ...*/]]
  )
);

누군가가 이것을 필요로하는 경우 , react-csv그것을 위해가


3
react-csv라이브러리는 마법처럼 작동합니다. 모듈을 사용하는 모든 사람에게 훌륭한 솔루션입니다.
Matt Parrilla

CSV 파일 내에 쉼표가있는 필드가있는 경우에는 관찰되지 않습니다.
unpollito

2

Java GWT 애플리케이션의 클라이언트 측에서 CSV 파일을 다운로드하는 방법은 다음과 같습니다. 그의 솔루션에 대해 Xavier John에게 감사드립니다. 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);
            }
        }
    }-*/;
}

2

다음은 기본 js 솔루션입니다.

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>


나를 위해 완벽하게 일했습니다. 감사!
Srijani Ghosh

1

다음은 각도 친화적 인 버전입니다.

  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

위의 답변은 작동하지만 .xls 형식으로 여는 경우 ~ ~ ~ '\t'대신 ~로 열을 분리 ','하면 https://stackoverflow.com/a/14966131/6169225 열이 잘 작동합니다. 나를 .join('\t')대신하여 배열 대신 사용 했습니다 .join(',').


.xls 파일에서 잘 작동합니다. BTW 텍스트가 너무 길고 시트가 잘 보이지 않는 그리드의 크기를 초과 할 때 사소한 문제가 있습니다.
gabrielAnzaldo

1

이 함수를 사용하여 string[][]를 CSV 파일 로 변환 합니다. 셀에 ", a ,또는 다른 공백 이 포함되어 있으면 셀을 인용합니다 (공백 제외).

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

}

참고 : map폴리 필이 아닌 경우 Internet Explorer <11에서는 작동하지 않습니다 .

참고 : 셀에 숫자가 포함되어 있으면 숫자를 문자열로 변환 cell=''+cell하기 전에 추가 할 수 있습니다 if (cell.replace....

또는 ES6를 사용하여 한 줄로 작성할 수 있습니다.

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

1

PapaParse와 같은 라이브러리를 사용하는 것이 좋습니다 : https://github.com/mholt/PapaParse

허용 된 답변에는 현재 다음을 포함한 여러 문제가 있습니다.

  • 데이터에 쉼표가 포함되어 있으면 실패
  • 데이터에 줄 바꿈이 포함되어 있으면 실패
  • 데이터에 인용 부호가 있으면 실패 (종류)

1

간단히 시도해보십시오. 여기의 대답 중 일부는 유니 코드 데이터와 날짜와 같은 쉼표가있는 데이터를 처리하지 않습니다.

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

1

CSV 파일 다운로드

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

0

누구든지 녹아웃 js에 이것을 필요로하는 경우 기본적으로 제안 된 솔루션으로 정상적으로 작동합니다.

html :

<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

필자는 필요한 경우 필드 헤더를 포함하기 위해 Xavier Johns 함수에 추가했지만 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

이것은 JSON에서 데이터를 가져 오는 허용 된 답변을 기반으로 수정 된 답변입니다.

            JSON Data Ouptut:
             0 :{emails: "SAMPLE Co., peter@samplecompany.com"}, 1:{emails: "Another CO. , ronald@another.com"}


            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

정말 빠른 솔루션을 찾고 있다면이 작은 라이브러리에 CSV 파일을 생성하고 다운로드 할 수있는 기회를 제공 할 수 있습니다 : https://github.com/mbrn/filefy

사용법은 매우 간단합니다.

import { CsvBuilder } from 'filefy';

var csvBuilder = new CsvBuilder("user_list.csv")
  .setColumns(["name", "surname"])
  .addRow(["Eve", "Holt"])
  .addRows([
    ["Charles", "Morris"],
    ["Tracey", "Ramos"]
  ])
  .exportFile();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.