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日期后再比较,避免时区偏差导致匹配失败
常见排查方向
- 列索引错误:再次确认H列对应索引为8,而非7
- 日期格式不兼容:检查EffDate列的实际格式,调整代码中的日期解析逻辑
- 表头行误删:遍历从第2行开始,避免删除表头
内容的提问来源于stack exchange,提问作者GIWI
相关产品推荐
相关产品推荐

