js 原生打开本地文件是通过设置 input 的
type='file'来实现的,但是它的界面很丑,往往达不到使用的要求,于是,我们通常的做法是通过一个
button 去触发 input 的事件,实现文件选择。
vue 实现
以下示例使用 quasar 组件开发。
| 12
 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
 
 | // template代码<q-btn
 label="从Excel导入"
 dense
 size="sm"
 outline
 color="orange"
 @click="selectExcelFile"
 ></q-btn>
 <input type="file" id="fileInput" style="display: none" @change="fileSelected" />
 
 // excel模块
 import XLSX from 'js-xlsx'
 
 // js 代码
 methods: {
 // 选择文件
 selectExcelFile() {
 const elem = document.getElementById('fileInput')
 elem.click()
 elem.value='' // 清空 vule,这样才可以再次选择文件
 },
 fileSelected(e) {
 // 判断是否选择了文件
 if (e.target.files.length === 0) {
 return
 }
 
 // 获取选择的文件
 const file = e.target.files[0]
 
 // 获取选择的文件
 const file = e.target.files[0]
 
 const excelData = await this.readExcelData(file)
 if (!excelData) return
 
 // 其它操作
 },
 
 // 读取 excel 数据
 async readExcelData(file) {
 return new Promise((resolve, reject) => {
 const reader = new FileReader()
 reader.onload = e => {
 const data = new Uint8Array(e.target.result)
 const workbook = XLSX.read(data, { type: 'array' })
 /* DO SOMETHING WITH workbook HERE */
 // 变成json
 const jsonObj = XLSX.utils.sheet_to_json(
 workbook.Sheets[workbook.SheetNames[0]]
 )
 resolve(jsonObj)
 }
 reader.onerror = () => {
 reject(false)
 }
 reader.readAsArrayBuffer(file)
 })
 }
 }
 
 | 
选项说明
| multiple | 表示可以多选文件 | 
| accept | 用逗号隔开的 MIME 类型列表。 | 
常见
MIME 类型列表