我查看了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添加到您的工具箱中。 –