基于Vue的Excel文件预览(使用LuckyExcel、LuckySheet实现)

2023-11-13

目录

一、介绍 

二、基本思路

三、安装

Luckyexcel

Luckysheet

CDN引入:

本地引入:

四、具体实现:

1、首先需要一个页面,用于excel的预览展示。

2、编写Excel解析渲染函数:openExcel(url链接,文件名)。

3、最后在create函数里编写从某页面跳转此页面之后的渲染逻辑。

4、如果处理的数据量较大,可以使用Luckysheet配置参数中的loadUrl和loadSheetUrl来分Sheet页加载。


        excel文件位于文件资源服务器上,可以直接访问excel文件链接获取文件。基于这种情况将excel文件展示在网页上,只提供预览功能。

一、介绍 

Luckysheet:一款开源的、纯前端的、类似excel的在线表格。可以藉此实现在线excel预览、编辑、导入导出及其他各种excel表格相关操作。

Luckyexcel,Luckysheet的一款适配插件的excel导入导出库,只支持.xlsx格式文件(不支持.xls)。

二、基本思路

1、使用LuckyExcel的transformExcelToLuckyByUrl=function (url, name, callBack) 方法将excel文件转换成LuckySheet需要的数据格式。

2、使用LuckySheet将上述数据渲染到页面上。

三、安装

Luckyexcel

npm下载:npm install luckyexcel --save

Luckysheet

  • 在/publiic/index.html文件里引入即可(可以本地引入,也可以CDN引入)。

CDN引入:

<link rel='stylesheet' href='./static/luckysheet/plugins/css/pluginsCss.css' />
<link rel='stylesheet' href='./static/luckysheet/plugins/plugins.css' />
<link rel='stylesheet' href='./static/luckysheet/css/luckysheet.css' />
<link rel='stylesheet' href='./static/luckysheet/assets/iconfont/iconfont.css' />
<script src="./static/luckysheet/plugins/js/plugin.js"></script>
<script src="./static/luckysheet/luckysheet.umd.js"></script>

本地引入:

  • npm下载luckysheet,然后将包内plugins、css、fonts、assets文件夹及luckysheet.umd.js放入public下的某目录,然后引入对应文件。

参考如下(/public/static/luckysheet)。

<link rel='stylesheet' href='./static/luckysheet/plugins/css/pluginsCss.css' />
<link rel='stylesheet' href='./static/luckysheet/plugins/plugins.css' />
<link rel='stylesheet' href='./static/luckysheet/css/luckysheet.css' />
<link rel='stylesheet' href='./static/luckysheet/assets/iconfont/iconfont.css' />
<script src="./static/luckysheet/plugins/js/plugin.js"></script>
<script src="./static/luckysheet/luckysheet.umd.js"></script>

四、具体实现:

1、首先需要一个页面,用于excel的预览展示。

页面中需要一个固定id的容器,用于承接Luckysheet的渲染,这里命名id为“luckysheet”。此外,容器需要设置好样式,尤其宽高。

<template>
  <div>
	<div id="luckysheet" :style="{ margin: '0px',padding:'0px',width:'100%',height: '800px' }"/>
  </div>
</template>

2、编写Excel解析渲染函数:openExcel(url链接,文件名)。

-- 使用LuckyExcel.transformExcelToLuckyByUrl(url, name,(exportJson, luckysheetfile) => {回调函数})。其中exportJson是Luckyexcel解析好的Excel文件数据,其中部分字段如下:

{
	"info": {
		"appversion": "14.0300 ",
		"company": "",
		"createdTime": "2020-11-10T02:35:00Z",
		"creator": "Apache POI",
		"lastmodifiedby": "SSRS",
		"modifiedTime": "2023-07-11T02:54:58Z",
		"name": null
	},
	"sheets": [{ --sheet表集合
		"celldata": [{ --每个单元格数的数据
			"c": 0, 
			"r": 0, 
			"v": {
				"bg": "#FFFFFF",
				"bl": 1,
				"ct": {
					"fa": "General",
					"t": "s"
				},
				"ff": "微软雅黑",
				"fs": 18,
				"ht": 0,
				"qp": 1,
				"tb": 2,
				"v": "单元格内容",
				"vt": 0
			}
		}],
		"config": {}, --当前sheet表的配置格式
		"index": "3", --sheet表的index
		"name": "XXXXXX", --sheet表名
		"order": "0", --sheet表的次序
		"showGridLines": "1", 
		"status": "1" --sheet表显示状态,哪个显示哪个是1
	}]
}

-- 使用window.luckysheet.create(options)函数预览excel表格。options参考如下:

整体配置 | Luckysheet文档

-- 其中在回调函数里将exportJson的sheets数据赋给options.data即可

 

