I'm currently working on a project where I read an Excel file with row-by-row monthly data. Here is the current code
const handleFileUpload = async (e) => {
// converting excel date value
const excelEpoch = 25568
const millisecondsInDay = 86400000
const jsTime = (jsonData[7][6] - excelEpoch) * millisecondsInDay
const date = new Date(jsTime)
const file = e.target.files[0]
setFileName(file.name)
const data = await file.arrayBuffer()
const workbook = XLSX.read(data)
const worksheet = workbook.Sheets[workbook.SheetNames[0]]
console.log(worksheet)
const jsonData = XLSX.utils.sheet_to_json(worksheet, {
header: 1,
defval: '',
})
let waterExcel = []
let elecExcel = []
let gasExcel = []
console.log(jsonData)
const waterUnits = jsonData[6][2].toLowerCase()
const gasUnits = jsonData[6][9].toLowerCase()
const elecUnits = jsonData[6][14].toLowerCase()
const demandUnits = jsonData[6][16].toLowerCase()
for (var i = 7; i < jsonData.length; i++) {
let waterCost
if (jsonData[i][3] != '') {
waterCost = jsonData[i][3]
} else {
waterCost = 0
}
let wasteWater
if (jsonData[i][4] != '') {
wasteWater = jsonData[i][4]
} else {
wasteWater = 0
}
let wasteWaterCost
if (jsonData[i][5] != '') {
wasteWaterCost = jsonData[i][3]
} else {
wasteWaterCost = 0
}
//water payload
if (jsonData[i][1] != '' && jsonData[i][2] != '') {
const payload = {
site_id: site_id,
units: waterUnits,
total_water: parseFloat(jsonData[i][2]),
water_cost: parseFloat(waterCost),
total_wastewater: parseFloat(wasteWater),
wastewater_cost: parseFloat(wasteWaterCost),
total_bill_cost: parseFloat(jsonData[i][1]),
//month: parseInt(month),
//year: parseInt(year),
// start_date: "2025-04-01",
// end_date: "2025-05-02",
}
waterExcel.push(payload)
}
//gas payload
let gasCost
if (jsonData[i][10] != '') {
gasCost = jsonData[i][10]
} else {
gasCost = 0
}
if (jsonData[i][8] != '' && jsonData[i][9] != '') {
const payload = {
site_id: site_id,
gas_units: gasUnits,
total_gas: parseFloat(jsonData[i][9]),
gas_cost: parseFloat(gasCost),
total_bill_cost: parseFloat(jsonData[i][8]),
// month: parseInt(month),
// year: parseInt(year),
// start_date: "2024-04-01",
// end_date: "2024-05-02",
}
gasExcel.push(payload)
}
// electricity payload
let elecCost
if (jsonData[i][15] != '') {
elecCost = jsonData[i][15]
} else {
elecCost = 0
}
let demandCost
if (jsonData[i][17] != '') {
demandCost = jsonData[i][17]
} else {
demandCost = 0
}
let globalAdjust
if (jsonData[i][18] != '') {
globalAdjust = jsonData[i][18]
} else {
globalAdjust = 0
}
if (jsonData[i][13] != '' && jsonData[i][14] != '' && jsonData[i][16] != '') {
const payload = {
site_id: site_id,
electricity_units: elecUnits,
total_electricity: parseFloat(jsonData[i][14]),
electricity_cost: parseFloat(elecCost),
demand_units: demandUnits,
total_demand: parseFloat(jsonData[i][16]),
demand_cost: parseFloat(demandCost),
total_bill_cost: parseFloat(jsonData[i][13]),
global_adjustment: parseFloat(globalAdjust),
// month: parseInt(month),
// year: parseInt(year),
// start_date: "2024-04-01",
// end_date: "2024-05-02",
}
elecExcel.push(payload)
}
}
console.log('water payloads')
console.log(waterExcel)
console.log('gas payloads')
console.log(gasExcel)
console.log('electricity payloads')
console.log(elecExcel)
}
And the output comes out as expected with 3 different payloads. However, I'm trying to restructure the payload so that it is more similar to this
where month-year "mar-2024" is the first column of the Excel sheet. I'm not sure how to accomplish this.
Any help would be appreciated. Here is an example of the Excel spreadsheet
unless i misunderstand, looks like you just need to restructure your result differently.
const result = {};
for (let i = 7; i < jsonData.length; i++) {
const rowData = jsonData[i];
const singleRow = {};
singleRow.water = { total: rowData[2], startDate: rowData[6]; }; // add other data as needed
singleRow.electricity = { total: rowData[14], startDate: rowData[19]; };
singleRow.gas = { total: rowData[9], startDate: rowData[11]; };
const date = rowData[0];
result[date] = singleRow; // set property as row date
}
it seems you have all the pieces you need already. is there a particular issue you are having?