如何将Excel中的逐行月度数据提取并封装到请求负载(payload)中?
如何将Excel中的逐行月度数据提取并封装到请求负载(payload)中?
看起来你正在处理Excel月度数据的提取和请求封装,我来一步步帮你搞定这个事儿~
首先,咱们先把基础的Excel读取流程补全,我猜你大概率用的是xlsx这个前端常用的Excel处理库,如果还没装依赖的话,先通过npm install xlsx或者yarn add xlsx搞定它。
第一步:完整读取Excel文件并解析为行数据
你之前的代码里file.arr应该是没写完的file.arrayBuffer(),咱们把这部分补全,把Excel文件解析成可遍历的行数据:
import * as XLSX from 'xlsx'; const handleFileUpload = async (e) => { const file = e.target.files[0]; if (!file) return; setFileName(file.name); // 读取文件为ArrayBuffer并解析 const arrayBuffer = await file.arrayBuffer(); const workbook = XLSX.read(arrayBuffer, { type: 'array' }); // 取第一个工作表(如果你的数据在其他sheet,改对应的sheet名就行) const firstSheetName = workbook.SheetNames[0]; const worksheet = workbook.Sheets[firstSheetName]; // 把工作表转成JSON格式的行数据,自动识别表头 const rowData = XLSX.utils.sheet_to_json(worksheet); // 接下来咱们处理数据并封装payload const processedPayload = processMonthlyData(rowData); // 这里就可以用封装好的payload发请求啦 await sendRequest(processedPayload); };
第二步:逐行处理数据(重点搞定日期转换)
你已经有了Excel日期转JS日期的逻辑,咱们把它封装成一个工具函数,然后遍历每一行数据处理日期,同时提取需要的月度相关字段:
// 封装Excel日期转JS日期的工具函数 const convertExcelDateToJSDate = (excelDate: number): Date => { const excelEpoch = 25568; // 1970-01-01对应的Excel日期值 const millisecondsInDay = 86400000; return new Date((excelDate - excelEpoch) * millisecondsInDay); }; const processMonthlyData = (rowData: any[]) => { // 假设每行数据里的日期是第7列(如果是表头对应字段,直接用字段名更稳妥,比如row.月度日期) return rowData.map(row => { // 处理Excel日期,转成YYYY-MM格式(后端常用的月度格式) const excelDateValue = row[6]; // 对应你之前的jsonData[7][6],注意索引要根据实际数据调整 const jsDate = convertExcelDateToJSDate(excelDateValue); const monthStr = `${jsDate.getFullYear()}-${(jsDate.getMonth() + 1).toString().padStart(2, '0')}`; // 按照后端接口要求,封装每行的字段,这里示例假设需要月度、销售额、备注 return { month: monthStr, salesAmount: row[1], // 假设第二列是销售额,根据你的实际表头调整 remark: row[7] || '' // 假设第八列是备注,空值默认空字符串 }; }).filter(item => item.month); // 过滤掉没有有效月度的空行 };
第三步:封装Payload并发送请求
最后把处理好的数组直接作为请求的payload(如果后端需要外层嵌套,比如{ data: [...] },就再包一层),然后发送请求:
const sendRequest = async (payload: any[]) => { try { // 这里替换成你的后端接口地址 const response = await fetch('/api/submit-monthly-data', { method: 'POST', headers: { 'Content-Type': 'application/json', // 如果需要token,这里加Authorization头 }, body: JSON.stringify({ monthlyData: payload }) // 按照后端要求的结构封装,比如外层是monthlyData }); const result = await response.json(); console.log('数据提交成功:', result); // 这里可以加成功后的提示,比如alert或者更新页面状态 } catch (error) { console.error('提交失败:', error); // 错误处理,比如提示用户 } };
一些小提醒
- 如果你的Excel有表头,
sheet_to_json会自动把表头作为对象的key,这时候用row.月度这种字段名比索引更稳妥,避免列调整后出错 - 如果后端需要的是时间戳或者其他日期格式,直接在
convertExcelDateToJSDate里调整返回格式就行 - 记得处理空行和异常数据,比如过滤掉没有日期或者核心数值的行,避免请求报错
这样下来,你就能把Excel里的逐行月度数据完美转成符合要求的请求payload啦,有任何字段映射或者格式调整的需求,直接改对应部分的代码就行~
内容来源于stack exchange
相关产品推荐
相关产品推荐

