找回密码
 立即注册

QQ登录

只需一步,快速开始

Web123.0

注册会员

4

主题

14

帖子

50

积分

注册会员

积分
50
最新发帖
Web123.0
注册会员   /  发表于:2022-4-26 16:55  /   查看:3461  /  回复:11
本帖最后由 Web123.0 于 2022-5-6 11:51 编辑

技术栈:
- vue v2.x
- SpreadJS v15.0.4
- GcExcel v4.2.6

使用场景:
用户拖拽维度字段或者指标字段,移动至excel单元格上,拖拽结束后将拖拽字段赋值给当前鼠标悬停单元格中。
可保存,可预览,可编辑,可新建。

实现思路:
1、子组件:单元格默认绑定Text类型,且设置processMouseEnter方法,在方法中获取单元格信息(row、col),并通过$emit()方法将单元格信息返回给父组件。
2、父组件:拖拽字段时,根据子组件返回的单元格信息,定位目标单元格,结束拖拽时,对目标单元格进行赋值。
3、保存时,通过toJSON()方法获取所有配置信息(spreadJSON),并且保存。
4、编辑时,根据服务端返回的配置信息(spreadJSON),使用Workbook.fromJSON(spreadJSON)方法加载模板数据,并且展示模板内容。
5、新建时,使用Workbook.refresh()方法刷新(重置)excel内容。

问题:
1、编辑时,使用Workbook.fromJSON(spreadJSON)方法加载模板数据后,processMouseEnter方法失效。再次尝试拖拽字段修改模板时,无法获取目标单元格信息,导致不能将拖拽字段赋值到excel的单元格中。
2、新建时,使用Workbook.refresh()方法刷新后,processMouseEnter方法失效,影响同上。

有尝试在fromJSON方法和refresh方法执行之后,重新设置processMouseEnter,仍然无效。

子组件代码如下:
  1. <script>
  2. import '@grapecity/spread-sheets/styles/gc.spread.sheets.excel2013white.css';
  3. import '@grapecity/spread-sheets-designer/styles/gc.spread.sheets.designer.min.css';
  4. import '@grapecity/spread-sheets-designer-resources-cn';
  5. import '@grapecity/spread-sheets-designer-vue';
  6. import '@grapecity/spread-sheets-resources-zh';
  7. import * as GC from '@grapecity/spread-sheets';
  8. import { sheetLicenseKey, designerLicenseKey } from '@/utils/spreadJSLicenseKey';

  9. GC.Spread.Common.CultureManager.culture('zh-cn');
  10. GC.Spread.Sheets.LicenseKey = sheetLicenseKey;
  11. GC.Spread.Sheets.Designer.LicenseKey = designerLicenseKey;

  12. const TipCellType = function () {};

  13. export default {
  14. <p style="line-height: 30px; text-indent: 2em;">name: 'SpreadJSDesigner',
  15.        props: {
  16.            config: {
  17.            type: Object,
  18.            require: false,
  19.            },
  20.        },
  21.        data() {
  22.            return {
  23.                styleInfo: { width: '100%', height: '100%' },
  24.                sheetClazz: null,
  25.                spreadClazz: null,
  26.            };
  27.        },
  28.        created() {
  29.            this.initBindEvents();
  30.        },
  31.        methods: {
  32.        designerInitialized(designer) {
  33.        const vm = this;
  34.        const spread = designer.getWorkbook();
  35.        const { Events, SheetArea, ValueType, CellTypes } = GC.Spread.Sheets;
  36.        // 点击按钮类事件绑定
  37.        spread.bind(Events.ButtonClicked, function (e, args) {
  38.        ...
  39.        });
  40.        // 列表类事件绑定
  41.        spread.bind(Events.SelectionChanged, () => {
  42.        ...
  43.        });
  44.        // 绑定单元格点击事件回调
  45.        spread.bind(Events.CellClick, function (e, args) {
  46.        ...
  47.        });
  48.              this.spreadClazz = spread;
  49.              this.sheetClazz = spread.getActiveSheet();
  50.              this.sheetClazz.AutoGenerateColumns = false;
  51.              let defaultStyle = this.sheetClazz.getDefaultStyle();
  52.             defaultStyle.cellType = new TipCellType();
  53.             this.sheetClazz.setDefaultStyle(defaultStyle);
  54.             this.$emit('sheet', this.sheetClazz);</p><p style="line-height: 30px; text-indent: 2em;">      ...
  55.        },
  56.        // 工作薄刷新
  57.        handleRefresh() {
  58.              this.spreadClazz.refresh();
  59.        },
  60.        // 获取配置数据
  61.        getDataToJSON() {
  62.              return this.spreadClazz.toJSON();
  63.        },
  64.        // 工作薄数据加载
  65.        loadDataFromJSON(json) {
  66.              if (!json) {
  67.                  return
  68.              }
  69.              let parseJSON = JSON.parse(json);
  70.              // 调用Workbook.fromJSON()方法加载数据
  71.              this.spreadClazz.fromJSON(parseJSON, { incrementalLoading: true });
  72.        },
  73.        // 初始化单元格鼠标事件
  74.        initBindEvents() {
  75.        const vm = this;
  76.        TipCellType.prototype = new GC.Spread.Sheets.CellTypes.Text();
  77.        TipCellType.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) {
  78.        return {
  79.                    x: x,
  80.                    y: y,
  81.                    row: context.row,
  82.                    col: context.col,
  83.                    cellStyle: cellStyle,
  84.                    cellRect: cellRect,
  85.                    sheetArea: context.sheetArea,
  86.              };
  87.        };
  88.        TipCellType.prototype.processMouseEnter = function (hitinfo) {
  89.                const { row, col } = hitinfo;</p><p style="line-height: 30px; text-indent: 2em;">        // 将单元格信息回调给父组件
  90.                vm.$emit('callbackCellOver', { source: { row, col }, handle: { row: Number(row) + 1, col: Number(col) + 1 } });
  91.                return false;
  92.        };
  93.        },
  94.        },</p><p style="line-height: 30px; text-indent: 2em;"><span style="text-indent: 2em; text-align: center;">};</span></p><p style="line-height: 30px; text-indent: 2em;"></p></script>
