基于Vue3实现LuckSheet在线预览Excel表格

8,513 阅读1分钟

LuckSheet和LuckyExcel

在前端开发中预览Excel文件是常见的需求之一。本文将介绍如何使用Vue.js框架以及两个优秀的Excel库——LuckyExcel和Luckysheet,来实现Excel文件在线预览功能。

LuckSheet是一款基于Web的在线表格组件,一款纯前端类似excel的在线表格,功能强大、配置简单、完全开源结合Vue3可以实现数据的动态展示和编辑,为用户提供良好的用户体验。

准备工作

首先,需要在Vue3项目中安装LuckSheet组件库,可以通过npm或yarn进行安装:

npm install luckysheet

或者

yarn add luckysheet

安装完成后,可以在Vue3项目中引入LuckSheet组件并进行配置。

【参考】Luckysheet官方文档

实现LuckSheet组件

在Vue3项目中,可以创建一个LuckSheet组件来实现在线预览Excel表格的功能。在LuckSheet组件中,可以使用LuckSheet提供的API来加载和展示Excel表格数据,并且可以实现数据的编辑和保存功能。

<template>
    <div>
        <!-- excel表格容器 -->
        <a-card :bordered="false" :style="{ background: '#fff' }">
            <div id="luckysheet" :style="{ margin: '0px', padding: '0px', width: '100%', height: contentHeight + 'px' }" />
        </a-card>
    </div>
</template>


<script setup>
import $script from 'scriptjs'
import LuckyExcel from 'luckyexcel'
import { nextTick } from 'vue'
import { reactive } from 'vue'
import { message } from 'ant-design-vue'

//父组件传递参数
const props = defineProps({
    fileUrl: {
        typeString,
        default'',
    },
    fileName: {
        typeString,
        default'',
    },
})
const state = reactive({
    fileUrl'',
    fileName'',
})
//初始化加载
onMounted(() => {
     //动态引入文件
    $script(['/lib/luckysheet/plugins/js/plugin.js''/lib/luckysheet/luckysheet.umd.js''/lib/luckysheet/loadCss.js'], 'luckysheet')
    $script.ready('luckysheet'function () {
        const fileUrl = props.fileUrl ? props.fileUrl : ''
        const fileName = props.fileName ? props.fileName : ''
        state.fileUrl = fileUrl
        state.fileName = fileName
        if (fileUrl == null) {
            console.log('error')
        } else {
            // 加载文件内容
            openExcel({ url: fileUrl, name: fileName })
        }
    })
})
//监听重新渲染组件
watch(
    () => props.fileUrl,
    () => {
        openExcel({ url: props.fileUrlname: props.fileName })
    }
)
//动态计算高度
const totalHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight
const contentHeight = totalHeight - 230
//渲染excel
const openExcel = ({ url: url, name: name }) => {
    nextTick(() => {
        LuckyExcel.transformExcelToLuckyByUrl(url, name, (exportJson, luckysheetfile) => {
            if (exportJson.sheets == null || exportJson.sheets.length === 0) {
                message.warning('无法读取excel的内容')
                return
            }
            const firstData = []
            const secondData = {}
            for (let i = 0; i < exportJson.sheets.length; i++) {
                firstData[i] = {
                    name: exportJson.sheets[i].name,
                    index: exportJson.sheets[i].index,
                    order: exportJson.sheets[i].order,
                    status: exportJson.sheets[i].status,
                    config: exportJson.sheets[i].config,
                }
                firstData[i].config.row = 10
                parseInt(exportJson.sheets[i].status) === 1 ? (firstData[i].celldata = exportJson.sheets[i].celldata) : 0 == 0
                secondData[exportJson.sheets[i].index] = exportJson.sheets[i].celldata
            }
            // luckysheet生成网页excel
            window.luckysheet.destroy()
            window.luckysheet.create({
                lang'zh',
                container'luckysheet'// 设定DOM容器的id
                showtoolbarfalse// 是否显示工具栏
                showinfobarfalse// 是否显示顶部信息栏
                showstatisticBartrue// 是否显示底部计数栏
                sheetBottomConfigfalse// sheet页下方的添加行按钮和回到顶部按钮配置
                allowEditfalse// 是否允许前台编辑
                enableAddRowfalse// 是否允许增加行
                enableAddColfalse// 是否允许增加列
                sheetFormulaBarfalse// 是否显示公式栏
                data: exportJson.sheets//表格内容
                enableAddBackToptrue//返回顶部
                title: exportJson.info.name//表格标题
                sheetRightClickConfig: {
                    deletefalse// 删除
                    copyfalse// 复制
                    renamefalse//重命名
                    colorfalse//更改颜色
                    hidefalse//隐藏,取消隐藏
                    movefalse//向左移,向右移
                },
                showsheetbarConfig: {
                    addfalse,
                },
                devicePixelRatiowindow.devicePixelRatio//分辨率
                defaultFontSize20//默认字体大小
                cellRightClickConfig: {
                    copyfalse// 复制
                    copyAsfalse// 复制为
                    pastefalse// 粘贴
                    insertRowfalse// 插入行
                    insertColumnfalse// 插入列
                    deleteRowfalse// 删除选中行
                    deleteColumnfalse// 删除选中列
                    deleteCellfalse// 删除单元格
                    hideRowfalse// 隐藏选中行和显示选中行
                    hideColumnfalse// 隐藏选中列和显示选中列
                    rowHeightfalse// 行高
                    columnWidthfalse// 列宽
                    clearfalse// 清除内容
                    matrixfalse// 矩阵操作选区
                    sortfalse// 排序选区
                    filterfalse// 筛选选区
                    chartfalse// 图表生成
                    imagefalse// 插入图片
                    linkfalse// 插入链接
                    datafalse// 数据验证
                    cellFormatfalse// 设置单元格格式
                },
            })
        })
    })
}
</script>

在LuckSheet组件中,通过引入Luckysheet库并动态加载样式文件,使用window.Luckysheet.create方法来创建LuckSheet实例,将Excel表格数据和配置选项传入实例中即可实现在线预览Excel表格的功能。

页面使用

<template>
<div>
   <a-card :bordered="false" :loading="loading" :style="{ background: '#fff' }">
      <lucksheetExcel :fileName="state.fileName" :fileUrl="state.fileUrl"></lucksheetExcel>
  </a-card>
</div>
</template>
<script lang="ts"  setup>
//导入组件
import {lucksheetExcel } from 'xxxxxxx'
//预览方式
const token = 'Bearer ' + getToken()
const fileUrlId = ref<string>('')
const state = reactive({
    fileUrl`${import.meta.env.VITE_AXIOS_BASE_URL}/file/download/${fileUrlId.value}?Authorization=${token}`,
    fileName'',
})
//预览方法
const refreshTable = () => {
  // params请求参数
  getLucksheetAPI(params).then((res) => {
                fileUrlId.value = res.data.fileId
                state.fileUrl = `${import.meta.env.VITE_AXIOS_BASE_URL}/file/download/${fileUrlId.value}?Authorization=${token}`
            })
            .catch((err) => {
                console.log(err)
            })

}
onActivated(() => {
    refreshTable()
})

</script>

实现效果

结语

通过Vue3和LuckSheet的结合,可以实现方便快捷的在线预览Excel表格功能,为用户提供良好的数据展示和编辑体验。希望本文对你有所帮助!