1

我有一个 Angular 材料项目,我正在尝试使用该模块将数据从表中导出到xlsx文件中。MatTableExporter

我有列IDNameactions(编辑和删除),但它只显示列 ID 和操作,名称列显示为空。

我的问题:因为名称列显示为空,我怎样才能显示数据?如何从xlsx文件中删除操作列?

这是我的component.html

<div class="title">Customers</div>
<mat-divider></mat-divider>

<div fxLayout="column" fxLayoutGap="10px" class="m-3">
  <mat-card class="mat-elevation-z8">
  
    <div>
      <button mat-raised-button
        (click)="exporter.exportTable('xlsx')">Export excel
      </button>
    </div>
    
    <mat-table matTableExporter [dataSource]="clients" #exporter="matTableExporter">
    
      <ng-container matColumnDef="id">
        <mat-header-cell *matHeaderCellDef>ID</mat-header-cell>
        <mat-cell *matCellDef="let clients"> {{clients.id}} </mat-cell>
      </ng-container>

      <ng-container matColumnDef="name">
        <mat-header-cell *matHeaderCellDef>Name</mat-header-cell>
        <mat-cell *matCellDef="let clients; let i = index">
          <mat-form-field floatLabel="never" [appearance]="editIndex != i ? 'none' : 'legacy'">
            <input matInput placeholder="{{clients.name}}" [(ngModel)]="clients.name" [readonly]="editIndex!=i">
          </mat-form-field>
        </mat-cell>
      </ng-container>
      </ng-container>
      
      <ng-container matColumnDef="act">
        <mat-header-cell *matHeaderCellDef> Actions </mat-header-cell>
        <mat-cell *matCellDef="let element
          <button mat-icon-button matTooltip="Edit" (click)="edit(element)">
            <mat-icon class="icon_edit_button">edit</mat-icon>
          </button>
          <button *ngIf="editIndex != i" mat-icon-button matTooltip="Delete" (click)="delete(element)">
            <mat-icon>delete_forever</mat-icon>
          </button>
        </mat-cell>
      </ng-container>

      <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
      <mat-row *matRowDef="let col; columns: displayedColumns;"></mat-row>

    </mat-table>
    <mat-paginator [pageSizeOptions]="[5, 10, 20]" showFirstLastButtons></mat-paginator>
  </mat-card>
</div>

这是我的xlsx文件:

在此处输入图像描述

4

2 回答 2

2

要从 XLS 中删除操作列,您可以将其添加为mat-table标签中的隐藏列。在这里,您传入要从 XLS 中省略的列索引数组:

<mat-table ... [hiddenColumns]="[2]">

要在 XLS 中呈现名称,您可以添加以下行:

<span class="cdk-visually-hidden">{{clients.name}}</span>

所以你的第二列变成:

<mat-cell *matCellDef="let clients; let i = index">
  <span class="cdk-visually-hidden">{{clients.name}}</span>
  <mat-form-field floatLabel="never" [appearance]="editIndex != i ? 'none' : 'legacy'">
    <input matInput placeholder="{{clients.name}}" [(ngModel)]="clients.name" [readonly]="editIndex!=i">
  </mat-form-field>
</mat-cell>

这会添加一个包含名称的隐藏字段。因为您使用[(ngModel)]的是 2 路绑定,并且用户对字段中的名称所做的任何更改input都将反映在隐藏字段中,因此在您导出它时会反映在 XLS 中。

这是一个 StackBlitz展示了这个工作。只需更改一个(或多个)名称字段并点击“导出 excel”按钮,您应该会得到:

在此处输入图像描述

于 2021-06-22T13:54:00.767 回答
0

我有一个不同的用户案例。我必须在 Mat Table 中显示一组表单元素,并且用户可以编辑并将所有这些元素作为数组提交。

在单击按钮或用户操作时,我得到了FormGrop元素数组并刚刚转换为我的域对象数组。

this.address.inputRecords=> My domain object  typescript []

let json = JSON.stringify(this.address.inputRecords);

const worksheet: XLSX.WorkSheet = XLSX.utils.json_to_sheet(
  JSON.parse(json)
);
const wb: XLSX.WorkBook = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, worksheet, 'Sheet1');
于 2021-09-22T19:09:20.630 回答