javascriptreactjsexcelpayload

Taking row by row data from Excel and putting it in a payload


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

enter image description here

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 enter image description here


Solution

  • 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?