luckyexcel 编辑预览excel文件
luckyexcel 编辑预览excel文件
支持后端传文件流预览编辑,也支持选择本地文件编辑预览
看效果

上代码
<template><div style="margin: 30px"><div class="button-box2"><div><div style="color: red">当前弹框不要修改列名称,如需修改,请去列管理页面修改列。</div></div><div><a-space><!-- <input id="uploadBtn" type="file" @change="loadExcel3" /> --><a-button type="primary" @click="downExcel">导出模板</a-button><a-uploadv-model:file-list="data.fileList"accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":customRequest="customUpload"name="file":multiple="false":showUploadList="false"><a-button :loading="data.clientLoading" type="primary">客户端导入</a-button></a-upload><a-buttontype="primary":loading="data.serverLoading"@click="() => (modal.visible = true)">服务端导入</a-button><!-- <a-dropdown><template v-slot:overlay><a-menu><a-menu-item key="1"><a-uploadv-model:file-list="data.fileList"accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":customRequest="customUpload"name="file":multiple="false":showUploadList="false"><div :loading="data.clientLoading">客户端导入</div></a-upload></a-menu-item><a-menu-item key="2"><div :loading="data.serverLoading" @click="() => (modal.visible = true)">服务端导入</div></a-menu-item></a-menu></template><a-button type="primary">导入预览(如果这样写的话就要把loading放到这里,统一一个变量就好了)<DownOutlined /></a-button></a-dropdown> --></a-space></div></div><div id="luckysheet"></div><div class="button-box"><a-space><a-button @click="cancel"> 取消 </a-button><a-button type="primary" :loading="loading" @click="downloadExcel">确定 </a-button></a-space></div><div class="tips"><div style="color: red" v-if="data.isShowDataType">测序方法请填写:Nanopore pod5,Nanopore fast5,Nanopore fastq,齐碳fastq,PacBio_CCS,PacBio_CLR,华大,illumina,ABI,其他</div><div style="color: red" v-if="data.isShowDataType">类型请填写:细菌,病毒,真菌,16S,宏基因组,动植物,转录组,人源,其他</div><div style="color: red" v-if="data.isShowDataType">日期请按照YYYY-MM-DD格式填写,如:2024-01-01</div></div><a-modal:visible="modal.visible"title="选择文件"width="1020px"@ok="fileOk"@cancel="() => (modal.visible = false)"zIndex="1000"destroyOnClose><FileSelect /></a-modal></div>
</template><script lang="ts" setup>
import { reactive, onMounted, watch } from 'vue';
import * as Api from '/@/serve/api/samples/samples';
import { exportExcel } from '/@/utils/utils/exceljs';
import FileSelect from '/@/components/FileSelector/index.vue';
import { DownOutlined } from '@ant-design/icons-vue';
import LuckyExcel from 'luckyexcel';
import xlsx from 'node-xlsx';import { message } from 'ant-design-vue';
const emit = defineEmits(['cancel', 'batchAddData']);
const props = defineProps({headers: {type: Array,default: () => [],},loading: {type: Boolean,default: false,},
});
const modal = reactive({visible: false,
});
const cancel = () => {luckysheet.exitEditMode(); // 退出编辑模式emit('cancel', '');
};
//服务器导入确定
const fileOk = () => {let selectPath = localStorage.getItem('nowSelector');if (selectPath) {if (selectPath.indexOf(' ') != -1) {message.warning('所选路径不能包含空格');return;}if (selectPath.slice(-5).includes('.xlsx')) {loadExcel2(selectPath);modal.visible = false;} else {message.info('请选择xlsx文件');}}
};
const loadExcel2 = (filePath: string) => {let params = { filePath };Api.xlsxFile(params).then((res: any) => {const blob = new Blob([res], {// 设置返回的文件类型type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',});let file = new window.File([blob], 'fileName.xlsx', {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',});data.serverLoading = true;loadExcel([file]);}).catch(() => {message.error('error');});
};
const loadExcel3 = (evt: any) => {loadExcel(evt.target.files);
};
//自定义上传
const customUpload = (info: any) => {data.clientLoading = true;loadExcel([info.file]);
};const isFunction = (val: Function) => {return Object.prototype.toString.call(val).slice(8, -1) === 'Function';
};const loadExcel = (files: any) => {//通过接口获取文件流,将文件流转为file文件,if (files == null || files.length == 0) {message.info('没有文件等待导入');return;}let name = files[0].name;let suffixArr = name.split('.'),suffix = suffixArr[suffixArr.length - 1];if (suffix != 'xlsx') {message.error('目前只支持导入xlsx文件');return;}LuckyExcel.transformExcelToLucky(files[0], function (exportJson, luckysheetfile) {if (exportJson.sheets == null || exportJson.sheets.length == 0) {message.error('读取excel文件内容失败,目前不支持xls文件!');return;}//销毁原有的表格isFunction(luckysheet?.destroy) && luckysheet.destroy();luckysheet.create({container: 'luckysheet', //luckysheet is the container idlang: 'zh', // 设定表格语言showinfobar: false,data: exportJson.sheets,title: exportJson.info.name,userInfo: exportJson.info.name.creator,});console.log('start loading');data.clientLoading = false;data.serverLoading = false;});
};
const downExcel = () => {let result = xlsx.build([{ name: 'sheet1', data: [props.headers] }]);const ab = Buffer.from(result, 'binary');const blob = new Blob([ab]);const blobUrl = URL.createObjectURL(blob);const a = document.createElement('a');a.href = blobUrl;a.download = '模版.xlsx';a.click();window.URL.revokeObjectURL(blobUrl);// exportExcel(luckysheet.getAllSheets(), '模板');
};
const downloadExcel = () => {// console.log(luckysheet.getAllSheets());// exportExcel(luckysheet.getAllSheets(), '下载');luckysheet.exitEditMode(); // 退出编辑模式let data = luckysheet.getAllSheets()[0].celldata;console.log(data);let result: any[] = [];data.forEach((item: any) => {if (result.length > item.r) {let tempArray = result[item.r];// console.log('item.c', item.c);tempArray[item.c] = item.v.m;} else {let tempArray = [];for (let i = 0; i < props.headers.length; i++) {tempArray.push(undefined);}tempArray[item.c] = item.v.m;result.push(tempArray);}});// let result2 = result.map((item: any) => {// return item.slice(0, props.headers.length);// });// console.log(result2);emit('batchAddData', result);
};const data = reactive({options: {},fileList: [],clientLoading: false,serverLoading: false,isShowDataType: false,
});
// !!! create luckysheet after mounted
onMounted(() => {drawSheet();
});watch(() => props.headers,(n) => {drawSheet();},
);const drawSheet = () => {console.log('111');data.isShowDataType = props.headers.includes('测序方法');let celldata = props.headers.map((item: any, index: number) => {let con = {r: 0,c: index,v: {bl: 1,ct: { fa: 'General', t: 'g' },ht: 0,v: item,m: item,},};return con;});data.options = {container: 'luckysheet',lang: 'zh', // 设定表格语言showinfobar: false,data: [{name: 'Sheet1', //工作表名称color: '', //工作表颜色index: 0, //工作表索引status: 1, //激活状态order: 0, //工作表的下标hide: 0, //是否隐藏row: 36, //行数column: 36, //列数defaultRowHeight: 39, //自定义行高defaultColWidth: 146, //自定义列宽celldata, //初始化使用的单元格数据config: {merge: {}, //合并单元格rowlen: {}, //表格行高columnlen: {}, //表格列宽rowhidden: {}, //隐藏行colhidden: {}, //隐藏列borderInfo: {}, //边框authority: {}, //工作表保护},scrollLeft: 0, //左右滚动条位置scrollTop: 0, //上下滚动条位置luckysheet_select_save: [], //选中的区域calcChain: [], //公式链isPivotTable: false, //是否数据透视表pivotTable: {}, //数据透视表设置filter_select: {}, //筛选范围filter: null, //筛选配置luckysheet_alternateformat_save: [], //交替颜色luckysheet_alternateformat_save_modelCustom: [], //自定义交替颜色luckysheet_conditionformat_save: {}, //条件格式frozen: {}, //冻结行列配置chart: [], //图表配置zoomRatio: 1, // 缩放比例image: [], //图片showGridLines: 1, //是否显示网格线dataVerification: {}, //数据验证配置},// {// name: 'Sheet2',// color: '',// index: 1,// status: 0,// order: 1,// celldata: [// {// r: 0,// c: 0,// v: {// v: '暂时淀粉',// m: '暂时淀粉',// },// },// {// r: 0,// c: 1,// v: {// v: 1,// ct: {// fa: 'General',// t: 'n',// },// m: '1',// },// },// {// r: 1,// c: 0,// v: {// v: 10,// ct: {// fa: 'General',// t: 'n',// },// m: '10',// },// },// {// r: 1,// c: 1,// v: {// v: 11,// ct: {// fa: 'General',// t: 'n',// },// m: '11',// },// },// ],// config: {},// },],};isFunction(luckysheet?.destroy) && luckysheet.destroy();luckysheet.create(data.options);
};
</script><style scoped>
#luckysheet {/* position: relative; */width: 79vw;height: 70vh;
}
.button-box {/* margin: 20px; */margin-top: 20px;display: flex;justify-content: flex-end;
}
.button-box2 {margin: 20px;display: flex;/* justify-content: flex-end; */justify-content: space-between;
}
.tips {margin-top: -30px;
}
:deep(.luckysheet-wa-editor) {overflow: hidden;
}
:deep(.luckysheet-stat-area) {background-color: transparent;
}
</style>
<style>
#chat-assistant-container {display: none;
}
</style>相关文章:
luckyexcel 编辑预览excel文件
luckyexcel 编辑预览excel文件 支持后端传文件流预览编辑,也支持选择本地文件编辑预览 看效果 上代码 <template><div style"margin: 30px"><div class"button-box2"><div><div style"color: red">…...
记录Java使用websocket
实现场景:每在小程序中添加一条数据时,后台将主动推送一个标记给PC端,PC端接收到标记将进行自动播放音频。 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import or…...
(javaweb)分层解耦
目录 一.三层架构 二.分层解耦 三.IOC&DI入门 四.IOC详解 五. DI详解 一.三层架构 复用性差,难以维护和管理 前端发起请求,先会到达controller,再调用service进行逻辑处理,逻辑处理的前提是先拿到数据,到dao…...
2024华为数通HCIP-datacom最新题库(H12-831变题更新⑨)
请注意,华为HCIP-Datacom考试831已变题 请注意,华为HCIP-Datacom考试831已变题 请注意,华为HCIP-Datacom考试831已变题 近期打算考HCIP的朋友注意了,如果你准备去考试,还是用的之前的题库,切记暂缓。 如…...
PCIe学习笔记(21)
读请求的数据返回(Data Return for Read Requests) •针对内存读取请求的单个完成可能提供少于请求的全部数据量,只要对于给定请求的所有完成在组合起来时返回了读取请求中请求的数据量。 ◦不同请求的完成不能合并。 ◦I/O和Configuratio…...
分享Embedding 模型微调的实现
写在前面 \1. 当前比较主流的Embedding开源模型有哪些? 答:1. m3e(Moka Massive Mixed Embedding) 2. BAAI/bge-large-zh-v1.5。更多的开源模型评测榜单可见: https://huggingface.co/spaces/mteb/leaderboard \2. 模型的作用? …...
TED: 1靶场复现【附代码】(权限提升)
机下载地址: Ted: 1 ~ VulnHubTed: 1, made by Avraham Cohen. Download & walkthrough links are available.https://www.vulnhub.com/entry/ted-1,327/ 1. 主机发现端口扫描目录扫描敏感信息获取 1.1. 主机发现 nmap -sn 192.168.59.0/24|grep -B 2 00:0C…...
Python(TensorFlow)衍射光学层卷积算法模拟(英伟达GPU)
🎯要点 🎯衍射光学卷积算法模拟 | 🎯模拟或数字电子计算之前加入一层光学计算 | 🎯前馈卷积神经网络计算成像系统对输入图像进行分类 | 🎯相位掩模利用线性空间不变成像系统执行固有卷积 📜用例 Python非…...
iOS开发进阶(二十二):Xcode* 离线安装 iOS Simulator
文章目录 一、前言二、模拟器安装 一、前言 Xcode 15 安装包的大小相比之前更小,因为除了 macOS 的 Components,其他都需要动态下载安装,否则提示 iOS 17 Simulator Not Installed。 如果不安装对应的运行模拟库,真机和模拟器无法…...
Prostgresql的Timescaledb插件/扩展部署
背景:研发需求,需要把docker部署得postgresql迁移到新的节点并要求再本地部署,提前查看数据库需要那些插件,并进行安装,docker部署的默认有插件。 版本对比:postgresql版本对应某个Timescaledb版本 我得p…...
分布式知识总结(一致性Hash算法)
文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 一致性Hash算法 假如有三台服务器编号node0、node1、node2&…...
图数据库在社交网络分析中的应用
随着社交网络的飞速发展,用户之间的关系变得日益复杂。传统的关系型数据库由于其表结构的限制,难以高效地处理和查询这些复杂的网络数据。图数据库以其独特的图模型结构,能够更好地表示和分析社交网络中的关系,因而在社交网络分析…...
Git基础使用教程
版本控制手册 本文中出现的 [ ] 为根据需求自行修改的变量。 基本命令 git init:将当前目录配置成git仓库,信息记录在隐藏的.git文件夹中。 git config --global user.name [xxx]:设置全局用户名,信息记录在~/.gitconfig文件中。…...
技术速递|Python in Visual Studio Code 2024年8月发布
排版:Alan Wang 我们很高兴地宣布 Visual Studio Code 的 Python 和 Jupyter 扩展将于 2023 年 8 月发布! 此版本包括以下公告: 面向贡献者的 Python 扩展开发容器用于运行带有参数的 Python 文件的调试配置Python 扩展 API 的 Npm 包容错 …...
【话题】重塑未来:AI辅助编程对程序员工作的影响与应对策略
目录 人工智能时代,程序员如何保持核心竞争力? 引言 方向一:AI辅助编程对程序员工作的影响 效率提升 代码质量 潜在风险 方向二:程序员应重点发展的核心能力 复杂系统设计 跨学科知识整合 与AI协作的能力 方向三:人机协…...
在Debian上安装freeswitch
在Debian上安装freeswitch 说明: 首次发表日期:2024-08-12参考文档: https://medium.com/jogikrunal9477/ultimate-guide-to-installing-freeswitch-on-ubuntu-22-04-lts-3745ef6a6bd6https://developer.signalwire.com/freeswitch/FreeSWI…...
论文分享 | Fuzz4All: 基于大语言模型的通用模糊测试
大语言模型是当前最受关注的研究热点,基于其生成和理解能力,对现有领域在提升性能和效果上做更多尝试。分享一篇发表于2024年ICSE会议的论文Fuzz4All,它组合多个大语言模型以非常轻量且黑盒的方式,实现了一种跨语言和软件的通用模…...
VS Code 配置docker 管理员权限终端
问题描述 在容器中需要使用sudo或者su root时候,权限不够,被灵魂提问。 然而,镜像是官方发布的,翻遍了githubissues也没有找到password. 解决 Attach shell 在docker插件中,attach shell 可以直接获得shell。 所…...
使用Linux实现FTP云盘1
关于FTP服务器 FTP(文件传输协议)服务器是在互联网上提供文件存储和访问服务的计算机,它们依照FTP 协议提供服务。 FTP是File Transfer Protocol(文件传输协议)。 程序运行,服务端不断接收客户端指令,服务 端可同时处…...
tombo resquiggle
Re-squiggle 算法 简介 纳米孔读取产生的电流信号水平数据称为squiggle。将这些squiggle信息进行基底呼叫通常与参考序列相比会包含一些错误。Re-squiggle算法定义了从squiggle到参考序列的新分配,即重新squiggle。 Re-squiggle算法是Tombo框架的基础。该算法输入包含原始信…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
