当前位置: 首页 > news >正文

SpreadJS 集成使用案例

SpreadJS 集成案例

介绍:

SpreadJS 基于 HTML5 标准,支持跨平台开发和集成,支持所有主流浏览器,无需预装任何插件或第三方组件,以原生的方式嵌入各类应用,可以与各类后端技术框架相结合。SpreadJS 以 纯前端、跨平台的能力,让应用系统轻松获得与原生
Excel 一致的交互体验。 前端集成:

实现效果:

在这里插入图片描述

代码实现:

1) : 创建项目

Cmd 依次执行命令:

C:\Users\zhaoQiang\Desktop>vue create spreadjs

C:\Users\zhaoQiang\Desktop>cd spreadjs

安装插件:

npm install 以下插件: 或根据使用需求安装所需要的插件:

在这里插入图片描述

Main.js引用:

在这里插入图片描述

App.vue编写界面:

在这里插入图片描述

2) Ribbon工具栏添加测试菜单和事件

在这里插入图片描述

3) 监听Excel单元格变化:

// SpreadJs 初始化完毕事件中获取WorkBook对象。
this.designer = value;
this.spread = this.designer.getWorkbook();

监听单元格选中事件和单元格编辑结束事件:

在这里插入图片描述

4) JSON数据转换:

本地JSON数据转换为界面上表格:

在这里插入图片描述

表格界面获取JSON数据:

在这里插入图片描述

代码地址

https://gitee.com/zhaoqhero/spreadjs.

官方文档

官网地址:https://www.grapecity.com.cn/developer/spreadjs

API文档:https://demo.grapecity.com.cn/spreadjs/help/api/modules/GC.Data

官方案例:https://demo.grapecity.com.cn/spreadjs/SpreadJSTutorial/quickstart/quickstart-vue

附图

在这里插入图片描述

主要代码

Package.json

{"name": "spreadjs","version": "0.1.0","private": true,"scripts": {"serve": "vue-cli-service serve","build": "vue-cli-service build","lint": "vue-cli-service lint"},"dependencies": {"@grapecity/spread-excelio": "^17.0.0","@grapecity/spread-sheets": "^17.0.0","@grapecity/spread-sheets-barcode": "^17.0.0","@grapecity/spread-sheets-charts": "^17.0.0","@grapecity/spread-sheets-designer": "^17.0.0","@grapecity/spread-sheets-designer-resources-cn": "^17.0.0","@grapecity/spread-sheets-designer-resources-en": "^17.0.0","@grapecity/spread-sheets-designer-vue": "^17.0.0","@grapecity/spread-sheets-io": "^17.0.0","@grapecity/spread-sheets-languagepackages": "^17.0.0","@grapecity/spread-sheets-pdf": "^17.0.0","@grapecity/spread-sheets-pivot-addon": "^17.0.0","@grapecity/spread-sheets-print": "^17.0.0","@grapecity/spread-sheets-shapes": "^17.0.0","@grapecity/spread-sheets-tablesheet": "^17.0.0","@grapecity/spread-sheets-vue": "^17.0.0","core-js": "^3.8.3","vue": "^3.2.13"},"devDependencies": {"@babel/core": "^7.12.16","@babel/eslint-parser": "^7.12.16","@vue/cli-plugin-babel": "~5.0.0","@vue/cli-plugin-eslint": "~5.0.0","@vue/cli-service": "~5.0.0","eslint": "^7.32.0","eslint-plugin-vue": "^8.0.3"},"eslintConfig": {"root": true,"env": {"node": true},"extends": ["plugin:vue/vue3-essential","eslint:recommended"],"parserOptions": {"parser": "@babel/eslint-parser"},"rules": {}},"browserslist": ["> 1%","last 2 versions","not dead","not ie 11"]
}

Main.js

import {createApp} from 'vue'
import App from './App.vue'
import Designer from "@grapecity/spread-sheets-designer-vue"let app = createApp(App);
app.component("gc-spread-sheets-designer", Designer);
app.mount('#app');

App.vue