const openExcel = ({url:url,name:name}) => {
  nextTick(() => {
    LuckyExcel.transformExcelToLuckyByUrl(url, name,(exportJson, luckysheetfile) => {
      if (exportJson.sheets == null || exportJson.sheets.length === 0) {
        alert("Fail to read the content of the excel file")
        return;
      }
      console.log('exportJson',exportJson)

      // luckysheet生成网页excel
      window.luckysheet.destroy()
      window.luckysheet.create({
        container: 'luckysheet', // 设定DOM容器的id
        showtoolbar: false, // 是否显示工具栏
        showinfobar: false, // 是否显示顶部信息栏
        showsheetbarConfig: {
          add: false, //新增sheet
          menu: true, //sheet管理菜单
          sheet: true //sheet页显示
        },
        sheetRightClickConfig: {
          delete: false, // 删除
          copy: false, // 复制
          rename: false, //重命名
          color: false, //更改颜色
          hide: false, //隐藏,取消隐藏
          move: false, //向左移,向右移
        },
        showstatisticBar: false, // 是否显示底部计数栏
        sheetBottomConfig: false, // sheet页下方的添加行按钮和回到顶部按钮配置
        allowEdit: false, // 是否允许前台编辑
        enableAddRow: false, // 是否允许增加行
        enableAddCol: false, // 是否允许增加列
        sheetFormulaBar: false, // 是否显示公式栏
        enableAddBackTop: false, //返回头部按钮
        data: exportJson.sheets, //表格内容
        title: exportJson.info.name, //表格标题
      });
    })
  })
};

3、最后在create函数里编写从某页面跳转此页面之后的渲染逻辑。

created() {
  // 上一个页面采用router.push({name: "ExcelShow", query: {url: url,name: name}}) 方式跳转传参
  // 获取参数: excel文件链接url及其名称name
  const fileUrl= this.$route.query.url ? this.$route.query.url : null
  const fileName= this.$route.query.name ? this.$route.query.name : null
  if (fileUrl == null) {
    alert("error")
  } else {
    // 加载文件内容
    this.openExcel({url:fileUrl,name:fileName})
  }

},

4、如果处理的数据量较大,可以使用Luckysheet配置参数中的loadUrl和loadSheetUrl来分Sheet页加载。

        loadUrl先加载默认sheet表的数据和所有sheet表的基本配置信息,随后切换到其它页的时候再请求loadSheetUrl将其数据补全。两个参数均为接口地址,使用post请求。具体数据格式见文档。

        由于excel文件是本身存在的,没有用后端生成,如果再使用后端构建数据集的话不太方便,所以我采用Luckyexcel加载文件所有数据,然后拆分exportJson,构建成两个数据集firstData和secondData。firstData是loadUrl配置的接口应该返回数据,secondData是loadSheetUrl配置的接口应该返回的数据。

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的源码,全局搜索,将所有对应$.post(loadurl, {"gridKey" : server.gridKey}, function (d) {里面的内容})$.post(loadSheetUrl, {"gridKey" : server.gridKey, "index": sheetindex.join(",")}, function (d) {里面的内容})的post请求外皮注释掉,只留下post请求里面的回调函数function (d)里面的内容,并将里面的内容中的原参数d改为loadurl或loadSheetUrl。

        最后编译打包,将生成的文件替换掉在安装步骤“引入luckysheet”时引入的文件。

 此时,在原项目中注释掉options配置的data,将JSON.stringify(firstData)赋给loadUrl,JSON.stringify(secondData)赋给loadSheetUrl即可。

最终代码如下:

<template>
  <div>
    <a-page-header title="Title" sub-title="This is a subtitle" @back="() => $router.go(-1)">
      <template #extra>
        <a-button @click="() => this.$router.back()">返回</a-button>
        <a-button v-if="!state.err" type="primary" @click="downfile({url: state.fileUrl,name: state.fileName})">保存</a-button>
      </template>
    </a-page-header>
    <a-card :bordered="false" :style="{ background: '#fff', minHeight: '280px' }">
      <div id="luckysheet" :style="{ margin: '0px',padding:'0px',width:'100%',height: totalHeight+'px' }"/>
    </a-card>
  </div>
</template>
<script>
import LuckyExcel from 'luckyexcel';
import {defineComponent, nextTick} from "vue";
import {reactive} from "vue";

