在线excel编辑(luckysheet)

news2024/12/27 1:03:44

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

 可以下载项目使用npm安装运行,也可以用cdn

加载excel文件(使用luckyexcel):

1、从本地上传加载(直接在页面中加载luckyexcel.umd.js)

2、从服务器获取(使用node + luckyexcel在后端加载文件)

保存excel文件(使用exceljs)

1、保存到本地(页面中加载exceljs.js,具体方法参考下面文章)

2、保存到服务器

手动:页面添加个保存按钮,然后使用luckysheet.getAllSheets()获取全部数据传到后端。

自动:需要同时配置allowUpdate,loadUrl,updateUrl才可以,此模式不能加载本地文件

        updateUrl使用的websocket协议,提交的数据默认是经过pako压缩的,后端需要解压。

pako解压,exceljs生成excel方法可以参考下面文章:

        Luckysheet 实现excel多人在线协同编辑-CSDN博客

        表格操作 | Luckysheet文档 

         src/controllers/server.js · mengshukeji/Luckysheet - Gitee.com

<!DOCTYPE HTML>
<html>
<head>
    <link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/plugins/css/pluginsCss.css' />
    <link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/plugins/plugins.css' />
    <link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/css/luckysheet.css' />
    <link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/assets/iconfont/iconfont.css' />
    <script src="https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/plugins/js/plugin.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/luckysheet.umd.js"></script>


	<script src="https://cdn.jsdelivr.net/npm/luckyexcel/dist/luckyexcel.umd.js"></script>
	<script src="https://cdn.jsdelivr.net/npm/exceljs/dist/exceljs.js"></script>
	<script src="./exportExcel.js"></script>

</head>
<body>

<input type="file" id="myfile"/>
<button onclick="downloadCurrent()">提交</button>

<div id="luckysheetDiv" style="margin:0px;padding:0px;position:absolute;width:100%;height:95%;left: 0px;top: 50px;"></div>



<script>
//从本地加载
var input = document.querySelector('input');
input.addEventListener('change', importExcel);
function importExcel(event) {

    var file = event.target.files[0];
    // 先确保获取到了xlsx文件file,再使用全局方法window.LuckyExcel转化
    LuckyExcel.transformExcelToLucky(
        file, 
        function(exportJson, luckysheetfile){
            // 获得转化后的表格数据后,使用luckysheet初始化,或者更新已有的luckysheet工作簿
            // 注:luckysheet需要引入依赖包和初始化表格容器才可以使用
            luckysheet.create({
                container: 'luckysheetDiv', // luckysheet is the container id
                data:exportJson.sheets,
                title:exportJson.info.name,
                userInfo:exportJson.info.name.creator,
				lang: 'zh',
				hook:{
					cellUpdated: function (r, c, oldValue, newValue, isRefresh) {
						//监听表格数据变化(可实时提交数据到后端),粘贴的数据和公式数据变化不会触发这个事件
						console.info('cellUpdated',r,c,oldValue, newValue, isRefresh)
					}
				}
            });
			
        },
        function(err){
            logger.error('Import failed. Is your fail a valid xlsx?');
        }
    );
}

//保存数据
function downloadCurrent(){
	exportExcel(luckysheet.getAllSheets(), "abc.xlsx")
	return "";
	$.ajax({
		url: 'http://127.0.0.1/excel_s.php', //接口地址,如果要在后端生成excel文件最好用exceljs
		type: 'POST',
		headers: { 'Content-Type': 'application/json;' },
		data: JSON.stringify({
			exceldatas: JSON.stringify(luckysheet.getAllSheets()),
		}),
		success: function (response) {
			alert("保存成功!")
		}
	})
}

//从服务器获取数据(allowUpdate,loadUrl,updateUrl三个必需都配置才能自动更新)
luckysheet.create({
	container: 'luckysheetDiv',
	lang: 'zh',
	allowUpdate: true,
	loadUrl:'http://127.0.0.1:3000',
	updateUrl: 'ws://localhost:8273',
});

</script>

</body>
</html>

//服务器加载excel文件

const fs = require("fs");
const LuckyExcel = require('luckyexcel');

const express = require('express');
const cors = require('cors');
const app = express();

const hostname = '127.0.0.1';
const port = 3000;

app.use(cors());

app.listen(port, hostname, () => {
	console.log(`Server running at http://${hostname}:${port}/`);
});


//注意luckysheet使用的是post请求
app.post('/', (req, res) => {
	var data = fs.readFileSync("./123.xlsx");
	LuckyExcel.transformExcelToLucky(data, function(exportJson, luckysheetfile){
		res.set('Content-Type', 'text/html; charset=UTF-8'); //返回类型需要text/html
		res.json(exportJson.sheets);
	});
});

