问题描述
我需要获取一个工作簿的所有数据,我尝试了一个方法,但它不能正常工作..问题是Promise返回了第一个工作表的第一行,但它没有继续处理工作表的其余行,分别处理所有工作表,我不知道该怎么办。也许你知道..
所以我写了这段代码:
const SheetGet = {
getSheet: (req,res) => {
return new Promise ((resolve,reject) => {
XlsxPopulate.fromFileAsync(filePath)
.then(workbook => {
const wb = xlsx.readFile(filePath,{cellDates: true});
const sheetNames = wb.SheetNames;
sheetNames.forEach(function (element){
let endOfData = false;
let i = 2;
let dataArr = [];
while (endOfData === false){
let taskId = workbook.sheet(element).cell("A" + i.toString()).value();
if (taskId !== undefined){
res.send({
type: 'GET',list_name: element,task_id: taskId,task_name: workbook.sheet(element).cell("B" + i.toString()).value(),task_description: workbook.sheet(element).cell("C" + i.toString()).value(),task_due_date: workbook.sheet(element).cell("D" + i.toString()).value(),task_priority: workbook.sheet(element).cell("E" + i.toString()).value(),task_status: workbook.sheet(element).cell("F" + i.toString()).value(),task_notes: workbook.sheet(element).cell("G" + i.toString()).value()
});
i++;
}
else {
endOfData = true;
}
}
})
});
})
}
}
它只得到这个然后它就停止了,我需要从工作表中获取所有数据。
您知道如何解决此问题吗?或者让它工作的正确方法?非常感谢您的时间和帮助!!!非常感谢每一个帮助!
附言我用“console.log”尝试了这段代码,它运行得很好,但问题是当我更改为 res.send
以便将信息发送给 Postman 时。
解决方法
我假设您使用 express 作为框架,问题是当您使用 res.send 方法时,服务器已经将数据发送到客户端,而其余代码仍在后台运行。我要处理这个案子是这样的。
const SheetGet = {
getSheet: (req,res) => {
return new Promise ((resolve,reject) => {
XlsxPopulate.fromFileAsync(filePath)
.then(workbook => {
const wb = xlsx.readFile(filePath,{cellDates: true});
const sheetNames = wb.SheetNames;
sheetNames.forEach(function (element){
let endOfData = false;
let i = 2;
let dataArr = [];
while (endOfData === false){
let taskId = workbook.sheet(element).cell("A" + i.toString()).value();
if (taskId !== undefined){
dataArr.push({ // this one
type: 'GET',list_name: element,task_id: taskId,task_name: workbook.sheet(element).cell("B" + i.toString()).value(),task_description: workbook.sheet(element).cell("C" + i.toString()).value(),task_due_date: workbook.sheet(element).cell("D" + i.toString()).value(),task_priority: workbook.sheet(element).cell("E" + i.toString()).value(),task_status: workbook.sheet(element).cell("F" + i.toString()).value(),task_notes: workbook.sheet(element).cell("G" + i.toString()).value()
});
i++;
}
else {
endOfData = true;
}
}
})
return res.json({ data: dataArr }); // this one
});
})
}
}
虽然有一些不必要的代码,但您可以做的最少更改是上面的代码。
干杯。