export default defineComponent({
  created() {
    const fileUrl= this.$route.query.url ? this.$route.query.url : null
    const fileName= this.$route.query.name ? this.$route.query.name : null
    this.state.fileUrl = fileUrl
    this.state.fileName = fileName
    if (fileUrl == null) {
      alert("error")
    } else {
      // 加载文件内容
      this.openExcel({url:fileUrl,name:fileName})
    }

  },
  setup() {
    const state = reactive({
      fileUrl: '',
      fileName: ''
    });
    const totalHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
    const openExcel = ({url:url,name:name}) => {
      nextTick(() => {
        LuckyExcel.transformExcelToLuckyByUrl(url, name,(exportJson, luckysheetfile) => {
          if (exportJson.sheets == null || exportJson.sheets.length === 0) {
            alert("Fail to read the content of the excel file")
            return;
          }
          // /public/statis/luckysheet文件夹下 是被修改的luckysheet源码
          // loadUrl、loadSheetUrl不再使用post接口请求,而是直接传递现成数据加载(数据格式与原post返回格式一致)
          // 构建loadUrl: firstData(包括所有sheet表的格式,和第一个sheet的数据)
          // loadSheetUrl:secondData (包括除第一个sheet表的其他所有表的数据)

          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
          }

          console.log('exportJson',exportJson)

          // luckysheet生成网页excel
          window.luckysheet.destroy()
          window.luckysheet.create({
            container: 'luckysheet', // 设定DOM容器的id
            showtoolbar: false, // 是否显示工具栏
            showinfobar: false, // 是否显示顶部信息栏
            showsheetbarConfig: {
              add: false, //新增sheet
              menu: true, //sheet管理菜单
              sheet: true //sheet页显示
            },
            sheetRightClickConfig: {
              delete: false, // 删除
              copy: false, // 复制
              rename: false, //重命名
              color: false, //更改颜色
              hide: false, //隐藏,取消隐藏
              move: false, //向左移,向右移
            },
            showstatisticBar: false, // 是否显示底部计数栏
            sheetBottomConfig: false, // sheet页下方的添加行按钮和回到顶部按钮配置
            allowEdit: false, // 是否允许前台编辑
            enableAddRow: false, // 是否允许增加行
            enableAddCol: false, // 是否允许增加列
            sheetFormulaBar: false, // 是否显示公式栏
            enableAddBackTop: false, //返回头部按钮
            // data: [exportJson.sheets[0]], //表格内容
            gridKey: url,
            loadUrl: JSON.stringify(firstData), //首先加载的数据,被修改后需要String类型
            loadSheetUrl: JSON.stringify(secondData), //随后加载的数据,被修改后需要String类型
            title: exportJson.info.name, //表格标题
          });
        })
      })
    };
    return {
      totalHeight,
      simpleImage: Empty.PRESENTED_IMAGE_SIMPLE,
      state,
      openExcel
    }
  }
})

</script>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于Vue的Excel文件预览(使用LuckyExcel、LuckySheet实现) 的相关文章