<template><div id="gc-designer-container" style="display: flex;flex-direction: row"><div><gc-spread-sheets-designerid="designer":styleInfo="styleInfo":config="config":spreadOptions="spreadOptions"@designerInitialized="designerInitialized"></gc-spread-sheets-designer></div><div><div class="textarea-container">{{ changingText }}</div><div class="textarea-container">{{ currentTxt }}</div><button style="height: 40px;margin-left:20px;width: 100px" @click="fromJson">json数据添加</button><button style="height: 40px;margin-left:20px;width: 100px" @click="toJson">json数据获取</button><div class="textarea-container" style="height: 400px">{{ sheetJsonStr }}</div></div></div>
</template><script>import '@grapecity/spread-sheets/styles/gc.spread.sheets.excel2013white.css';
import "@grapecity/spread-sheets-designer/styles/gc.spread.sheets.designer.min.css";
import * as GC from "@grapecity/spread-sheets";
import "@grapecity/spread-sheets-print";
import "@grapecity/spread-sheets-shapes";
import "@grapecity/spread-sheets-pivot-addon";
import "@grapecity/spread-sheets-tablesheet";
import "@grapecity/spread-sheets-designer-resources-cn";
import "@grapecity/spread-sheets-designer";import demoJson from './demo.json';export default {name: "App",data: function () {var config = GC.Spread.Sheets.Designer.DefaultConfig;//ribbon添加测试菜单:config.ribbon.push({"id": "test","text": "测试菜单","buttonGroups": [{"label": "测试1","thumbnailClass": "button_class","commandGroup": {"children": [{"direction": "vertical","commands": ["save1","delete1",]}]}}, {"label": "测试2","commandGroup": {"children": []}}],// 其他项目内容"contextMenu": ["designer.insertSignature",],});//声明菜单事件config.commandMap = {save1: {title: "保存服务器",text: "",iconClass: "save1",bigButton: "true",commandName: "save1",execute: async (context, propertyName, fontItalicChecked) => {// 自定义操作符alert(context, propertyName, fontItalicChecked);}},delete1: {title: "删除数据",text: "",iconClass: "delete1",bigButton: "true",commandName: "delete1",execute: async (context, propertyName, fontItalicChecked) => {// 自定义操作符alert(context, propertyName, fontItalicChecked);}},"designer.insertSignature": {text: "Insert Signature",commandName: "designer.insertSignature",visibleContext: "ClickRowHeader",execute:// execute_InsertSignature,后面是一个简单的演示代码片段() => {console.log("Insert Signature");}}}return {styleInfo: {height: "80vh", width: "50vw"},config: config,spreadOptions: {//表单工具栏的  基本配置sheetCount: 2,  //sheet 表格数量allowUserZoom: false,  //是否允许缩放tabEditable: false,  //tab是否允许编辑newTabVisible: false, //新tab是否可见showScrollTip: false,showVerticalScrollbar: false,showHorizontalScrollbar: false,allowUserResize: false,autoFitType: false,allowUserDragDrop: false,  //允许用户拖拽单元格allowUserDragMerge: false, //允许用户合并单元格},changingText: '',currentTxt: '',sheetJsonStr: '',designer: null,spread: null,};},methods: {designerInitialized(value) {this.designer = value;this.spread = this.designer.getWorkbook();this.spread.suspendPaint();let spreadNS = GC.Spread.Sheets;let thisObj = this;this.spread.bind(spreadNS.Events.SelectionChanging, function (e, args) {let selection = args.newSelections.pop();let sheetArea = args.sheetArea === 0 ? 'sheetCorner' : args.sheetArea === 1 ?'columnHeader' : args.sheetArea === 2 ? 'rowHeader' : 'viewPort';thisObj.changingText =`事件名称:${GC.Spread.Sheets.Events.SelectionChanging}。` +`表单:${args.sheetName}。` +`表格区域:${sheetArea}。` +`行:${selection.row}。` +`列:${selection.col}。` +`行数:${selection.rowCount}。` +`列数:${selection.colCount}。`;});this.spread.bind(spreadNS.Events.EditEnded, function (e, args) {thisObj.currentTxt = `事件名称:${GC.Spread.Sheets.Events.EditEnded}。` +`表单:${args.sheetName}。` +`行:${args.row}。` +`列:${args.col}。` +`文本:${args.editingText}。`;console.log(this.currentTxt)});this.spread.resumePaint();// spread.bind(spreadNS.Events.ActiveSheetChanged, function (e, args) {//   let eventLog =//       'SpreadEvent: ' + GC.Spread.Sheets.Events.ActiveSheetChanged + ' event called' + '\n' +//       'oldSheetName: ' + args.oldSheet.name() + '\n' +//       'newSheetName: ' + args.newSheet.name();//   console.log(eventLog)// });// spread.bind(spreadNS.Events.CellClick, function (e, args) {//   let sheetArea = args.sheetArea === 0 ? 'sheetCorner' : args.sheetArea === 1 ? 'columnHeader' : args.sheetArea === 2 ? 'rowHeader' : 'viewPort';//   let eventLog =//       'SpreadEvent: ' + GC.Spread.Sheets.Events.CellClick + ' event called' + '\n' +//       'sheetArea: ' + sheetArea + '\n' +//       'row: ' + args.row + '\n' +//       'col: ' + args.col;//   console.log(eventLog)// });// spread.bind(spreadNS.Events.SelectionChanging, function (e, args) {//   let selection = args.newSelections.pop();//   let sheetArea = args.sheetArea === 0 ? 'sheetCorner' : args.sheetArea === 1 ? 'columnHeader' : args.sheetArea === 2 ? 'rowHeader' : 'viewPort';//   let eventLog =//       'SpreadEvent: ' + GC.Spread.Sheets.Events.SelectionChanging + ' event called' + '\n' +//       'sheetArea: ' + sheetArea + '\n' +//       'row: ' + selection.row + '\n' +//       'column: ' + selection.col + '\n' +//       'rowCount: ' + selection.rowCount + '\n' +//       'colCount: ' + selection.colCount;////   console.log(eventLog)// });// spread.bind(spreadNS.Events.SelectionChanged, function (e, args) {//   let selection = args.newSelections.pop();//   if (selection.rowCount > 1 && selection.colCount > 1) {//     let sheetArea = args.sheetArea === 0 ? 'sheetCorner' : args.sheetArea === 1 ? 'columnHeader' : args.sheetArea === 2 ? 'rowHeader' : 'viewPort';//     let eventLog =//         'SpreadEvent: ' + GC.Spread.Sheets.Events.SelectionChanged + ' event called' + '\n' +//         'sheetArea: ' + sheetArea + '\n' +//         'row: ' + selection.row + '\n' +//         'column: ' + selection.col + '\n' +//         'rowCount: ' + selection.rowCount + '\n' +//         'colCount: ' + selection.colCount;//     console.log(eventLog)//   }// });// spread.bind(spreadNS.Events.EditStarting, function (e, args) {//   let eventLog =//       'SpreadEvent: ' + GC.Spread.Sheets.Events.EditStarting + ' event called' + '\n' +//       'row: ' + args.row + '\n' +//       'column: ' + args.col;////   console.log(eventLog)// });},toJson() {var serializationOption = {ignoreFormula: true, //忽略?ignoreStyle: true,   //忽略样式rowHeadersAsFrozenColumns: true,columnHeadersAsFrozenRows: true,};this.sheetJsonStr = JSON.stringify(this.designer.getWorkbook().toJSON(serializationOption));console.log(this.sheetJsonStr)},fromJson() {let jsonOptions = {ignoreFormula: false,ignoreStyle: false,frozenColumnsAsRowHeaders: false,frozenRowsAsColumnHeaders: false,doNotRecalculateAfterLoad: false,};//FromJsonlet spread2 = this.designer.getWorkbook();spread2.fromJSON(JSON.parse(JSON.stringify(demoJson)), jsonOptions);},},
}
</script><style>.textarea-container {margin: 20px;width: calc(100vw - 60vw);height: 50px;border: 1px solid #000000;color: black;overflow: auto;
}.delete1 {width: 100px !important;height: 20px;background: red;
}.save1 {width: 100px !important;height: 20px;background: blue;
}
</style>

相关文章:

SpreadJS 集成使用案例

SpreadJS 集成案例 介绍&#xff1a; SpreadJS 基于 HTML5 标准&#xff0c;支持跨平台开发和集成&#xff0c;支持所有主流浏览器&#xff0c;无需预装任何插件或第三方组件&#xff0c;以原生的方式嵌入各类应用&#xff0c;可以与各类后端技术框架相结合。SpreadJS 以 纯前…...

单挑力扣(LeetCode)SQL题:534. 游戏玩法分析 III(难度:中等)

题目&#xff1a;534. 游戏玩法分析 III &#xff08;通过次数23,825 | 提交次数34,947&#xff0c;通过率68.17%&#xff09; Table:Activity----------------------- | Column Name | Type | ----------------------- | player_id | int | | device_id | int…...

【OpenCV】告别人工目检:深度学习技术引领工业品缺陷检测新时代

目录 前言 机器视觉 缺陷检测 工业上常见缺陷检测方法 内容简介 作者简介 目录 读者对象 如何阅读本书 获取方式 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站 机器视觉…...

VR全景图片制作时有哪些技巧,VR全景图片能带来哪些好处

引言&#xff1a; VR全景图片是通过虚拟现实技术制作出的具有沉浸感的图片&#xff0c;能够提供给用户一种身临其境的感觉。在宣传方面&#xff0c;它有着独特的优势和潜力&#xff0c;能够帮助吸引更多的潜在客户&#xff0c;那么VR全景图片制作时有哪些技巧&#xff0c;VR全…...

【VUE】Flask+vue-element-admin前后端分离项目发布到linux服务器操作指南

目录 一、Flask后端发布环境搭建1.1 python环境第一步&#xff1a;安装python环境第二步&#xff1a;配置python虚拟环境 1.2 uwsgi环境1.3 nginx配置1.4 测试 二、VUE前端发布环境搭建2.1 配置修改2.2 打包上传服务器2.3 nginx配置2.3 测试 三、联合调试 一、Flask后端发布环境…...

django的gunicorn的异步任务执行

gunicorn 本身是一个WSGI HTTP服务器&#xff0c;用于运行Python的web应用&#xff0c;如Django项目。它并不直接提供执行异步任务的功能。异步任务通常是指那些你想要在web请求之外执行的后台任务&#xff0c;如发送电子邮件、处理长时间运行的计算或与外部API交互等。 在Dja…...

KEPServerEX 6 之【外篇-2】PTC-ThingWorx服务端软件安装 PostgreSQL本地安装

---------------------------安装相关信息--------------- 默认用户角色 : Postgres 密码:root@123 localhost 用户角色 :postgres_tw 密码 root@123 端口 5432 ------------------------------------------------------------------ 1. WIN 安装 Postgre…...

websocket 介绍

目录 1&#xff0c;前端如何实现即时通讯短轮询长轮询 2&#xff0c;websocket2.1&#xff0c;握手2.2&#xff0c;握手过程举例2.3&#xff0c;socket.io 3&#xff0c;websocket 对比 http 的优势 1&#xff0c;前端如何实现即时通讯 在 websocket 协议出现之前&#xff0c;…...

【IoT网络层】STM32 + ESP8266 +MQTT + 阿里云物联网平台 |开源,附资料|

目标&#xff1a;实现STM32连接阿里云物联网平台发送数据同时接收数据&#xff0c;IOT studio界面显示数据。具体来说&#xff1a;使用ESP8266 ESP-01来连接网络&#xff0c;获取设备数据发送到阿里云物联网平台并显示且oled显示屏当前的设备数据&#xff0c;通过IOT studio界面…...

数据分析工具 Top 8

你能想象一个没有工具箱的水管工吗? 没有,对吧? 数据从业者也是如此。如果没有他们的数据分析工具&#xff0c;数据从业者就无法分析数据、可视化数据、从数据中提取价值&#xff0c;也无法做数据从业者在日常工作中做的许多很酷的事情。 根据你最感兴趣的数据科学职业——数…...

AI 换脸的新时代:没有显卡也可以使用的AI换脸工具

大家好&#xff01;今天&#xff0c;我要为大家介绍一个即使没有显卡&#xff0c;也能体验AI换脸的工具&#xff01;是的&#xff0c;您没听错&#xff0c;无论您的电脑配置如何&#xff0c;只要运行在Windows 10或Windows 11上&#xff0c;都可以轻松使用这一神奇工具。这就是…...

3.Python中的循环结构

Python中的循环结构 一、回顾分支练习题 1、判断是否为一个合法三角形 需求:输入三角形的3边,如果两边的长度大于第三条边,则代表是一个合法三角形 # 1、提示用户输入三角形的三边长度 a = int(input(请输入第一条边的长度:)) b = int(input(请输入第二条边的长度:)) …...

机器学习之BP神经网络精讲(Backpropagation Neural Network(附案例代码))

概念 BP神经网络(Backpropagation Neural Network)是一种常见的人工神经网络,它通过反向传播算法来训练网络,调整连接权重以最小化预测输出与实际输出之间的误差。这种网络结构包含输入层、隐藏层和输出层,使用梯度下降算法来优化权重。 结构: BP神经网络(Backpropag…...

安全生产人员定位系统助企业实现智能化管理,提高生产安全性和效率

安全生产人员定位系统是基于物联网技术的系统&#xff0c;通过集成各种传感器和通信技术&#xff0c;实时监测员工的位置和活动状态。该系统可以帮助企业管理者了解员工的工作状态&#xff0c;及时发现潜在的安全隐患&#xff0c;从而采取相应的措施&#xff0c;保障员工的安全…...

动态规划 多源路径 字典树 LeetCode2977:转换字符串的最小成本

涉及知识点 动态规划 多源最短路径 字典树 题目 给你两个下标从 0 开始的字符串 source 和 target &#xff0c;它们的长度均为 n 并且由 小写 英文字母组成。 另给你两个下标从 0 开始的字符串数组 original 和 changed &#xff0c;以及一个整数数组 cost &#xff0c;其中…...

Hadoop集群找不到native-hadoop

1.问题描述 hive 运行中的问题&#xff0c;需要把把native复制进去 /usr/lib 2023-02-15 19:59:42,165 WARN scheduler.TaskSetManager: Lost task 11.0 in stage 1.0 (TID 3, common4, executor 2): java.lang.RuntimeException: Hive Runtime Error while closing operators…...

解决阿里云远程连接yum无法安装问题(Ubuntu 22.04)

解决阿里云远程连接yum无法安装问题&#xff08;Ubuntu 22.04&#xff09; 第一步 进入阿里云远程连接后&#xff0c;尝试安装宝塔面包第二步&#xff1a;尝试更新软件包等一些列操作第三步&#xff1a;完成上述操作之后&#xff0c;尝试安装yum第四步&#xff1a;尝试更换清华…...

springboot 查询

ServiceImpl中 getBaseMapper()的使用 public IPage<ProductPageVO> getProductPage(Integer regionOrCityCode, Integer brandId, LocalDate usedDate, Page<ProductPageVO> page) {return getBaseMapper().getProductPage(regionOrCityCode, brandId, usedDate, …...

【分布式链路追踪技术】sleuth+zipkin

目录 1.概述 2.搭建演示工程 3.sleuth 4.zipkin 5.插拔式存储 5.1.存储到MySQL中 5.2.用MQ来流量削峰 6.联系作者 1.概述 当采用分布式架构后&#xff0c;一次请求会在多个服务之间流转&#xff0c;组成单次调用链的服务往往都分散在不同的服务器上。这就会带来一个问…...

Windows 源码编译 MariaDB

环境 Win11, vs2022, git, cmake, Bison from GnuWin32, perl, Gnu Diff. 默认都安装好。 perl 看之前博客教程。perl Bison from GnuWin32 默认安装到 C:\GnuWin32 Add C:\GnuWin32\bin to your system PATH after installation. 下载mariadb源码 地址&#xff1a;MariaD…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...