//服务器端保存

const WebSocket = require('ws');
const pako = require("pako");

// 创建 WebSocket 服务器,监听 8080 端口
const wss = new WebSocket.Server({ port: 8273 });

wss.on('connection', function connection(ws) {
    console.log('新客户端连接');

    // 当收到消息时触发
    ws.on('message', function incoming(message) {
        console.log('收到来自客户端的消息:');
        
        // 回复客户端
        //unzip(message)
        //保存数据...

        //返回格式参考 https://dream-num.github.io/LuckysheetDocs/zh/guide/operate.html#%E5%90%8E%E7%AB%AF%E8%BF%94%E5%9B%9E%E6%A0%BC%E5%BC%8F
        ws.send(`"服器接收到消息"`);
    });

    // 当连接关闭时触发
    ws.on('close', function close() {
        console.log('客户端断开连接');
    });
});

//解压数据
unzip = (str) => {
	let chartData = str
					.toString()
					.split("")
					.map((i) => i.charCodeAt(0));

	let binData = new Uint8Array(chartData);

	let data = pako.inflate(binData);

	return decodeURIComponent(
		String.fromCharCode.apply(null, new Uint16Array(data))
	);
}

console.log('WebSocket 服务器正在监听端口 8273');

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2266105.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

互联网视频云平台EasyDSS无人机推流直播技术如何助力野生动植物保护工作?

在当今社会&#xff0c;随着科技的飞速发展&#xff0c;无人机技术已经广泛应用于各个领域&#xff0c;为我们的生活带来了诸多便利。而在动植物保护工作中&#xff0c;无人机的应用更是为这一领域注入了新的活力。EasyDSS&#xff0c;作为一款集视频处理、分发、存储于一体的综…

垃圾分割数据集labelme格式659张1类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;659 标注数量(json文件个数)&#xff1a;659 标注类别数&#xff1a;1 标注类别名称:["garbage"] 每个类别标注的框数&#…

记我的Springboot2.6.4从集成swagger到springdoc的坎坷路~

项目背景 主要依赖及jdk信息&#xff1a; Springboot&#xff1a;2.6.4 Jdk: 1.8 最近新搭建了一套管理系统&#xff0c;前端部分没有公司的前端团队&#xff0c;自己在github上找了一个star较多使用相对也简单的框架。在这个管理系统搭建好上线之后&#xff0c;给组内的小伙…

NNDL 作业11 LSTM

习题6-4 推导LSTM网络中参数的梯度&#xff0c; 并分析其避免梯度消失的效果 先来推个实例&#xff1a; 看式子中间&#xff0c;上半部分并未有连乘项&#xff0c;而下半部分有到的连乘项&#xff0c;从这可以看出&#xff0c;LSTM能缓解梯度消失&#xff0c;梯度爆炸只是不易…

uniapp使用live-pusher实现模拟人脸识别效果

需求&#xff1a; 1、前端实现模拟用户人脸识别&#xff0c;识别成功后抓取视频流或认证的一张静态图给服务端。 2、服务端调用第三方活体认证接口&#xff0c;验证前端传递的人脸是否存在&#xff0c;把认证结果反馈给前端。 3、前端根据服务端返回的状态&#xff0c;显示在…

MySQL中Performance Schema库的详解(下)

昨天说了关于SQL语句相关的&#xff0c;今天来说说性能相关的&#xff0c;如果没有看过上篇请点传送门https://blog.csdn.net/2301_80479959/article/details/144693574?fromshareblogdetail&sharetypeblogdetail&sharerId144693574&sharereferPC&sharesource…

YOLO11全解析:从原理到实战,全流程体验下一代目标检测

前言 一、模型介绍 二、网络结构 1.主干网络&#xff08;Backbone&#xff09; 2.颈部网络&#xff08;Neck&#xff09; 3.头部网络&#xff08;Head&#xff09; 三、算法改进 1.增强的特征提取 2.优化的效率和速度 3.更高的准确性与更少的参数 4.环境适应性强 5.…

【Qt】了解和HelloWorld

目录 0.用户交互界面风格 Windows下GUI开发方案&#xff1f; 1.Qt简介 1.1 版本Qt5. 1.2搭建Qt开发环境 需要安装3个工具 安装过程 熟悉QtSDK重要工具 2.使用Qt Creator创建项目 2.1代码解释 2.2helloworld 1.图形化方式 2.代码方式 0.用户交互界面风格 1.TUI&…

原点安全再次入选信通院 2024 大数据“星河”案例

近日&#xff0c;中国信息通信研究院和中国通信标准化协会大数据技术标准推进委员会&#xff08;CCSA TC601&#xff09;共同组织开展的 2024 大数据“星河&#xff08;Galaxy&#xff09;”案例征集活动结果正式公布。由工银瑞信基金管理有限公司、北京原点数安科技有限公司联…

