如何调整表格列日期顺序 实现日期数据筛选与自定义排序
解决方案
完全可以实现非固定区间的日期自定义筛选、排序,不需要硬编码A13-A28的单元格范围,也不推荐用正则提取日期——正则无法覆盖Excel所有日期存储格式(比如Excel内置的日期序列值、不同地区的日期文本格式),容错率很低,用SheetJS自带的类型解析+原生数组方法就能稳定实现需求。
实现思路
- 读取文件时开启SheetJS的日期自动解析能力,将所有格式的日期统一转为JavaScript原生
Date对象,省去手动正则匹配的成本 - 遍历行数据时,直接判断目标列的值是否为合法日期,自动过滤非日期行,不受日期所在行区间的限制
- 通过数组
sort方法传入自定义比较函数,实现任意规则的日期排序
可直接运行的改造代码
const [columns, setColumns] = useState([]); const [excData, setExcData] = useState([]); const handFile = async (e) => { const file = e.target.files[0]; const fileReader = new FileReader(); setFileName(file.name); const data = await file.arrayBuffer(); // 开启cellDates配置,自动将Excel日期序列转为JS Date对象 const workbook = XLSX.read(data, { cellDates: true }); const worksheet = workbook.Sheets[workbook.SheetNames[0]]; const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1, defval: "", blankrows: false, raw: false, // 关闭原始值输出,自动格式化单元格类型 }); fileReader.onerror = (error) => { console.dir(error, { depth: null }); }; // 筛选A列(对应索引0)为合法日期的所有行,无需固定行范围 const validDateRows = jsonData.filter(row => { const targetCell = row[0]; return targetCell instanceof Date && !isNaN(targetCell.getTime()); }); // 自定义排序:示例为日期升序,要倒序改为b[0].getTime() - a[0].getTime()即可 validDateRows.sort((a, b) => a[0].getTime() - b[0].getTime()); setexcData(validDateRows); }
注意:原代码中使用的
XLSX.readFile是Node.js环境专属API,浏览器端读取ArrayBuffer格式文件需要替换为XLSX.read,否则会抛出方法不存在的错误,上述代码已经修正该问题。
自定义调整说明
- 如果日期不在A列,只需要修改
filter和sort逻辑里的列索引即可,比如B列就把row[0]改成row[1] - 如果需要特殊排序规则(比如按周分组、只取工作日、筛选指定时间区间的日期),直接修改
filter的判断条件、sort的比较函数就能实现,不需要依赖额外工具库 - 该方案会自动适配表格行变动,不管日期分布在哪些行,只要单元格值是合法日期就会被识别,不需要手动维护单元格范围
内容的提问来源于stack exchange,提问作者oykn
相关产品推荐
相关产品推荐

