답변:
기본 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.open및 encodeURI함수를 사용 하여 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".
document.body.appendChild(link);FF를 완벽하게 지원 하려면 추가 해야했습니다.
data = [["Hello, world"]]. 하나를 출력해야 할 때 두 개의 열을 출력합니다.
encodeURIComponent()기능이나 다른 데이터에 대한 상한선이 있습니까? 브라우저로 Chrome을 사용하고 있습니다.
위의 답변을 기반으로 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/
window.open의 else의를 link.download !== undefined.
link.style.visibility='hidden'합니다. B / c DOM 속성은 읽기 전용입니다. 자세한 내용은 updates.html5rocks.com/2015/04/… 에서 확인할 수 있습니다. "엄격 모드에서 읽기 전용 속성에 쓰는 경우 오류가 발생합니다"
이 솔루션은 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
setTimeout.
iframe섹션은 location.href = ...로 대체 될 수 있습니다.
URL.createObjectURL끝나지 URL않습니다 Url).
나는 좀 더 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.
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();
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', '日本語'],
])
당신은 간다 :
<!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>
사람들은 특수 문자와 같은 가장자리 경우에 실패하는 자체 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- 브라우저 지원 토론에 대해서는이 주석을 참조하십시오.
아래 코드를 사용하여 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에 대한 링크입니다
//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
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();
}
여기에 두 가지 질문이 있습니다.
여기에서 첫 번째 질문에 대한 모든 답변 (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중괄호와 대괄호를 지정해야 한다고 생각합니다 .
.replacevalues()객체를 가져 와서 값의 배열을 반환하는 문자열에 의해 수행 됩니다
values()내가 코드를 시도 할 때 방법을 찾을 수 없습니다.
values()명시 적으로 호출하지 않고 작동 합니다 Object. 예제를 수정했습니다.
여기에 데이터를 CSV로 변환하기위한 많은 롤-온-솔루션이 있지만, 거의 모든 데이터는 Excel 등을 트립하지 않고 정확하게 포맷 할 데이터 유형의 측면에서 다양한 경고가 있습니다.
입증 된 것을 사용하지 않는 이유 : Papa Parse
Papa.unparse(data[, config])
그런 다음 여기에 로컬 다운로드 솔루션 중 하나와 결합하십시오. @ArneHB의 것이 좋습니다.
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라이브러리는 마법처럼 작동합니다. 모듈을 사용하는 모든 사람에게 훌륭한 솔루션입니다.
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);
}
}
}-*/;
}
다음은 기본 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>
다음은 각도 친화적 인 버전입니다.
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)}`);
}
};
위의 답변은 작동하지만 .xls 형식으로 여는 경우 ~ ~ ~ '\t'대신 ~로 열을 분리 ','하면 https://stackoverflow.com/a/14966131/6169225 열이 잘 작동합니다. 나를 .join('\t')대신하여 배열 대신 사용 했습니다 .join(',').
이 함수를 사용하여 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')
PapaParse와 같은 라이브러리를 사용하는 것이 좋습니다 : https://github.com/mholt/PapaParse
허용 된 답변에는 현재 다음을 포함한 여러 문제가 있습니다.
간단히 시도해보십시오. 여기의 대답 중 일부는 유니 코드 데이터와 날짜와 같은 쉼표가있는 데이터를 처리하지 않습니다.
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);
};
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();
누구든지 녹아웃 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);
필자는 필요한 경우 필드 헤더를 포함하기 위해 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);
}
}
}
이것은 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();
});
정말 빠른 솔루션을 찾고 있다면이 작은 라이브러리에 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();
window.open. 그러나download원하는 파일 이름 으로 속성이 설정된 숨겨진 링크를 만들 수 있습니다 . 그런 다음이 링크를 "클릭"하면 원하는 이름으로 파일이 다운로드되고 내 답변에 추가합니다.