How to Export JSON to CSV or Excel - Angular 2
说我的json是这样的:
1 2 3 4 5 | var readyToExport = [ {id: 1, name: 'a'}, {id: 2, name: 'b'}, {id: 3, name: 'c'} ]; |
如何在Angular2中将此JSON导出为CSV或Excel文件?
我使用的浏览器是Chrome。
也许Angular2不相关,但是,可以将任何第三方插件注入Angular2并执行此任务吗?
我使用以下两个库实现了excel导出:文件服务器和xlsx。
您可以使用以下方法将其添加到现有项目中:
1 2 | npm install file-saver --save npm install xlsx --save |
ExcelService示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import { Injectable } from '@angular/core'; import * as FileSaver from 'file-saver'; import * as XLSX from 'xlsx'; const EXCEL_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8'; const EXCEL_EXTENSION = '.xlsx'; @Injectable() export class ExcelService { constructor() { } public exportAsExcelFile(json: any[], excelFileName: string): void { const worksheet: XLSX.WorkSheet = XLSX.utils.json_to_sheet(json); const workbook: XLSX.WorkBook = { Sheets: { 'data': worksheet }, SheetNames: ['data'] }; const excelBuffer: any = XLSX.write(workbook, { bookType: 'xlsx', type: 'buffer' }); this.saveAsExcelFile(excelBuffer, excelFileName); } private saveAsExcelFile(buffer: any, fileName: string): void { const data: Blob = new Blob([buffer], { type: EXCEL_TYPE }); FileSaver.saveAs(data, fileName + '_export_' + new Date().getTime() + EXCEL_EXTENSION); } } |
您可以在我的github上找到工作示例:https://github.com/luwojtaszek/ngx-excel-export
[单元格样式]
如果要设置单元格的样式(例如,添加文本换行,使单元格内容居中等),则可以使用xlsx和xlsx样式库来执行此操作。
1)添加必需的依赖项
1 2 3 | npm install file-saver --save npm install xlsx --save npm install xlsx-style --save |
2)替换xlsx样式dist目录中的cpexcel.js文件。
由于存在以下错误:https://github.com/protobi/js-xlsx/issues/78,因此需要将node_modules目录中的
3)实施ExcelService
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | import { Injectable } from '@angular/core'; import * as FileSaver from 'file-saver'; import * as XLSX from 'xlsx'; import * as XLSXStyle from 'xlsx-style'; const EXCEL_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8'; const EXCEL_EXTENSION = '.xlsx'; @Injectable() export class ExcelService { constructor() { } public exportAsExcelFile(json: any[], excelFileName: string): void { const worksheet: XLSX.WorkSheet = XLSX.utils.json_to_sheet(json); this.wrapAndCenterCell(worksheet.B2); const workbook: XLSX.WorkBook = { Sheets: { 'data': worksheet }, SheetNames: ['data'] }; // Use XLSXStyle instead of XLSX write function which property writes cell styles. const excelBuffer: any = XLSXStyle.write(workbook, { bookType: 'xlsx', type: 'buffer' }); this.saveAsExcelFile(excelBuffer, excelFileName); } private wrapAndCenterCell(cell: XLSX.CellObject) { const wrapAndCenterCellStyle = { alignment: { wrapText: true, vertical: 'center', horizontal: 'center' } }; this.setCellStyle(cell, wrapAndCenterCellStyle); } private setCellStyle(cell: XLSX.CellObject, style: {}) { cell.s = style; } private saveAsExcelFile(buffer: any, fileName: string): void { const data: Blob = new Blob([buffer], { type: EXCEL_TYPE }); FileSaver.saveAs(data, fileName + '_export_' + new Date().getTime() + EXCEL_EXTENSION); } } |
工作示例:https://github.com/luwojtaszek/ngx-excel-export/tree/xlsx-style
[更新-2018年8月23日]
最新的Angular 6可以很好地工作。
1 | yarn install xlsx --save |
ExcelService示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import {Injectable} from '@angular/core'; import * as XLSX from 'xlsx'; @Injectable() export class ExcelService { constructor() { } static toExportFileName(excelFileName: string): string { return `${excelFileName}_export_${new Date().getTime()}.xlsx`; } public exportAsExcelFile(json: any[], excelFileName: string): void { const worksheet: XLSX.WorkSheet = XLSX.utils.json_to_sheet(json); const workbook: XLSX.WorkBook = {Sheets: {'data': worksheet}, SheetNames: ['data']}; XLSX.writeFile(workbook, ExcelService.toExportFileName(excelFileName)); } } |
我更新了我的仓库:https://github.com/luwojtaszek/ngx-excel-export
您可以将XLSX库用于Angular2 +。
遵循那里提供的指南:
1 2 3 4 5 6 7 8 9 10 11 12 13 | public export() { const readyToExport = [ {id: 1, name: 'a'}, {id: 2, name: 'b'}, {id: 3, name: 'c'} ]; const workBook = XLSX.utils.book_new(); // create a new blank book const workSheet = XLSX.utils.json_to_sheet(readyToExport); XLSX.utils.book_append_sheet(workBook, workSheet, 'data'); // add the worksheet to the book XLSX.writeFile(workBook, 'temp.xlsx'); // initiate a file download in browser } |
经Angular 5.2.0和XLSX 0.13.1测试
尽管使用Angular确实可以打开更多的库,但事实并非如此重要。
您基本上有两个选择。
另外,这个SO问题可能回答了您的问题:如何将JSON转换为CSV格式并存储在变量中
CSV是类似Excel的程序的基本格式。除非确实需要,否则不要弄乱xls(x)。它将使您的大脑受伤。
我认为这是正确的方式……为我工作!
带了一个json数组
1 2 3 4 5 6 7 8 9 10 11 | downloadFile(data: any, filename:string) { const replacer = (key, value) => value === null ? '' : value; const header = Object.keys(data[0]); let csv = data.map(row => header.map(fieldName => JSON.stringify(row[fieldName],replacer)).join(',')); csv.unshift(header.join(',')); let csvArray = csv.join(' '); var blob = new Blob([csvArray], {type: 'text/csv' }) saveAs(blob, filename +".csv"); } |
使用XLSX库将JSON转换为XLS文件并下载
工作演示
源链接
方法
包括图书馆
1 | <script type="text/javascript" src="//unpkg.com/xlsx/dist/xlsx.full.min.js"> |
JavaScript代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | var createXLSLFormatObj = []; /* XLS Head Columns */ var xlsHeader = ["EmployeeID","Full Name"]; /* XLS Rows Data */ var xlsRows = [{ "EmployeeID":"EMP001", "FullName":"Jolly" }, { "EmployeeID":"EMP002", "FullName":"Macias" }, { "EmployeeID":"EMP003", "FullName":"Lucian" }, { "EmployeeID":"EMP004", "FullName":"Blaze" }, { "EmployeeID":"EMP005", "FullName":"Blossom" }, { "EmployeeID":"EMP006", "FullName":"Kerry" }, { "EmployeeID":"EMP007", "FullName":"Adele" }, { "EmployeeID":"EMP008", "FullName":"Freaky" }, { "EmployeeID":"EMP009", "FullName":"Brooke" }, { "EmployeeID":"EMP010", "FullName":"FreakyJolly.Com" } ]; createXLSLFormatObj.push(xlsHeader); $.each(xlsRows, function(index, value) { var innerRowData = []; $("tbody").append('<tr><td>' + value.EmployeeID + '</td><td>' + value.FullName + '</td></tr>'); $.each(value, function(ind, val) { innerRowData.push(val); }); createXLSLFormatObj.push(innerRowData); }); /* File Name */ var filename ="FreakyJSON_To_XLS.xlsx"; /* Sheet Name */ var ws_name ="FreakySheet"; if (typeof console !== 'undefined') console.log(new Date()); var wb = XLSX.utils.book_new(), ws = XLSX.utils.aoa_to_sheet(createXLSLFormatObj); /* Add worksheet to workbook */ XLSX.utils.book_append_sheet(wb, ws, ws_name); /* Write workbook and Download */ if (typeof console !== 'undefined') console.log(new Date()); XLSX.writeFile(wb, filename); if (typeof console !== 'undefined') console.log(new Date()); |
您可以引用此代码在ANgular 2组件中使用
您可以使用基于angular2的primeng将JSON导出为CSV格式,除了CSV格式外,Optoin availabel太多,无法应用于JSON,
用于将JSON转换为CSV格式,请参见此处
- http://www.primefaces.org/primeng/#/datatableexport
更新的链接
https://www.primefaces.org/primeng/#/datatable/export
我为此使用了angular2-csv库:https://www.npmjs.com/package/angular2-csv
除了一个例外,这对我来说非常有效。存在一个已知问题(https://github.com/javiertelioz/angular2-csv/issues/10),BOM字符插入了文件的开头,这会导致我的Excel版本显示垃圾字符。