mirror of
https://github.com/501351981/vue-office.git
synced 2025-07-15 07:32:19 +08:00
79 lines
1.9 KiB
Vue
79 lines
1.9 KiB
Vue
<script>
|
|
import { defineComponent,ref, onMounted, watch } from 'vue-demi'
|
|
import Spreadsheet from "x-data-spreadsheet";
|
|
import {getData, readExcelData, transferExcelToSpreadSheet} from './excel'
|
|
|
|
export default defineComponent({
|
|
name: 'VueOfficeExcel',
|
|
props: {
|
|
src: [String, ArrayBuffer, Blob],
|
|
requestOptions: {
|
|
type: Object,
|
|
default: () => ({})
|
|
},
|
|
options: {
|
|
type: Object,
|
|
default: () => ({
|
|
minColLength: 20
|
|
})
|
|
}
|
|
},
|
|
emits:['rendered', 'error'],
|
|
setup(props, { emit }){
|
|
const wrapperRef = ref(null)
|
|
const rootRef = ref(null)
|
|
let xs = null
|
|
function renderExcel(buffer){
|
|
readExcelData(buffer).then(workbook =>{
|
|
const {workbookData, medias} = transferExcelToSpreadSheet(workbook, props.options)
|
|
xs.loadData(workbookData);
|
|
emit('rendered')
|
|
}).catch(e=>{
|
|
console.warn(e)
|
|
xs.loadData({})
|
|
emit('error', e)
|
|
})
|
|
}
|
|
onMounted(()=>{
|
|
window.xs = xs = new Spreadsheet(rootRef.value,{
|
|
mode: 'read',
|
|
showToolbar: false,
|
|
view: {
|
|
height: () => wrapperRef.value.clientHeight || 300,
|
|
width: () => document.documentElement.clientWidth,
|
|
},
|
|
}).loadData({});
|
|
if(props.src){
|
|
getData(props.src, props.requestOptions).then(renderExcel).catch(e =>{
|
|
xs.loadData({})
|
|
emit('error', e)
|
|
})
|
|
}
|
|
})
|
|
|
|
watch(() => props.src, () =>{
|
|
if(props.src){
|
|
getData(props.src).then(renderExcel).catch(e =>{
|
|
xs.loadData({})
|
|
emit('error', e)
|
|
})
|
|
}else{
|
|
xs.loadData({})
|
|
}
|
|
})
|
|
return {
|
|
wrapperRef,
|
|
rootRef
|
|
}
|
|
}
|
|
})
|
|
</script>
|
|
|
|
<template>
|
|
<div class="vue-office-excel" ref="wrapperRef">
|
|
<div class="vue-office-excel-main" ref="rootRef"></div>
|
|
</div>
|
|
</template>
|
|
<style lang="less">
|
|
|
|
</style> |