复制代码








11 个回复

倒序浏览
Web123.0
注册会员   /  发表于:2022-6-17 17:31:21
来自 11#
最近太忙,迟来的demo

spead-demo.zip

291.02 KB, 下载次数: 177

评分

参与人数 1金币 +666 收起 理由
Derrick.Jiao + 666 赞一个!

查看全部评分

回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-4-26 18:27:27
沙发
您好,
根据您的描述尝试整理可复现的demo需要耗用一定的时间,
所以为了更快的复现此问题和进一步调研问题原因,建议您直接提供可复现此问题的demo,
这边根据您描述的步骤来测试复现下。
回复 使用道具 举报
Web123.0
注册会员   /  发表于:2022-4-28 17:21:53
板凳
本帖最后由 Web123.0 于 2022-4-28 17:31 编辑
Lynn.Dou 发表于 2022-4-26 18:27
您好,
根据您的描述尝试整理可复现的demo需要耗用一定的时间,
所以为了更快的复现此问题和进一步调研问 ...

你好
由于本人是第一次使用SpreadJS,所以很多用法和相关API都不熟悉,还请指教。今天整理了一个简易demo,详情看附件。
同时,我尝试过这个地址中的实现方案:https://demo.grapecity.com.cn/spreadjs/gc-sjs-samples/index.html?id=101,但是单元格定位信息并不是百分之百准确。

关于demo中问题复现的操作流程:
1、先拖拽节点到excel中。
2、点击“调用toJSON方法”。
3、再次拖拽节点到excel中(为了突显后一步的效果)。
4、点击“调用fromJSON方法”。
5、processMouseEnter方法失效,无法拖拽节点到excel中。

整一套流程下来,会导致processMouseEnter方法失效,尝试过重新设置,仍然无效。

spreadjs-demo.zip

290.6 KB, 下载次数: 135

回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-4-28 18:14:04
地板
demo收到,这边先根据您描述的步骤实际测试下,待有进展会在贴中更新。
回复 使用道具 举报
Web123.0
注册会员   /  发表于:2022-4-29 16:21:35
5#
Lynn.Dou 发表于 2022-4-28 18:14
demo收到,这边先根据您描述的步骤实际测试下,待有进展会在贴中更新。

你好

我在论坛看到其他的帖子(https://gcdn.grapecity.com.cn/showtopic-37194-1-1.html)里面说到的一个方案使用sheet.fromJSON方案来解决,经过尝试在使用sheet.fromJSON后,processMouseEnter方法不会失效。算是能解决我遇到的问题吧,不过我还需进一步测试验证。
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-4-29 18:18:05
6#
本帖最后由 Lynn.Dou 于 2022-4-29 18:25 编辑

问题已复现,这边尝试根据代码进行调试,初步判断与vue的生命周期有关,目前暂未定位到具体原因,所以仍需进一步调研。
您先按照链接中的方案解决此问题,待调研有进展后,这边会在本贴通知您。
回复 使用道具 举报
Web123.0
注册会员   /  发表于:2022-5-5 09:33:51
7#
Lynn.Dou 发表于 2022-4-29 18:18
问题已复现,这边尝试根据代码进行调试,初步判断与vue的生命周期有关,目前暂未定位到具体原因,所以仍需 ...

好的,辛苦了
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2022-5-5 16:52:49
8#
回复 使用道具 举报
Web123.0
注册会员   /  发表于:2022-5-6 11:50:10
9#

本帖子中的问题,我已经解决了。就这两天吧,我会整理一个DEMO发出来
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2022-5-6 12:18:57
10#
Web123.0 发表于 2022-5-6 11:50
本帖子中的问题,我已经解决了。就这两天吧,我会整理一个DEMO发出来

感谢分享,欢迎分享demo和对应的思路哈,届时这边会为你增送666金币。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部