我查看了PrimeNG DataTable的源代码,我想你可以使用exportCSV
代码导出csv的数据。
“诀窍”是生成一个以data:text/csv;charset=utf-8
开头的字符串,并由用户下载。
像下面的代码应该为你工作(也许你需要修改它,所以它适合你的数据)。
大多数代码是从PrimeNG复制的,除了下载方法。该方法从SO answer复制而来。
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'app works!';
csvSeparator = ';';
value = [
{ name: 'A3', year: 2013, brand: 'Audi' },
{ name: 'Z3', year: 2015, brand: 'BMW' }
];
columns = [
{ field: 'name', header: 'Name' },
{ field: 'year', header: 'Production data' },
{ field: 'brand', header: 'Brand' },
];
constructor() {
console.log(this.value);
this.exportCSV('cars.csv'); // just for show casing --> later triggered by a click on a button
}
download(text, filename) {
let element = document.createElement('a');
element.setAttribute('href', 'data:text/csv;charset=utf-8,' + encodeURIComponent(text));
element.setAttribute('download', filename);
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
}
exportCSV(filename) {
let data = this.value, csv = '';
// csv = "data:text/csv;charset=utf-8,";
//headers
for (let i = 0; i < this.columns.length; i++) {
if (this.columns[i].field) {
csv += this.columns[i].field;
if (i < (this.columns.length - 1)) {
csv += this.csvSeparator;
}
}
}
//body
this.value.forEach((record, j) => {
csv += '\n';
for (let i = 0; i < this.columns.length; i++) {
if (this.columns[i].field) {
console.log(record[this.columns[i].field]);
// resolveFieldData seems to check if field is nested e.g. data.something --> probably not needed
csv += record[this.columns[i].field]; //this.resolveFieldData(record, this.columns[i].field);
if (i < (this.columns.length - 1)) {
csv += this.csvSeparator;
}
}
}
});
// console.log(csv);
// window.open(encodeURI(csv)); // doesn't display a filename!
this.download(csv, filename);
}
// resolveFieldData(data: any, field: string): any {
// if(data && field) {
// if(field.indexOf('.') == -1) {
// return data[field];
// }
// else {
// let fields: string[] = field.split('.');
// let value = data;
// for(var i = 0, len = fields.length; i < len; ++i) {
// value = value[fields[i]];
// }
// return value;
// }
// }
// else {
// return null;
// }
// }
}
你有数据客户端,那么我认为最好的是使用JavaScript来创建一个CSV文件。例如[PrimeNG](http://www.primefaces.org/primeng/#/datatable/export)可以导出csv文件。 (服务器端也是可能的。) – AWolf
我看着PrimeNG数据表导出,但我不确定是否有办法在不显示数据表本身的情况下触发导出。该表是数据量非常大,并在页面上显示它似乎不合理。这就是为什么我想将其导出而不显示在页面上的原因。有任何想法吗? @AWolf – dev53
Powershell有一个名为Export-csv的cmdlet,它非常易于使用,前提是您的数据组织良好。不知道是否要将PowerShell添加到您的工具箱中。 –