답변:
기본 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
중괄호와 대괄호를 지정해야 한다고 생각합니다 .
.replace
values()
객체를 가져 와서 값의 배열을 반환하는 문자열에 의해 수행 됩니다
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
원하는 파일 이름 으로 속성이 설정된 숨겨진 링크를 만들 수 있습니다 . 그런 다음이 링크를 "클릭"하면 원하는 이름으로 파일이 다운로드되고 내 답변에 추가합니다.