角度 5:如何将数据导出到 csv 文件

Posted

技术标签:

【中文标题】角度 5:如何将数据导出到 csv 文件【英文标题】:ANGULAR 5 : how to export data to csv file 【发布时间】:2018-12-31 10:20:22 【问题描述】:

我是 Angular 的初学者,我正在开发 Angular 5,Node v8.11.3。

我想实现一个接受参数数据和标题的通用函数。并作为输出一个 csv 文件。

我创建了一个名为“FactureComponent”的组件,然后我生成了一个服务 称为“ DataService ”,然后我创建了一个 getFactures 函数,该函数从模拟中检索我的项目列表,并且效果很好。

import  Component, OnInit  from '@angular/core';
import  DataService  from '../data.service';
import  FACTURES  from '../mock.factures';

@Component(
selector: 'app-facture',
templateUrl: './facture.component.html',
styleUrls: ['./facture.component.scss']
)
export class FactureComponent implements OnInit 

factures = [];
columns  = ["Id","Reference","Quantite","Prix Unitaire"];
btnText:  String = "Export CSV";

constructor(private _data: DataService)  

ngOnInit() 
this.getFactures();

getFactures()
this.factures=this._data.getFactures();

generateCSV()
console.log("generate");


您会在视图下方找到

<form>
<input type="submit" [value]="btnText" (click)="generateCSV()"/>
</form>

<table>
 <tr>
   <th *ngFor="let col of columns">
      col
   </th>
 </tr>
 <tr *ngFor="let facture of factures">
  <td>facture.id</td>     
  <td>facture.ref</td>
  <td>facture.quantite</td>
  <td>facture.prixUnitaire</td>
 </tr>
</table>

所以我想实现一个功能,将视图上显示的数据转换为 csv 文件。

【问题讨论】:

这就是你在 javascript 中的做法,通过一些修改应该很容易让它在 TypeScript 中工作***.com/questions/8847766/… 唯一可能不同的部分是 fs.WriteFile @BradenBrown 感谢您的回复。我们不能不使用 javascript 来做到这一点? 您只想下载 csv 文件吗?还是保存到本地文件? @BradenBrown 只需下载 csv 【参考方案1】:

我的解决方案目前正在为储蓄提供服务(我从Changhui Xu @ codeburst 得到这个)。无需为此安装任何软件包...

import  Injectable  from '@angular/core';

declare global 
    interface Navigator 
        msSaveBlob?: (blob: any, defaultName?: string) => boolean
    


@Injectable(
    providedIn: 'root',
)
export class CsvDataService 
    exportToCsv(filename: string, rows: object[]) 
      if (!rows || !rows.length) 
        return;
      
      const separator = ',';
      const keys = Object.keys(rows[0]);
      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');
  
      const blob = new Blob([csvContent],  type: 'text/csv;charset=utf-8;' );
      if (navigator.msSaveBlob)  // IE 10+
        navigator.msSaveBlob(blob, filename);
       else 
        const link = document.createElement('a');
        if (link.download !== undefined) 
          // Browsers that support HTML5 download attribute
          const url = URL.createObjectURL(blob);
          link.setAttribute('href', url);
          link.setAttribute('download', filename);
          link.style.visibility = 'hidden';
          document.body.appendChild(link);
          link.click();
          document.body.removeChild(link);
        
      
    
  

然后我将这个服务注入到我的组件中。然后它调用这个服务:


  constructor(private csvService :CsvDataService) 

  saveAsCSV() 
    if(this.reportLines.filteredData.length > 0)
      const items: CsvData[] = [];

      this.reportLines.filteredData.forEach(line => 
        let reportDate = new Date(report.date);
        let csvLine: CsvData = 
          date: `$reportDate.getDate()/$reportDate.getMonth()+1/$reportDate.getFullYear()`,
          laborerName: line.laborerName,
          machineNumber: line.machineNumber,
          machineName: line.machineName,
          workingHours: line.hours,
          description: line.description
        
        items.push(csvLine); 
      );

      this.csvService.exportToCsv('myCsvDocumentName.csv', items);
    
    
  

【讨论】:

此解决方案在字符串的开头和结尾添加额外的引号 请注意,自 2022 年起,msSaveBlob 不再作为导航器的一部分提供:***.com/questions/69485778/… @glenatron 我已更新答案以包含您的答案提供的全局声明【参考方案2】:

更新: 这是更好的方法:

    在您的项目目录中打开命令提示符。 通过键入npm install --save file-saver 安装文件保护程序 import saveAs from 'file-saver'; 到您的 .ts 文件中。 这是基于新导入的更新代码。
downloadFile(data: any) 
    const replacer = (key, value) => value === null ? '' : value; // specify how you want to handle null values here
    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('\r\n');

    var blob = new Blob([csvArray], type: 'text/csv' )
    saveAs(blob, "myFile.csv");

感谢answer 将对象转换为 CSV。

使用方法如下:

downloadFile(data: any) 
  const replacer = (key, value) => (value === null ? '' : value); // specify how you want to handle null values here
  const header = Object.keys(data[0]);
  const csv = data.map((row) =>
    header
      .map((fieldName) => JSON.stringify(row[fieldName], replacer))
      .join(',')
  );
  csv.unshift(header.join(','));
  const csvArray = csv.join('\r\n');

  const a = document.createElement('a');
  const blob = new Blob([csvArray],  type: 'text/csv' );
  const url = window.URL.createObjectURL(blob);

  a.href = url;
  a.download = 'myFile.csv';
  a.click();
  window.URL.revokeObjectURL(url);
  a.remove();

如果我找到更好的方法,我会在以后添加。

【讨论】:

对于 *.ts 文件,添加 npm install @types/file-saver --save-dev npm install @types/file-saver --save-dev Ref URL -- 此外,可以通过以下方式安装 TypeScript 定义npm install @types/file-saver --save-dev 导入方式已更改 - import saveAs from 'file-saver'; 我运行了 npm install @types/file-saver --save-dev,从 'file-saver' 导入 saveAs ;但它仍然显示“找不到 moduke 文件保护程序”

以上是关于角度 5:如何将数据导出到 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从Python导出到.csv文件?

如何将 Django 模型数据导出到 CSV 文件中

如何将数据框导出到数据湖中的 CSV 文件? [复制]

如何将具有值的行/列添加到数据表 csv 导出

如何将数据从 Oracle 数据库导出到 csv 文件?

如何将表数据从 PostgreSQL (pgAdmin) 导出到 CSV 文件?