각도에서 Excel 및 CSV로 데이터 내보내기
36337 단어 angularwebdevbeginnersjavascript
이것은 매우 흔히 볼 수 있는 용례이기 때문에 나는 이 점을 쉽게 실현할 수 있는 단계별 지침을 만들고 싶다.우리는 두 주요 분야의 수출에 대해 토론할 것이다.
GitHub에 이 구현에 대한 저장소를 만들었습니다.
이드리스 란프라바라 / ng 데이터 내보내기
excel, csv로 데이터를 내보내는 내보내기 서비스
Excel로 내보내기
The ability to export the data to excel not only gives a powerful feature for the users but also the ability to create an array of other related features to help our users better understand the data. So how do we start? Well, as you'd expect, we have an npm package to deal with it - xlsx (also known as sheetjs) 😁종속 항목 설치
# installing xlsx package
$ npm install xlsx
# installing file-saver - a solution to saving files on the client-side
$ npm install file-saver
내보내기 서비스 만들기
Angular에서 흔히 볼 수 있는 기능을 만드는 방법 중 하나는 서비스를 만드는 것입니다.따라서 모든 유형의 정보를 내보내는 기능이 있는 내보내기 서비스를 만들었습니다(이 게시물의 excel과 CSV).
xlsx 사용
xlsx
스프레드시트를 작성하거나 분석할 수 있는 다양한 유틸리티를 제공합니다.간단하게 보기 위해서, 우리는 이곳에서 몇 가지 실용 프로그램을 집중적으로 토론할 것이다.일.️⃣ HTML 테이블 내보내기
만약 우리가
HTML table
을 excel로 내보내고 싶다면, 이것은 매우 쉽다. 왜냐하면 xlsx
실용 프로그램을 제공했기 때문이다.우리가 책상이 있는지 없는지 생각해 보자👇<!-- app.component.html -->
<table class="table table-sm" #userTable> <!-- we will make use of this angular var as element reference -->
<thead class="thead-dark">
<tr>
<th scope="col">#</th>
...
</tr>
</thead>
<tbody>
<tr *ngFor="let user of users">
<td scope="row">{{ user.id }}</td>
...
</tr>
<tr>
</tbody>
</table>
현재, 우리는 service
함수를 만들어서 HTML element reference
을 가져오고, 그 중에서 excel (사용 <thead>
과 <tbody>
을 생성할 수 있습니다./* export.service.ts */
import { Injectable, ElementRef } from '@angular/core';
import * as FileSaver from 'file-saver';
import * as XLSX from 'xlsx';
const EXCEL_EXTENSION = '.xlsx';
@Injectable()
export class ExportService {
constructor() { }
/**
* Creates excel from the table element reference.
*
* @param element DOM table element reference.
* @param fileName filename to save as.
*/
public exportTableElmToExcel(element: ElementRef, fileName: string): void {
const ws: XLSX.WorkSheet = XLSX.utils.table_to_sheet(element.nativeElement);
// generate workbook and add the worksheet
const workbook: XLSX.WorkBook = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(workbook, ws, 'Sheet1');
// save to file
XLSX.writeFile(workbook, `${fileName}${EXCEL_EXTENSION}`);
}
...
}
component.ts
에서, 우리는 단지 export button
파일을 클라이언트 컴퓨터의 excel로 저장하기 위한 프로세서를 만들 뿐입니다./* app.component.ts */
import { Component, OnInit, ViewChild, ElementRef } from '@angular/core';
import { ExcelJson } from './interfaces/excel-json.interface';
import { ExportService } from './services/export.service';
...
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
...
/* the table reference */
@ViewChild('userTable') userTable: ElementRef;
...
constructor(
private exportService: ExportService
) { }
ngOnInit(): void {
...
}
/**
* Function prepares data to pass to export service to create excel from Table DOM reference
*
*/
exportElmToExcel(): void {
this.exportService.exportTableElmToExcel(this.userTable, 'user_data');
}
...
}
이것은 매우 쉽지 않습니까?😆 만약 우리가 더 복잡한 데이터를 내보내고 싶다면?🙄 어디 보자👇이.️⃣ 더 복잡한 데이터 내보내기
xlsx
는 excel의 데이터를 사용자 정의할 수 있는 다양한 유틸리티를 제공합니다(excel 열 이름 표지 사용A, B, C..
.예를 들어, 나는 모든 대시보드 데이터를 excel로 내보내는 함수를 내 프로젝트에 만들었다.service
에서 함수를 만듭니다./* export.service.ts */
...
/**
* Creates XLSX option from the Json data. Use this to customize the sheet by adding arbitrary rows and columns.
*
* @param json Json data to create xlsx.
* @param fileName filename to save as.
*/
public exportJsonToExcel(json: ExcelJson[], fileName: string): void {
// inserting first blank row
const worksheet: XLSX.WorkSheet = XLSX.utils.json_to_sheet(
json[0].data,
this.getOptions(json[0])
);
for (let i = 1, length = json.length; i < length; i++) {
// adding a dummy row for separation
XLSX.utils.sheet_add_json(
worksheet,
[{}],
this.getOptions(
{
data: [],
skipHeader: true
}, -1)
);
XLSX.utils.sheet_add_json(
worksheet,
json[i].data,
this.getOptions(json[i], -1)
);
}
const workbook: XLSX.WorkBook = { Sheets: { Sheet1: worksheet }, SheetNames: ['Sheet1'] };
// save to file
XLSX.writeFile(workbook, `${fileName}${EXCEL_EXTENSION}`);
}
/**
* Creates the XLSX option from the data.
*
* @param json Json data to create xlsx.
* @param origin XLSX option origin.
* @returns options XLSX options.
*/
private getOptions(json: ExcelJson, origin?: number): any {
// adding actual data
const options = {
skipHeader: true,
origin: -1,
header: []
};
options.skipHeader = json.skipHeader ? json.skipHeader : false;
if (!options.skipHeader && json.header && json.header.length) {
options.header = json.header;
}
if (origin) {
options.origin = origin ? origin : -1;
}
return options;
}
...
component.ts
에서 이 서비스 함수를 전달하기 위해 xlsx
필요한 형식으로 데이터를 만듭니다./* app.component.ts */
...
/**
* Function prepares data to pass to export service to create excel from Json
*
*/
exportToExcel(): void {
const edata: Array<ExcelJson> = [];
const udt: ExcelJson = {
data: [
{ A: 'User Data' }, // title
{ A: '#', B: 'First Name', C: 'Last Name', D: 'Handle' }, // table header
],
skipHeader: true
};
this.users.forEach(user => {
udt.data.push({
A: user.id,
B: user.firstName,
C: user.lastName,
D: user.handle
});
});
edata.push(udt);
// adding more data just to show "how we can keep on adding more data"
const bd = {
data: [
// chart title
{ A: 'Some more data', B: '' },
{ A: '#', B: 'First Name', C: 'Last Name', D: 'Handle' }, // table header
],
skipHeader: true
};
this.users.forEach(user => {
bd.data.push({
A: String(user.id),
B: user.firstName,
C: user.lastName,
D: user.handle
});
});
edata.push(bd);
this.exportService.exportJsonToExcel(edata, 'user_data_customized');
}
...
설명하다
곤혹스러웠어😕 내가 우리가 방금 거기에서 무엇을 했는지 설명해 줄게.
xlsx
(또는 스프레드시트) 에는 workbook
(실제 파일) 이 있으며, 여기에는 여러 개 sheets
를 추가할 수 있습니다.xlsx
는 대상 그룹을 excel 데이터로 변환하고 추가 xlsx 옵션을 가진 실용 함수sheet_add_json()
를 제공합니다.따라서 우리는 단지 그 주위에 포장기 service
를 만들었을 뿐, 이를 통해 서로 다른 xlsx 옵션을 가진 여러 대상을 전달할 수 있다.이런 방식을 통해 우리의 내보내기 서비스는 복잡성을 처리할 수 있으며, 우리는 대상 그룹을 만들어서 그것을 전달하기만 하면 된다.xlsx
기대 대상 수조의 형식은 {cell: value }
이기 때문에 {A: 'value'}
excel의 단원격(열)value
에 넣고 싶다는 것을 의미한다.A
함수skipHeader
에 전달된 대상에서 자동으로 생성된 제목을 건너뛰기sheet_add_json()
은(는) 첫 번째 열origin: -1
사용자 정의 인터페이스 (내가 만든) 로 서비스 함수가 원하는 데이터 형식을 정의하는 데 사용됩니다.이것은 ExcelJson
의 유효한 대상 데이터를 나타낸다.어떻게 excel을 설계합니까?🧐
xlsx
개원 버전에서는 스타일이 제공되지 않습니다.스타일링 및 전용 지원을 위해 xlsx
을 선택할 수 있습니다.또는xlsx-style은
pro version
의 포크로 그 위에 조형을 제공한다.xlsx
의 또 다른 유행하는 대체품은 ExcelJS이다.그것도 조형을 포함하지만 xlsx
에 비해 실용성이 적다.클라이언트 기기에 파일을 저장하려면
CSV로 내보내기
Now let's move on to the second part of export i.e. CSV.
Don't worry 😟 it's pretty easy. We just need to add a function to our xlsx
which accepts an array of objects along with a column header to create a CSV for it.
/* export.service.ts */
...
/**
* Saves the file on the client's machine via FileSaver library.
*
* @param buffer The data that need to be saved.
* @param fileName File name to save as.
* @param fileType File type to save as.
*/
private saveAsFile(buffer: any, fileName: string, fileType: string): void {
const data: Blob = new Blob([buffer], { type: fileType });
FileSaver.saveAs(data, fileName);
}
/**
* Creates an array of data to CSV. It will automatically generate a title row based on object keys.
*
* @param rows array of data to be converted to CSV.
* @param fileName filename to save as.
* @param columns array of object properties to convert to CSV. If skipped, then all object properties will be used for CSV.
*/
public exportToCsv(rows: object[], fileName: string, columns?: string[]): string {
if (!rows || !rows.length) {
return;
}
const separator = ',';
const keys = Object.keys(rows[0]).filter(k => {
if (columns?.length) {
return columns.includes(k);
} else {
return true;
}
});
const csvContent =
keys.join(separator) +
'\n' +
rows.map(row => {
return keys.map(k => {
let cell = row[k] === null || row[k] === undefined ? '' : row[k];
cell = cell instanceof Date
? cell.toLocaleString()
: cell.toString().replace(/"/g, '""');
if (cell.search(/("|,|\n)/g) >= 0) {
cell = `"${cell}"`;
}
return cell;
}).join(separator);
}).join('\n');
this.saveAsFile(csvContent, `${fileName}${CSV_EXTENSION}`, CSV_TYPE);
}
...
export service
to any other based on our requirement. 패키지가 필요합니다.응, 이거 간단하지 않아?🙌 너는 나의 file-saver을 보고 이 문장의 완전한 실현을 이해할 수 있다.
만약 당신이 이것이 도움이 되거나 어떤 건의가 있다고 생각한다면 언제든지 평론을 발표해 주십시오.그리고 때리는 거 잊지 마세요.❤️ 또는🦄 내 댓글이 마음에 들면
안녕히 가세요.내 다음 댓글까지.😋
Reference
이 문제에 관하여(각도에서 Excel 및 CSV로 데이터 내보내기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/idrisrampurawala/exporting-data-to-excel-and-csv-in-angular-3643텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)