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

LuckSheet和LuckyExcel

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

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

准备工作

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

npm install luckysheet

或者

csharp 复制代码
yarn add luckysheet

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

【参考】Luckysheet官方文档

实现LuckSheet组件

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

js 复制代码
<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表格的功能。

页面使用

js 复制代码
<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表格功能,为用户提供良好的数据展示和编辑体验。希望本文对你有所帮助!

相关推荐
_.Switch40 分钟前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
一路向前的月光44 分钟前
Vue2中的监听和计算属性的区别
前端·javascript·vue.js
长路 ㅤ   1 小时前
vite学习教程06、vite.config.js配置
前端·vite配置·端口设置·本地开发
长路 ㅤ   1 小时前
vue-live2d看板娘集成方案设计使用教程
前端·javascript·vue.js·live2d
Fan_web1 小时前
jQuery——事件委托
开发语言·前端·javascript·css·jquery
安冬的码畜日常1 小时前
【CSS in Depth 2 精译_044】第七章 响应式设计概述
前端·css·css3·html5·响应式设计·响应式
莹雨潇潇2 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
Jiaberrr2 小时前
Element UI教程:如何将Radio单选框的圆框改为方框
前端·javascript·vue.js·ui·elementui
Tiffany_Ho3 小时前
【TypeScript】知识点梳理(三)
前端·typescript
安冬的码畜日常4 小时前
【D3.js in Action 3 精译_029】3.5 给 D3 条形图加注图表标签(上)
开发语言·前端·javascript·信息可视化·数据可视化·d3.js