随机推荐

  • 关注物联网、关注NB-IoT

    概述 关注物联网 关注NB IoT 跟紧时代步伐 让更多人深入理解5G用意 在当下情况下 今天就来来聊一聊NB IoT 特意整理了一些NB IoT的入门级问题 问 NB IoT的优势是什么 答 支持单小区50K用户连接 做上传用低功耗优势明
  • 【SpringBoot深入浅出系列】SpringBoot集成Eureka及Feign

    目录 前言 一 Eureka 是什么 二 Feign 是什么 三 集成步骤 1 创建 Eureka 服务注册中心 1 添加依赖 2 添加配置 3 启动类添加注解 4 启动服务 2 创建 SpringBoot 项目 provider 1 添加
  • MySQL图书管理系统设计

    目录 一 项目简介 二 项目分析 1 需求分析 图书管理功能 书籍的借出 归还 信息操作功能 人员管理功能 2 需求表信息分析 图书管理需求表分析 信息操作表信息分析 人员信息表 三 项目实施 1 创建图书信息表 2 创建人员信息表 3 创
  • SQL自学,mysql从入门到精通 --- 第 1 天,系统环境搭建,mysql部署

    1 SQL简介 SQL Structured Query Language 是一种用于管理和操作关系型数据库的编程语言 它被用于创建 修改和查询数据库 以及执行诸如数据插入 删除和更新等各种任务 SQL在Web开发 数据分析和数据库管理系统
  • vscode中设置字体大小_史上最全vscode配置使用教程

    点击上方蓝字 前端码头 一起玩耍 工欲善其事 必先利其器 想要优雅且高效的编写代码 必须熟练使用一款前端开发工具 但前端开发工具数不胜数 像HBuilder Sublime Text WebStorm Visual Studio Code
  • JSP( `EL表达式——获取数据` 和 `JSTL标签——展现数据`)(已被替代) 、 `MVC模式` 和 `三层架构`实现增删改查操作

    1 JSP 概述 JSP 全称 Java Server Pages Java 服务端页面 是一种动态的网页技术 其中既可以定义 HTML JS CSS等静态内容 还可以定义 Java代码的动态内容 也就是 JSP HTML Java JSP
  • 【Linux】Ubuntu开启root账户,以及后续连接MobaXterm

    一 开启root账户 1 首先在Ubuntu中打开终端 输入 sudo passwd root 完成root用户密码设置 效果如下图所示 2 输入下列代码 修改文件配置 sudo vim usr share lightdm lightdm
  • python脚本将json文件生成C语言结构体

    1 引言 以前用过python脚本根据excel生成相关C语言代码 其实本质就是文件的读写 主要是逻辑问题 这次尝试将json文件生成C语言的结构体 2 代码 这是一个json文件 生成这个结构体的本质是深度优先遍历 为了适应最复杂的情况
  • 很火的AI换脸怎么做的?方法其实非常简单

    网上很火的AI换脸是怎么做到的呢 将自己的脸部特征换到名人照片中 可以让我们看到自己和名人的组合效果如何 还可以将自己的脸部特征换到历史人物的照片中 看看自己是否有历史人物的气质 这种操作也非常有趣 看看自己是否适应不同的文化氛围 这也是一
  • 参加CSDN第六期编程竞赛感想

    CSDN编程竞赛报名地址 https edu csdn net contest detail 16 请不要删掉此地址 前言 背景 个人虽已经在IT行业工作多年 算法上是小白 没有多少积累 为了学习进步 自我提升 偶然机会看到CSDN举行的第
  • kubernetes 安装dns组件

    DNS 组件历史版本有skydns kube dns和coredns三个 k8s1 3版本之前使用skydns 之后的版本到1 17及之间的版本使用kube dns 目前主要使用coredns DNS组件用于解析k8s集群中service
  • excel+power query进行文本数据拆分和提取

    我的博客之前分享了pandas中文本数据的拆分和提取 由于数据量不大 我们也可以使用excel和它自带的插件power query进行同样的处理 原始数据如下 数据来源见此贴 登录爬取拉勾网2 0 Python selenium 数据准备
  • Python编程:安装自己编写的包

    前言 最近在跑人群计数代码时 有一些自己经常用到的代码 每次要用时再写一次总是很麻烦 所以想着把这部分常用的代码封装成库 以便于随时随地使用 做法 这里使用一种简易的方式 直接将自己编写的代码文件夹复制到python能够搜索到的位置 首先在
  • make -C $(LINUX_KERNEL_PATH) M=$(PWD) modules中的M选项

    新的内核模块编程中的make命令里有个M选项 如下 make C lib modules shell uname r build M PWD modules M PWD 意思是返回到当前目录继续读入 执行当前的Makefile 请参考 从
  • 软件、硬件版本号命名规范

    软件 硬件版本号命名规范 常见版本号规范示例如 v1 0 0 通用版本命名规范如下 主版本号 子版本号 修订版本号 日期 版本阶段 如v1 2 3 20201228 rc 主版本号 1 功能模块发生较大变动 如增加多个模块 整体架构改变 子
  • Linux基础篇大集合

    目录 一 基础篇 一 基本常识 1 linux的三种网络连接方式 2 虚拟机的克隆 3 虚拟机的快照 4 虚拟机的迁移和删除 二 目录结构 三 基本实操 1 远程连接Linux操作系统 2 vi vim编辑器 3 Linux关机重启 4 用
  • react+react-router 4.0+redux+antd 购物车实战项目

    前言 前些日子抽空学习了下react 因为近期忙着找工作 没时间写博客 今天我们就来看看用react全家桶 构建一个项目把 可能我学的也不是特别好 但是经过各种查资料 总算是能够构建出一个像模像样的栗子了 github地址 https gi
  • c++开发框架Qt6:构建系统CMake详解

    Qt自带集成开发环境 IDE 名为Qt Creator 它可以在Linux OS X和Windows上运行 并提供智能代码完成 语法高亮 集成帮助系统 调试器和剖析器集成 还集成了所有主要的版本控制系统 如git Bazaar 除了Qt C
  • 台式电脑显示配置100%请勿关闭计算机,Win7关机提示“配置Windows Update已完成30%请勿关闭计算机”怎么解决...

    重装了Win7旗舰版系统后 每次关机的时候桌面上都会显示一个 配置Windows Update的界面 提示请勿关闭计算机 每次停留好几分钟才能正常关机 导致什么情况引起的呢 出现配置Windows Update是因为系统开启了自动更新功能
  • 基于Vue的Excel文件预览(使用LuckyExcel、LuckySheet实现)

    目录 一 介绍 二 基本思路 三 安装 Luckyexcel Luckysheet CDN引入 本地引入 四 具体实现 1 首先需要一个页面 用于excel的预览展示 2 编写Excel解析渲染函数 openExcel url链接 文件名