永康嘉持电器有限公司前端
小小儁爺
2025-03-05 c34f771c22b4650c858b7d468ab00541a693bb4f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
<template>
  <div>
    <input
      ref="excel-upload-input"
      class="excel-upload-input"
      type="file"
      accept=".xlsx, .xls"
      @change="handleClick"
    >
    <el-button
      :loading="loading"
      style="margin-left:16px;"
      :disabled="disabled"
      type="primary"
      icon="el-icon-upload2"
      waves
      @click="handleUpload"
    >
      文件上传
    </el-button>
  </div>
</template>
 
<script>
import XLSX from 'xlsx'
import waves from '@/directive/waves'
 
export default {
  directives: { waves },
  props: {
    disabled: Boolean,
    beforeUpload: Function, // eslint-disable-line
    onSuccess: Function// eslint-disable-line
  },
  data() {
    return {
      loading: false,
      excelData: {
        header: null,
        results: null,
        sheetName: null
      }
    }
  },
  methods: {
    generateData({ header, results }) {
      this.excelData.header = header // 用做el-table表头
      this.excelData.results = results // 用做el-table表体
      this.onSuccess && this.onSuccess(this.excelData)
 
      // 数组对象更换键名
      // const aaa = JSON.parse(JSON.stringify(results))
      // const bb = aaa.map(({
      //   序号, 姓名
      // }) => ({
      //   index: 序号,
      //   name: 姓名
      // }))
      // console.log(bb, 321)
    },
    handleUpload() {
      this.$refs['excel-upload-input'].click()
    },
    handleClick(e) {
      const files = e.target.files
      const rawFile = files[0] // only use files[0]
      if (!rawFile) return
      this.upload(rawFile)
    },
    upload(rawFile) {
      this.$refs['excel-upload-input'].value = null // fix can't select the same excel
      if (!this.beforeUpload) {
        this.readerData(rawFile)
        return
      }
      const before = this.beforeUpload(rawFile)
      if (before) { // 执行了
        this.readerData(rawFile)
      }
    },
    readerData(rawFile) {
      this.loading = true
      return new Promise((resolve, reject) => {
        const reader = new FileReader()
        reader.onload = e => {
          const data = e.target.result
          const workbook = XLSX.read(data, { type: 'array', cellDates: true })
          let worksheet = []
          const header = []
          const results = []
          workbook.SheetNames.forEach((item, index) => {
            worksheet = workbook.Sheets[item]
            header.push(this.getHeaderRow(worksheet))
            results.push(XLSX.utils.sheet_to_json(worksheet, { defval: null, raw: false }))
          })
          this.excelData.sheetName = workbook.SheetNames
          // console.log(header)
          // console.log(results)
          // const firstSheetName = workbook.SheetNames[0]
          // const worksheet = workbook.Sheets[firstSheetName]
          // const header = this.getHeaderRow(worksheet)
          // const results = XLSX.utils.sheet_to_json(worksheet)
          this.generateData({ header, results })
          this.loading = false
          resolve()
        }
        reader.readAsArrayBuffer(rawFile)
      })
    },
    getHeaderRow(sheet) {
      const headers = []
      const range = XLSX.utils.decode_range(sheet['!ref'])
      let C
      const R = range.s.r
      /* start in the first row */
      for (C = range.s.c; C <= range.e.c; ++C) { /* walk every column in the range */
        const cell = sheet[XLSX.utils.encode_cell({ c: C, r: R })]
        /* find the cell in the first row */
        let hdr = 'UNKNOWN ' + C // <-- replace with your desired default
        if (cell && cell.t) hdr = XLSX.utils.format_cell(cell)
        headers.push(hdr)
      }
      return headers
    },
    isExcel(file) {
      return /\.(xlsx|xls|csv)$/.test(file.name)
    }
  }
}
</script>
 
<style scoped>
.excel-upload-input {
  display: none;
  z-index: -9999;
}
 
.drop {
  border: 2px dashed #bbb;
  width: 600px;
  height: 160px;
  line-height: 160px;
  margin: 0 auto;
  font-size: 24px;
  border-radius: 5px;
  text-align: center;
  color: #bbb;
  position: relative;
}
 
</style>
 
<style>
 
/*.has-gutter{*/
/*  color:  #34bfa3 !important;*/
/*}*/
 
/*.is-leaf{*/
/*  background-color: #34bfa3 !important;*/
/*}*/
</style>