解决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>

同时存在是正常得:

相关推荐
AAA_自动化工程师3 小时前
TIA博途中的程序导出为PDF格式的具体方法示例
pdf·tia博途·程序导出·pdf格式·具体方法
行云流水剑3 小时前
【学习记录】如何使用 Python 提取 PDF 文件中的内容
python·学习·pdf
IDRSolutions_CN3 小时前
PDF 转 HTML5 —— HTML5 填充图形不支持 Even-Odd 奇偶规则?(第二部分)
java·经验分享·pdf·软件工程·团队开发
upp5 小时前
【bug】Error: /undefinedfilename in (/tmp/ocrmypdf.io.9xfn1e3b/origin.pdf)
ubuntu·pdf·bug·ghostscript
沉到海底去吧Go8 小时前
【工具教程】多个条形码识别用条码内容对图片重命名,批量PDF条形码识别后用条码内容批量改名,使用教程及注意事项
pdf
摸鱼仙人~9 小时前
PDF图片和表格等信息提取开源项目
pdf
空中湖1 天前
文档极速转换器 - 免费批量Word转PDF工具
pdf·word
沉到海底去吧Go1 天前
【工具教程】PDF电子发票提取明细导出Excel表格,OFD电子发票行程单提取保存表格,具体操作流程
pdf·excel
诸葛大钢铁1 天前
PDF转PPT转换方法总结
pdf·powerpoint
漫游者Nova2 天前
PDF转Markdown/JSON软件MinerU最新1.3.12版整合包下载
pdf·json·markdown·mineru