Vue3实现LuckSheet在线预览Excel表格

 更新时间:2023年11月22日 08:53:50   作者:晨曦  
在前端开发中预览Excel文件是常见的需求之一,本文将介绍如何使用Vue.js框架以及两个优秀的Excel库——LuckyExcel和Luckysheet,来实现Excel文件在线预览功能,希望对大家有所帮助

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: {
        type: String,
        default: '',
    },
    fileName: {
        type: String,
        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.fileUrl, name: 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
                showtoolbar: false, // 是否显示工具栏
                showinfobar: false, // 是否显示顶部信息栏
                showstatisticBar: true, // 是否显示底部计数栏
                sheetBottomConfig: false, // sheet页下方的添加行按钮和回到顶部按钮配置
                allowEdit: false, // 是否允许前台编辑
                enableAddRow: false, // 是否允许增加行
                enableAddCol: false, // 是否允许增加列
                sheetFormulaBar: false, // 是否显示公式栏
                data: exportJson.sheets, //表格内容
                enableAddBackTop: true, //返回顶部
                title: exportJson.info.name, //表格标题
                sheetRightClickConfig: {
                    delete: false, // 删除
                    copy: false, // 复制
                    rename: false, //重命名
                    color: false, //更改颜色
                    hide: false, //隐藏,取消隐藏
                    move: false, //向左移,向右移
                },
                showsheetbarConfig: {
                    add: false,
                },
                devicePixelRatio: window.devicePixelRatio, //分辨率
                defaultFontSize: 20, //默认字体大小
                cellRightClickConfig: {
                    copy: false, // 复制
                    copyAs: false, // 复制为
                    paste: false, // 粘贴
                    insertRow: false, // 插入行
                    insertColumn: false, // 插入列
                    deleteRow: false, // 删除选中行
                    deleteColumn: false, // 删除选中列
                    deleteCell: false, // 删除单元格
                    hideRow: false, // 隐藏选中行和显示选中行
                    hideColumn: false, // 隐藏选中列和显示选中列
                    rowHeight: false, // 行高
                    columnWidth: false, // 列宽
                    clear: false, // 清除内容
                    matrix: false, // 矩阵操作选区
                    sort: false, // 排序选区
                    filter: false, // 筛选选区
                    chart: false, // 图表生成
                    image: false, // 插入图片
                    link: false, // 插入链接
                    data: false, // 数据验证
                    cellFormat: false, // 设置单元格格式
                },
            })
        })
    })
}
</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表格功能,为用户提供良好的数据展示和编辑体验。

以上就是Vue3实现LuckSheet在线预览Excel表格的详细内容,更多关于Vue3在线预览表格的资料请关注脚本之家其它相关文章!

相关文章

  • Vue + Axios 请求接口方法与传参方式详解

    Vue + Axios 请求接口方法与传参方式详解

    使用Vue的脚手架搭建的前端项目,通常都使用Axios封装的接口请求,项目中引入的方式不做多介绍,本文主要介绍接口调用与不同形式的传参方法。对Vue + Axios 请求接口方法与传参问题感兴趣的朋友一起看看吧
    2021-12-12
  • 详解如何在vue中封装axios请求并集中管理

    详解如何在vue中封装axios请求并集中管理

    这篇文章主要为大家详细介绍了如何在vue中封装axios请求并集中管理,w文中的示例代码讲解详细,具有一定的参考价值,有需要的小伙伴可以了解下
    2023-10-10
  • 基于Vue3实现扫码枪扫码并生成二维码实例代码

    基于Vue3实现扫码枪扫码并生成二维码实例代码

    vue3生成二维码的方式有很多种,下面这篇文章主要给大家介绍了关于如何基于Vue3实现扫码枪扫码并生成二维码的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • VUE3基础学习之click事件详解

    VUE3基础学习之click事件详解

    由于vue是一个双向数据绑定的框架,它的点击事件与以前常用的还是有很大的差别的,下面这篇文章主要给大家介绍了关于VUE3基础学习之click事件的相关资料,需要的朋友可以参考下
    2022-01-01
  • vue实现弹窗拖拽效果

    vue实现弹窗拖拽效果

    这篇文章主要为大家详细介绍了vue实现弹窗拖拽效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • Vue组件实现景深卡片轮播示例

    Vue组件实现景深卡片轮播示例

    这篇文章主要为大家介绍了Vue组件实现景深卡片轮播示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • vue数据对象length属性未定义问题

    vue数据对象length属性未定义问题

    这篇文章主要介绍了vue数据对象length属性未定义问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Vue组件通信传递数据的三种方式

    Vue组件通信传递数据的三种方式

    这篇文章主要介绍了Vue组件通信传递数据的三种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-04-04
  • vue中 this.$set的用法详解

    vue中 this.$set的用法详解

    这篇文章主要介绍了vue中 this.$set的用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Vue实现PopupWindow组件详解

    Vue实现PopupWindow组件详解

    这篇文章主要为大家详细介绍了Vue实现PopupWindow组件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04

最新评论