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

TypeScript实现Excel删除H列非昨日日期的行

TypeScript 删除Excel中EffDate列非昨日日期的行解决方案

下面提供两种TS中常用Excel操作库的实现方案,解决你删除指定行的需求:

一、使用 ExcelJS 实现(推荐,支持保留原格式)

ExcelJS支持直接操作工作表行,适合需要保留Excel原有格式、样式的场景。

代码示例

import * as ExcelJS from 'exceljs';
import * as fs from 'fs';

async function filterExcelRows(inputPath: string, outputPath: string) {
  // 计算昨日日期,仅保留年月日部分
  const yesterday = new Date();
  yesterday.setDate(yesterday.getDate() - 1);
  const targetDateStr = yesterday.toISOString().split('T')[0];

  // 读取目标Excel文件
  const workbook = new ExcelJS.Workbook();
  await workbook.xlsx.readFile(inputPath);

  // 获取第一个工作表(可根据名称修改为`getWorksheet('工作表名')`)
  const worksheet = workbook.getWorksheet(1);
  if (!worksheet) throw new Error('未找到目标工作表');

  // 从最后一行往前遍历,避免删除行导致索引错乱
  for (let i = worksheet.rowCount; i >= 2; i--) { // 从第2行开始,跳过表头
    const row = worksheet.getRow(i);
    const effDateCell = row.getCell(8); // H列对应索引8(ExcelJS列从1开始计数)
    let cellDateStr = '';

    // 处理不同类型的日期值
    if (effDateCell.type === 'date') {
      cellDateStr = effDateCell.value.toISOString().split('T')[0];
    } else if (effDateCell.type === 'string') {
      // 假设字符串格式为YYYY-MM-DD,可根据实际格式调整解析逻辑
      const cellDate = new Date(effDateCell.value);
      if (!isNaN(cellDate.getTime())) {
        cellDateStr = cellDate.toISOString().split('T')[0];
      }
    } else if (effDateCell.type === 'number') {
      // 处理Excel序列化的日期数字(从1900-01-00开始的天数)
      const cellDate = ExcelJS.ExcelDate.toJSDate(effDateCell.value);
      cellDateStr = cellDate.toISOString().split('T')[0];
    }

    // 日期不匹配则删除该行
    if (cellDateStr !== targetDateStr) {
      worksheet.spliceRows(i, 1);
    }
  }

  // 保存处理后的文件
  await workbook.xlsx.writeFile(outputPath);
  console.log('处理完成,文件已保存至', outputPath);
}

// 调用示例
filterExcelRows('./input.xlsx', './output.xlsx').catch(err => console.error(err));

关键注意点

  • 安装依赖:执行 npm install exceljs @types/exceljs
  • 列索引修正:H列是第8列(A=1,依次类推),之前的第7列说法有误,需对应正确索引
  • 遍历方向:必须从后往前删除,否则会因行索引偏移导致漏删或误删
  • 日期格式:如果你的EffDate列是其他格式(如MM/DD/YYYY),需调整字符串解析逻辑,确保转为统一的YYYY-MM-DD格式再比较

二、使用 SheetJS (xlsx) 实现

SheetJS更适合批量数据处理,将Excel转为JSON数组过滤后再写回,适合不需要保留复杂格式的场景。

代码示例

import * as XLSX from 'xlsx';
import * as fs from 'fs';

function filterExcelWithSheetJS(inputPath: string, outputPath: string) {
  // 计算昨日日期的YYYY-MM-DD格式
  const yesterday = new Date();
  yesterday.setDate(yesterday.getDate() - 1);
  const targetDateStr = yesterday.toISOString().split('T')[0];

  // 读取Excel文件
  const workbook = XLSX.readFile(inputPath);
  const sheetName = workbook.SheetNames[0];
  const worksheet = workbook.Sheets[sheetName];

  // 将工作表转为JSON数组(表头作为键名)
  const data = XLSX.utils.sheet_to_json(worksheet) as Array<{ EffDate: string | number }>;

  // 过滤保留符合条件的行
  const filteredData = data.filter(row => {
    let effDateStr = '';
    const effDate = row.EffDate;

    if (typeof effDate === 'string') {
      const date = new Date(effDate);
      if (!isNaN(date.getTime())) {
        effDateStr = date.toISOString().split('T')[0];
      }
    } else if (typeof effDate === 'number') {
      // 处理Excel日期数字转为日期字符串
      const dateObj = XLSX.SSF.parse_date_code(effDate);
      effDateStr = `${dateObj.yyyy}-${String(dateObj.mm).padStart(2, '0')}-${String(dateObj.dd).padStart(2, '0')}`;
    }

    return effDateStr === targetDateStr;
  });

  // 将过滤后的数据转回工作表并保存
  const newWorksheet = XLSX.utils.json_to_sheet(filteredData, { header: Object.keys(data[0]) });
  const newWorkbook = XLSX.utils.book_new();
  XLSX.utils.book_append_sheet(newWorkbook, newWorksheet, sheetName);

  XLSX.writeFile(newWorkbook, outputPath);
  console.log('处理完成,文件已保存至', outputPath);
}

// 调用示例
filterExcelWithSheetJS('./input.xlsx', './output.xlsx');

关键注意点

  • 安装依赖:执行 npm install xlsx @types/xlsx
  • 表头匹配:确保工作表表头字段名为EffDate,若为其他名称需修改代码中的row.EffDate
  • 时区问题:若Excel日期为UTC时区,需统一转换为UTC日期后再比较,避免时区偏差导致匹配失败

常见排查方向

  1. 列索引错误:再次确认H列对应索引为8,而非7
  2. 日期格式不兼容:检查EffDate列的实际格式,调整代码中的日期解析逻辑
  3. 表头行误删:遍历从第2行开始,避免删除表头

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:47:43