
依赖
首先引入处理 Excel 文件的包
1 | npm install xlsx |
此时没有限制包版本,跑起来时候报了个错:
export 'default' (imported as 'XLSX') was not found in 'xlsx'
经过尝试后把版本降到 0.16 后解决
1 | npm install xlsx@0.16.0 --save |
样式
我们先实现纯前端样式,包括拖拽框和按钮等
由于这类功能可以复用,咱们把它封装成组件
1 | <template> |
实现
准备工作,最终我们的目的是把表头和内容分开装到这两个对象里,并让调用组件的人拿到
1 | import XLSX from 'xlsx' |
给组件使用方暴露几个定制化方法:
1 | props: { |
实际处理方法
1 | upload(rawFile) { |
实现拖拽实际需要 event.stopPropagation 和 event.preventDefault
如果是通过 File 的 Input 进来的话,可以限制文件格式。对于拖拽的文件我们就需要判断格式
1 | isExcel(file) { |
1 | handleDrop(e) { |
1 | handleDragover(e) { |
咱们接着把通过点击按钮上传的实现
1 | handleUpload() { |
1 | handleClick(e) { |
最后是处理文件的方法,网上挺多的
1 | readerData(rawFile) { |
1 | getHeaderRow(sheet) { |
成功时把表头和内容都传给父组件,并调用成功回调
1 | generateData({ header, results }) { |
使用示例
一般我们上传文件后,如果内容不多,可以在页面展示出来
写一个很常见的成功后调用接口例子
1 | <template> |
类似 PHP 去实现抽象类的方法
1 | beforeUpload(file) { |
这里是直接把数组给的后端,验证时可以如下写法
1 | public function rules (): array { |