解决Luckysheet在线预览编辑Excel、PDF.....无法在同一个界面创建多个luckysheet实列问题

luckysheet插件由于是实列挂载到windows.luckysheet实列上,导致同时只能使用一个luckysheet于是我们使用<iframe/>标签进行隔离:

1.每个<iframe>创建独立的浏览器上下文环境,避免多个Luckysheet实例共享同一JavaScript执行环境

2.通过<iframe>的沙箱特性,防止数据污染和CSS样式冲突,确保各实例独立运行

具体iframe介绍可以看一下我之前文章什么是iframe,火爆的微前端解决方案方案,教你快速看懂使用-CSDN博客

官方gitee地址:

Luckysheet: 🚀Luckysheet ,一款纯前端类似excel的在线表格,功能强大、配置简单、完全开源。

1.将下载得Luckysheet放到public/Luckysheet目录下:

Luckysheet: 🚀Luckysheet ,一款纯前端类似excel的在线表格,功能强大、配置简单、完全开源。

public同级创建创建luckysheet.htrml文件

luckysheet.htrml内容如下:

link路径指向public/Luckysheet

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title>luckysheet-wrapper</title>

    <link rel="stylesheet" href="/Luckysheet/plugins/css/pluginsCss.css">
    <link rel="stylesheet" href="/Luckysheet/plugins/plugins.css">
    <link rel="stylesheet" href="/Luckysheet/css/luckysheet.css">
    <link rel="stylesheet" href="/Luckysheet/assets/iconfont/iconfont.css">
    <script src="/Luckysheet/plugins/js/plugin.js"></script>
    <script src="/Luckysheet/luckysheet.umd.js"></script>
</head>
<body>
<noscript>
    <strong>We're sorry but luckysheet-wrapper doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="sheetContainer" style="margin:0px;padding:0px;position:absolute;width:100%;height:95%;left: 0px;top: 0px;"></div>
<!-- built files will be auto injected -->
</body>
</html>

2.创建 leftExcel.vue 子组件,可以复制多个都是可以单独存在得

这里我创建两个

复制代码
leftExcel.vue

复制代码
rightExcel.vue

两个组件,两个组件内得业务逻辑跟可以 单独配置使用,多个使用继续复制就行了

html 复制代码
<template>
  <div style="height: 100%; overflow: hidden;">
    <iframe :id="iframeId" height="100%" width="100%" src="/luckysheet.html" class="no-scroll"></iframe>
  </div>
</template>

<script setup>
import {ref, onMounted, defineProps} from 'vue';
import * as LuckyExcel from 'luckyexcel';
const iframeId = `iframe${Math.random().toString().substring(2)}`;
const $sheet = ref(null); // 存储luckysheet实例

const props = defineProps({
  options: {
    type: Object,
    default: () => ({})
  },
  onCreated: {
    type: Function,
    default: () => {
    }
  }
});
onMounted(() => {
  const frame = document.querySelector(`#${iframeId}`);
  frame.onload = () => {
    $sheet.value = frame.contentWindow.luckysheet;
    const container = frame.contentDocument.createElement('div');
    container.id = 'sheetContainer';
    frame.contentDocument.body.appendChild(container);

    $sheet.value.create({...props.options, container: container.id});
    props.onCreated($sheet.value);
    initLuckysheet();
  };

});
const initLuckysheet = (files) => {
  LuckyExcel.transformExcelToLucky(files[0], function (exportJson, luckysheetfile) {
    if (exportJson.sheets == null || exportJson.sheets.length == 0) return alert('读取excel文件内容失败, 目前不支持XLS文件!');
    $sheet.value.destroy();
    $sheet.value.create({
      data: exportJson.sheets,
      title: exportJson.info.name,
      userInfo: exportJson.info.name.creator,
      container: 'sheetContainer', // 设定DOM容器的id
      showtoolbar: false, // 是否显示工具栏
      showinfobar: false, // 是否显示顶部信息栏
      showstatisticBar: true, // 是否显示底部计数栏
      sheetBottomConfig: false, // sheet页下方的添加行按钮和回到顶部按钮配置
      allowEdit: false, // 是否允许前台编辑
      enableAddRow: false, // 是否允许增加行
      enableAddCol: false, // 是否允许增加列
      sheetFormulaBar: true, // 是否显示公式栏
      enableAddBackTop: false, // 返回头部按钮
      showsheetbar: true, // 是否显示底部sheet页按钮
      // 自定义配置底部sheet页按钮
      showsheetbarConfig: {
        add: false,
        menu: false,
      },
    });
  });
};

</script>

<style scoped>
.controls {
  margin-bottom: 20px;
}

.no-scroll {
  overflow: hidden; /* 隐藏水平和垂直滚动条 */
}
</style>

3. 主内我使用 tabs 页配置左右引入rightExcel跟leftExcel 两个组件,具体需求可自行配置

代码如下:

html 复制代码
<template>
<div class="index_body">
  <el-tabs type="border-card" v-model="activeName" @tab-click="handleClick">
    <el-tab-pane label="解析模板" name="first">
      <div class="container">
        <el-main style="height: calc(100% - 80px); position: relative; padding: 0px">
          <LeftExcel ref="sheet1" :on-created="(st) => sheet1 = st"></LeftExcel>
        </el-main>
      </div>
    </el-tab-pane>
    <el-tab-pane label="配置模板" name="second">
      <div class="container">
        <el-main style="height: calc(100% - 80px); position: relative; padding: 0px">
          <RightExcel ref="sheet1" :on-created="(st) => sheet1 = st"></RightExcel>
        </el-main>
      </div>
    </el-tab-pane>
  </el-tabs>
</div>
</template>

<script setup>
// 引入 LeftExcel 和 RightExcel
import LeftExcel from './leftExcel.vue'
import RightExcel from './rightExcel.vue'
import { ref, onMounted, onUnmounted } from 'vue'

const activeName = ref('first')

const handleClick = (tab, event) => {
  console.log(tab, event)
}
</script>

<style lang="scss" scoped>
.index_body{
margin-top: 50px;

.container {
  display: flex;
  justify-content: space-between; /* 根据需要调整 */
  align-items: stretch; /* 根据需要调整 */
  height: 100vh; /* 根据需要调整 */
}

.left-component {
  flex: 1; /* 根据需要调整 */
  margin-right: 10px; /* 根据需要调整 */
}

.right-component {
  flex: 1; /* 根据需要调整 */
  margin-left: 10px; /* 根据需要调整 */
}
}
</style>

同时存在是正常得:

相关推荐
人工智能教学实践15 分钟前
【爬虫脚本】实现批量pdf文件下载
pdf
海峰教授19 小时前
扫描仪+文档pdf编辑器+pdf格式转换器
pdf
Li_na_na0119 小时前
解决安卓手机WebView无法直接预览PDF的问题(使用PDF.js方案)
android·pdf·uni-app·html5
背太阳的牧羊人19 小时前
使用 PyMuPDF(fitz)库打开 PDF 文件,并且是从内存中的字节流(BytesIO)读取 PDF 内容
数据库·pdf·文件处理·pymupdf·fitz
灯火不休ᝰ20 小时前
前端处理pdf文件流,展示pdf
前端·pdf
梨小橙子1 天前
PPT画图,如何用Visio转化为pdf,且无白边
pdf·powerpoint
inxunoffice1 天前
批量给 PDF 添加页眉页脚以及页码信息
前端·javascript·pdf
学c真好玩1 天前
4.1-python操作wrod/pdf 文件
开发语言·python·pdf
绘绘~1 天前
软考-数据库系统工程师第四版pdf
pdf·软考·数据库系统工程师