영광의 시대!/2022 개발자의 품격 부트캠프 1기

[개발자의품격][부트캠프][1기][22차시] Vue.js #12 | excel 다운로드

DandyNow 2022. 3. 17. 12:52
728x90
반응형

excel 다운로드

exceljs, file-saver 모듈을 이용해 "excel 다운로드" 기능을 구현한다.

 

exceljs 설치

https://github.com/exceljs/exceljs

npm install exceljs

 

file-saver 설치

npm install file-saver

 

index.js

exceljs, file-saver를 import 한다. $ExcelFromTable() 함수를 작성한다.

// src/mixins/index.js
...
import ExcelJS from 'exceljs'
import { saveAs } from 'file-saver'

export default {
  ...
  methods: {
    ...
    async $ExcelFromTable(
      header = [],
      rows = [],
      fileName = 'excel',
      option = {}
    ) {
      header = header.filter((h) => h.title && h.key)
      // https://github.com/exceljs/exceljs#tables
      const wb = new ExcelJS.Workbook()
      const ws = wb.addWorksheet() // name,{pageSetup:https://github.com/exceljs/exceljs#page-setup}
      ws.addTable({
        name: 'myTable',
        ref: 'A1',
        headerRow: true,
        // style: { theme: 'TableStyleDark3', showRowStripes: true },
        columns: header.map((h) => ({
          name: h.title
        })), // width 설정가능, total함수 가능
        rows: rows.map((r) => header.map((h) => r[h.key])),
        ...option
      })

      saveAs(new Blob([await wb.xlsx.writeBuffer()]), `${fileName}.xlsx`)
    }
  }
}

 

ListView 컴포넌트

ListView.vue 컴포넌트의 <template> 태그에 "엑셀 다운로드" 버튼을 생성한다.

<!-- src/views/4_reuse/ListView.vue -->
<template>
  <div class="container">
    ...
    <button class="btn btn-danger" @click="doExcel">엑셀다운로드</button>

 

ListView.vue 컴포넌트의 methods에 doExcel() 함수를 선언한다. $ExcelFromTable() 함수를 사용해 headers, drinkList 데이터를 'drinklist.xlsx'파일로 저장하는 기능이다.

// src/views/4_reuse/ListView.vue
...
<script>
...
export default {
  ...
  data() {
    return {
      headers: [
        ...
      ],
      drinkList: []
      ...
    }
  },
  ...
  methods: {
    doSearch() {
      this.drinkList = [
        ...
      ]
    },
    ...
    // doExcel() 함수를 선언한다.
    doExcel() {
      this.$ExcelFromTable(this.headers, this.drinkList, 'drinklist')
    }
  }
}
</script>

 

728x90
반응형