You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Fetch API数据拉取与XLSX文件生成实现Mat进度条?

替换Mat Spinner为进度条实现任务进度跟踪

问题描述

当前使用mat-spinner展示导出Excel的加载状态,希望替换为<mat-progress-bar mode="determinate"></mat-progress-bar>,同时大致跟踪数据库数据拉取和XLSX文件生成两个阶段的进度,无需精确数值,进度突变也可接受。

可行性说明

完全可行。我们可以将整个导出流程划分为几个关键阶段,为每个阶段分配对应的进度值,通过阶段式更新进度条数值来实现大致的进度展示。

代码修改方案

1. 组件文件(report.ts)

新增进度值变量,在流程关键节点更新进度:

export class ReportComponent {
  // 进度值变量,初始为0
  progressValue = 0;
  // 标记是否正在导出,替换原downloadSpinner
  downloadInProgress = false;

  export_to_excel() {
    this.downloadInProgress = true;
    this.progressValue = 20; // 标记:开始请求数据

    this.reportService.getResponseCodeReportData()
      .subscribe({
        next: data => {
          this.progressValue = 60; // 标记:数据拉取完成,开始生成Excel
          if (data.length !== 0) {
            const XlsMasterData = data;
            const workSheet = XLSX.utils.json_to_sheet(XlsMasterData);
            const workBook: XLSX.WorkBook = XLSX.utils.book_new();
            XLSX.utils.book_append_sheet(workBook, workSheet, 'SheetName');
            XLSX.writeFile(workBook, 'response_code.xlsx');
            this.progressValue = 100; // 标记:Excel生成并下载完成
          } else {
            this.showSwalmessage("No record Found!", "", "warning", true);
            this.progressValue = 0; // 无数据,重置进度
          }
        },
        error: (error: any) => {
          this.showSwalmessage("Something Went wrong", error, "warning", true);
          this.progressValue = 0; // 出错,重置进度
        },
        complete: () => {
          // 延迟重置,让用户看到100%的完成状态
          setTimeout(() => {
            this.downloadInProgress = false;
            this.progressValue = 0;
          }, 500);
        }
      });
  }
}

2. 模板文件(report.html)

替换mat-spinner为mat-progress-bar,调整布局展示进度:

<div class="body" style="text-align: center;">
    <div class="button-demo">
        <!-- 进度条:仅在导出中显示 -->
        <mat-progress-bar 
          mode="determinate" 
          [value]="progressValue"
          *ngIf="downloadInProgress"
          style="width: 120px; margin-bottom: 8px;"
        ></mat-progress-bar>
        
        <button 
          class="btn btn-primary btn-border-radius waves-effect" 
          tabindex="0" 
          aria-controls="example1" 
          type="button" 
          (click)="export_to_excel()" 
          mat-raised-button 
          color="primary" 
          style="width: 120px;"
          [disabled]="downloadInProgress"
        >
            <div style="display: flex; align-items: center; justify-content: center;">
                <div style="min-width: 80px;">
                    {{ downloadInProgress ? 'Processing' : 'Download' }}
                </div>
            </div>
        </button>
    </div>
</div>

3. 服务文件(service.ts)

无需修改,当前阶段式更新已满足需求;若后续需要更精确的HTTP请求进度,可开启reportProgress选项:

getResponseCodeReportData(){
  return this.http.get<any[]>(`${environment.apiUrl}/responsecode-report/`);
}

补充说明

  • 进度值为大致估算:20%(开始请求)→60%(数据拉取完成)→100%(Excel生成完成),可根据实际业务耗时调整比例
  • 延迟重置进度是为了让用户直观看到任务完成的状态,提升体验
  • 按钮添加disabled属性,避免重复触发导出操作

内容的提问来源于stack exchange,提问作者Purushottam Nawale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 16:30:09