You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
325 lines
9.1 KiB
325 lines
9.1 KiB
<template>
|
|
<el-dialog
|
|
title="导入"
|
|
element-loading-text="正在导入..."
|
|
:visible.sync="show"
|
|
:append-to-body="false"
|
|
:modal-append-to-body="false"
|
|
:fullscreen="true"
|
|
v-loading="loading"
|
|
:modal="false"
|
|
>
|
|
<!-- v-loading.fullscreen.lock="loading" -->
|
|
<el-button
|
|
type="success"
|
|
size="mini"
|
|
icon="el-icon-download"
|
|
@click="postImportDown"
|
|
>获取模板</el-button
|
|
>
|
|
<!-- <el-button
|
|
type="warning"
|
|
size="mini"
|
|
icon="el-icon-upload"
|
|
@click="postImportDown"
|
|
>导入数据</el-button
|
|
> -->
|
|
<input ref="excel-upload-input" class="excel-upload-input" type="file" accept=".xlsx, .xls" @change="handleClick">
|
|
<el-button
|
|
:loading="loading"
|
|
style="margin-left:16px;"
|
|
size="mini"
|
|
type="primary"
|
|
@click="handleUpload"
|
|
icon="el-icon-download"
|
|
>
|
|
导入数据
|
|
</el-button>
|
|
<!-- <el-button
|
|
:loading="loading"
|
|
style="margin-left:16px;"
|
|
size="mini"
|
|
type="warning"
|
|
@click="handlePrint()"
|
|
icon="el-icon-printer"
|
|
>
|
|
全部打印
|
|
</el-button> -->
|
|
<!-- <div class="drop" @drop="handleDrop" @dragover="handleDragover" @dragenter="handleDragover">
|
|
Drop excel file here or
|
|
<el-button :loading="loading" style="margin-left:16px;" size="mini" type="primary" @click="handleUpload">
|
|
Browse
|
|
</el-button>
|
|
</div> -->
|
|
<div style="height:calc(100% - 60px)" id="tableOuter">
|
|
<el-table
|
|
:data="excelData.results"
|
|
border
|
|
highlight-current-row
|
|
style="width: 100%;margin-top:20px;"
|
|
:max-height="tableMaxHeight"
|
|
>
|
|
<!-- @selection-change="handleSelectionPrint" -->
|
|
<!-- <el-table-column type="selection" width="55"></el-table-column> -->
|
|
<el-table-column
|
|
v-if="excelData.header.length > 0"
|
|
type="index"
|
|
fixed="left"
|
|
label="序号"
|
|
width="50"
|
|
/>
|
|
<el-table-column
|
|
v-for="(item,index) of excelData.header"
|
|
:key="index"
|
|
:prop="item"
|
|
:label="item"
|
|
:fixed="headerFixed(item)"
|
|
/>
|
|
<!-- <el-table-column v-if="excelData.header.length > 0" label="明细-箱标签" fixed="right" width="100">
|
|
<template slot-scope="scope">
|
|
{{scope.row['明细-箱标签']}}
|
|
</template>
|
|
</el-table-column> -->
|
|
<!-- <el-table-column label="操作" fixed="right">
|
|
<template slot-scope="scope">
|
|
<el-button type="text" @click="handlePrint([scope.row])">打印</el-button>
|
|
</template>
|
|
</el-table-column> -->
|
|
</el-table>
|
|
</div>
|
|
<span slot="footer" class="dialog-footer">
|
|
<el-button @click="submitForm(0)">取 消</el-button>
|
|
<el-button type="primary" @click="submitForm(1)">确 定</el-button>
|
|
</span>
|
|
</el-dialog>
|
|
</template>
|
|
|
|
<script>
|
|
import XLSX from 'xlsx'
|
|
import { mixins } from "@/mixins/mixins"
|
|
import {SupplierAsnCtypeStaBack} from "@/filters/status"
|
|
|
|
export default {
|
|
name:"UploadExcel",
|
|
mixins:[mixins],
|
|
watch: {
|
|
show () {
|
|
this.reset()
|
|
}
|
|
},
|
|
props: {
|
|
//表头浮动项
|
|
fixedArr:{
|
|
type:Array,
|
|
default: () => {
|
|
return []
|
|
}
|
|
},
|
|
fixedLeftArr:{
|
|
type:Array,
|
|
default:null
|
|
},
|
|
show: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
beforeUpload: Function, // eslint-disable-line
|
|
onSuccess: Function// eslint-disable-line
|
|
},
|
|
data() {
|
|
return {
|
|
loading: false,
|
|
excelData: {
|
|
header: [],
|
|
results: []
|
|
},
|
|
// printSelection:[],//已选打印
|
|
tableMaxHeight:null,//表格流体最大高度
|
|
}
|
|
},
|
|
methods: {
|
|
// 数据重置
|
|
reset(){
|
|
this.excelData = {
|
|
header:[],
|
|
results:[]
|
|
}
|
|
this.loading = false
|
|
// this.printSelection = [];
|
|
},
|
|
headerFixed(item){
|
|
let _fix = false
|
|
this.fixedArr.forEach(fix=>{
|
|
if(fix.name == item){
|
|
_fix = fix.value
|
|
}
|
|
})
|
|
return _fix
|
|
},
|
|
/**
|
|
* 按钮操作
|
|
* index 0:取消,1:确定
|
|
*/
|
|
submitForm(index) {
|
|
this.$emit("submitForm", index,this.excelData);
|
|
},
|
|
// 多选
|
|
// handleSelectionPrint(val) {
|
|
// this.printSelection = val;
|
|
// },
|
|
/**
|
|
* 打印
|
|
* arr 有参数为单独打印,无参数为批量打印
|
|
*/
|
|
// handlePrint(arr){
|
|
// let rdlx = "xiangbq.rdlx";
|
|
// let params = {
|
|
// "boxlabel":[]
|
|
// }
|
|
// // let printArr = arr ? arr : this.printSelection;
|
|
// let printArr = arr ? arr : this.excelData.results;
|
|
// if(!printArr || printArr.length <= 0){
|
|
// this.$message({
|
|
// message: '请选择要打印的数据',
|
|
// type: 'error'
|
|
// });
|
|
// return
|
|
// }
|
|
// },
|
|
postImportDown () {
|
|
this.$emit('postImportDown')
|
|
},
|
|
// 成功后回显及渲染
|
|
successShowExcel(header, results){
|
|
this.excelData.header = header
|
|
this.excelData.results = results
|
|
this.tableMaxHeight = document.getElementById("tableOuter").clientHeight
|
|
this.loading = false
|
|
},
|
|
generateData({ header, results }) {
|
|
// this.excelData.header = header
|
|
// this.excelData.results = results
|
|
// this.tableMaxHeight = document.getElementById("tableOuter").clientHeight
|
|
if(this.onSuccess){
|
|
this.onSuccess(header, results).then((res_header, res_results)=>{
|
|
let _header = res_header ? res_header : header;
|
|
let _results = res_results ? res_results : results;
|
|
this.successShowExcel(_header, _results)
|
|
}).catch(err=>{
|
|
this.loading = false
|
|
})
|
|
}else{
|
|
this.successShowExcel(header, results)
|
|
}
|
|
},
|
|
handleDrop(e) {
|
|
e.stopPropagation()
|
|
e.preventDefault()
|
|
if (this.loading) return
|
|
const files = e.dataTransfer.files
|
|
if (files.length !== 1) {
|
|
this.$message.error('Only support uploading one file!')
|
|
return
|
|
}
|
|
const rawFile = files[0] // only use files[0]
|
|
|
|
if (!this.isExcel(rawFile)) {
|
|
this.$message.error('Only supports upload .xlsx, .xls, .csv suffix files')
|
|
return false
|
|
}
|
|
this.upload(rawFile)
|
|
e.stopPropagation()
|
|
e.preventDefault()
|
|
},
|
|
handleDragover(e) {
|
|
e.stopPropagation()
|
|
e.preventDefault()
|
|
e.dataTransfer.dropEffect = 'copy'
|
|
},
|
|
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.loading = true
|
|
this.$refs['excel-upload-input'].value = null // fix can't select the same excel
|
|
|
|
if (!this.beforeUpload) {
|
|
this.readerData(rawFile)
|
|
this.loading = false
|
|
return
|
|
}
|
|
const before = this.beforeUpload(rawFile)
|
|
if (before) {
|
|
this.readerData(rawFile)
|
|
}
|
|
},
|
|
readerData(rawFile) {
|
|
return new Promise((resolve, reject) => {
|
|
const reader = new FileReader()
|
|
reader.onload = e => {
|
|
const data = e.target.result
|
|
// const workbook = XLSX.read(data, { type: 'array',cellText:false,cellDates:true })
|
|
const workbook = XLSX.read(data, { type: 'array'})
|
|
const firstSheetName = workbook.SheetNames[0]
|
|
const worksheet = workbook.Sheets[firstSheetName]
|
|
const header = this.getHeaderRow(worksheet)
|
|
const results = XLSX.utils.sheet_to_json(worksheet,{raw:false})
|
|
// const results = XLSX.utils.sheet_to_json(worksheet)
|
|
if(results.length <= 0){
|
|
this.$message.error('导入表格内无数据,请确认后重新导入');
|
|
this.loading = false
|
|
return
|
|
}
|
|
this.generateData({ header, results })
|
|
resolve()
|
|
this.tab
|
|
}
|
|
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>
|
|
|