각도에서 Excel 및 CSV로 데이터 내보내기

웹 응용 프로그램을 개발할 때, 우리는 사용자가 데이터를 특정한 형식으로 다운로드할 수 있도록 허용할 것이다.그 중 하나는 데이터를 스프레드시트(excel)나 CSV 파일로 내보낼 수 있도록 하는 것이다.
이것은 매우 흔히 볼 수 있는 용례이기 때문에 나는 이 점을 쉽게 실현할 수 있는 단계별 지침을 만들고 싶다.우리는 두 주요 분야의 수출에 대해 토론할 것이다.
  • Export to Excel
  • Export to CSV
  • 📝 메모
    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의 유효한 대상 데이터를 나타낸다.
  • 자세한 내용은 xlsx 문서 및 a sample implementation on github 을 참조하십시오.

    어떻게 excel을 설계합니까?🧐

    xlsx 개원 버전에서는 스타일이 제공되지 않습니다.스타일링 및 전용 지원을 위해 xlsx 을 선택할 수 있습니다.
    또는xlsx-stylepro 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);
      }
    
    ...
    
    The code is pretty much self-explanatory 🤓 where we check if any of the column's data present in the data passed, and generates a CSV from it. We can always change the delimiter from export service to any other based on our requirement. 패키지가 필요합니다.
    응, 이거 간단하지 않아?🙌 너는 나의 file-saver을 보고 이 문장의 완전한 실현을 이해할 수 있다.
    만약 당신이 이것이 도움이 되거나 어떤 건의가 있다고 생각한다면 언제든지 평론을 발표해 주십시오.그리고 때리는 거 잊지 마세요.❤️ 또는🦄 내 댓글이 마음에 들면
    안녕히 가세요.내 다음 댓글까지.😋

    좋은 웹페이지 즐겨찾기