【MySQL初阶】--- 数据类型

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; MySQL &#x1f3e0; 数据类型分类 MySQL是一套整体的对外数据存取方案,既然要存取数据,而数据有不同的类型,因此MySQL也存在不同的数据类型,有不同的用…

使用VsCode编译调试Neo4j源码

文章目录 使用VsCode编译调试Neo4j源码1 简介2 步骤1 下载源码2 依赖3 构建Neo4j4 运行5 安装VsCode扩展6 **调试** 使用VsCode编译调试Neo4j源码 1 简介 Neo4j作为领先的图数据库&#xff0c;在存储、查询上都非常值得分析学习。通过调试、日志等方法跟踪代码工作流有助于理…

从零开始构建美颜SDK:直播美颜插件的开发实践指南

很多人好奇的一个问题&#xff0c;直播APP中主播们的美颜功能是如何实现的&#xff0c;今天&#xff0c;我们将以构建一款美颜SDK为主线&#xff0c;从技术架构、功能设计到开发实践&#xff0c;为读者提供一个全面的指导。 一、美颜SDK的核心技术 要构建一款优秀的美颜SDK&a…

计算机网络习题( 第3章 物理层 第4章 数据链路层 )

第3章 物理层 一、单选题 1、下列选项中&#xff0c;不属于物理层接口规范定义范畴的是&#xff08; &#xff09;。 A、 接口形状 B、 引脚功能 C、 传输媒体 D、 信号电平 正确答案&#xff1a; C 2、在物理层接口特性中&#xff0c;用于描述完成每种功能的事件发…

云手机群控能用来做什么?

随着云手机的发展&#xff0c;云手机群控技术逐渐从小众的游戏多开工具&#xff0c;发展为涵盖多个领域的智能操作平台。不论是手游搬砖、短视频运营&#xff0c;还是账号养成等场景&#xff0c;云手机群控都展现出了强大的应用潜力。本文将为大家详细解析云手机群控的应用场景…

深度学习实验十七 优化算法比较

目录 一、优化算法的实验设定 1.1 2D可视化实验&#xff08;被优化函数为&#xff09; 1.2 简单拟合实验 二、学习率调整 2.1 AdaGrad算法 2.2 RMSprop算法 三、梯度修正估计 3.1 动量法 3.2 Adam算法 四、被优化函数变为的2D可视化 五、不同优化器的3D可视化对比 …

汽车IVI中控开发入门及进阶(43):NanoVG

NanoVG:基于OpenGL的轻量级抗锯齿2D矢量绘图库 NanoVG是一个跨平台、基于OpenGL的矢量图形渲染库。它非常轻量级,用C语言实现,代码不到5000行,非常精简地实现了一套HTML5 Canvas API,做为一个实用而有趣的工具集,用来构建可伸缩的用户界面和可视化效果。NanoVG-Library为…

【生信圆桌x教程系列】如何安装 seurat V4版本R包

生物信息分析,上云更省心; 欢迎访问 www.tebteb.cc 了解 【生信云】 一.介绍 Seurat 是一个广泛使用的 R 包&#xff0c;专门用于单细胞基因表达数据的分析与可视化。它主要被生物信息学和生物统计学领域的研究者用来处理、分析和理解单细胞 RNA 测序&#xff08;scRNA-seq&am…

阿里云技术公开课直播预告:基于阿里云 Elasticsearch 构建 AI 搜索和可观测 Chatbot

在当今数据驱动的商业环境中&#xff0c;企业面临着前所未有的挑战与机遇。如何高效搜索、分析和观测数据&#xff0c;已成为企业成功的关键。Elasticsearch 企业版作为 Elastic Stack 的商业发行版&#xff0c;提供了一整套高效的搜索、分析和观测解决方案。 为此&#xff0c…

android 登录界面编写

1、登录页面实现内容 1.实现使用两个EditText输入框输入用户名和密码。 2.使用CheckBox控件记住密码功能。 3.登录时候&#xff0c;验证用户名和密码是否为空。 4.当前CheckBox控件记住密码勾上时&#xff0c;使用SharedPreferences存储用户名和密码。 5.登录时候使用Prog…

多目标应用(一):多目标麋鹿优化算法(MOEHO)求解10个工程应用,提供完整MATLAB代码

一、麋鹿优化算法 麋鹿优化算法&#xff08;Elephant Herding Optimization&#xff0c;EHO&#xff09;是2024年提出的一种启发式优化算法&#xff0c;该算法的灵感来源于麋鹿群的繁殖过程&#xff0c;包括发情期和产犊期。在发情期&#xff0c;麋鹿群根据公麋鹿之间的争斗分…