You need to enable JavaScript to run this app. Angular TypeScript 实现按指定日期区间导出数据为CSV
优惠活动
大模型
产品
解决方案
定价
更多

Angular TypeScript 实现按指定日期区间导出数据为CSV

Angular 11 + Material 日期区间CSV导出实现步骤

前置准备

你已经跑通无参数的全量导出逻辑、接好了Material DatePicker组件可以拿到用户选定的起止日期,整个改造只需要3个核心环节,不需要改动已有的CSV生成逻辑。

1. 组件内绑定DatePicker的取值并做基础校验

首先在组件类中定义两个属性,双向绑定DatePicker的选中值:

// 组件类属性定义
selectedStartDate: Date;
selectedEndDate: Date;

在模板的DatePicker输入框上通过[(ngModel)]把值绑定到上面两个属性即可。
在downloadCSVByDate方法的最开头加拦截校验,避免发无效请求:

downloadCSVByDate() {
  // 校验是否选全日期
  if (!this.selectedStartDate || !this.selectedEndDate) {
    alert('请选择完整的起止日期后再导出');
    return;
  }
  // 校验日期逻辑合法性
  if (this.selectedStartDate > this.selectedEndDate) {
    alert('开始日期不能晚于结束日期,请重新选择');
    return;
  }

2. 改造服务层的exportDataByDate方法透传日期参数

原来的exportDataByDate是无参方法,需要调整为接收两个日期参数,按后端接口约定的格式把日期传到请求里,规避常见的时间匹配偏差问题:

// 放在你的dataSvc服务文件中
exportDataByDate(startDate: Date, endDate: Date) {
  // 自定义日期格式化方法,输出后端通用的yyyy-MM-dd格式
  const formatToPlainDate = (date: Date): string => {
    const year = date.getFullYear();
    const month = String(date.getMonth() + 1).padStart(2, '0');
    const day = String(date.getDate()).padStart(2, '0');
    return `${year}-${month}-${day}`;
  }
  // 把日期转为HTTP查询参数
  const requestParams = new HttpParams()
    .set('startDate', formatToPlainDate(startDate))
    .set('endDate', formatToPlainDate(endDate));
  // 发送带参数的请求
  return this.http.get('你的区间数据导出接口地址', { params: requestParams });
}

注意:不要直接把Date对象序列化后传给后端,Material DatePicker返回的时间对象带时区偏移,很容易出现差一天的匹配错误,必须先格式化为纯日期字符串。

3. 组件内调用服务方法拿到匹配数据生成CSV

调整downloadCSVByDate方法中服务调用的入参,把校验通过的两个日期传给服务层,后续CSV生成逻辑和原有全量导出逻辑完全一致:

downloadCSVByDate() {
  // 前面的日期校验逻辑
  if (!this.selectedStartDate || !this.selectedEndDate) {
    alert('请选择完整的起止日期后再导出');
    return;
  }
  if (this.selectedStartDate > this.selectedEndDate) {
    alert('开始日期不能晚于结束日期,请重新选择');
    return;
  }

  // 调用带日期参数的服务方法
  this.dataSvc.exportDataByDate(this.selectedStartDate, this.selectedEndDate).subscribe(data => {
    this.export = data;
    // 原有逐次循环push的逻辑可以简化为直接展开数组,减少冗余代码
    const jsonArrayObject = [...this.export['data']];
    // 原有CSV生成逻辑完全复用,无需修改
    new AngularCsv(jsonArrayObject, "ExgenReceipts", this.csvOptions);
  })
}

临时兜底方案(暂不支持后端改接口时用)

如果暂时无法让后端改造接口支持参数筛选,可以在前端拿到全量数据后,根据数据内的日期字段做本地过滤:

// 拿到全量返回数据后先做过滤
const filteredExportData = this.export['data'].filter(item => {
  // 替换成你实际数据里的日期字段名
  const recordDate = new Date(item.actualRecordDate).getTime();
  const startTimestamp = this.selectedStartDate.getTime();
  const endTimestamp = this.selectedEndDate.getTime();
  return recordDate >= startTimestamp && recordDate <= endTimestamp;
})
// 把过滤后的数组传给AngularCsv生成文件
new AngularCsv(filteredExportData, "ExgenReceipts", this.csvOptions);

这个方案仅适合数据量较小的场景,数据量较大时会出现页面加载卡顿,长期还是要走后端筛选的逻辑。


内容的提问来源于stack exchange,提问作者Aiswarya Annem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.06 09:06:04