Skip to content

Xlsx to DB

ts
import etl from '@jrmc/etl'

const UserXlsxSource = () => import('./etl/sources/user_xlsx_source.js')
const UserXlsxTransform = () => import('./etl/transforms/user_xlsx_to_db_transform.js')
const UserXlsxDestination = () => import('./etl/destinations/user_db_destination.js')

etl.run({
  source: UserXlsxSource,
  transform: UserXlsxTransform,
  destination: UserXlsxDestination,
})
ts
import { Source } from '@jrmc/etl/types'
import xlsx from 'node-xlsx'

export default class UserArraySource implements Source {
  async *each() {
    const workSheetsFromFile = xlsx.parse('users.xlsx')

    workSheetsFromFile[0].data.shift()

    yield workSheetsFromFile[0].data
  }
}
ts
import { Transform } from '@jrmc/etl/types'

export default class UserXlsxToDbTransform implements Transform {
  async process(rows: Array<[string, string , number]>) {
    return rows.map(([firstname, lastname, age]) => ({
      firstname: UserXlsxToDbTransform.capitalizeFirstLetter(firstname),
      lastname: UserXlsxToDbTransform.capitalizeFirstLetter(lastname),
      age,
    }))
  }

  static capitalizeFirstLetter(word: string) {
    if (!word) return ''
    return word.charAt(0).toUpperCase() + word.slice(1)
  }
}
ts
import { Destination } from '@jrmc/etl/types'

type User = {
  firstname: string
  lastname: string
  age: number
}

export default class UserCsvDestination implements Destination {
  async write(rows: User[]) {
    await User.createMany(rows)
  }
}