找回密码
 立即注册

QQ登录

只需一步,快速开始

linqx

注册会员

5

主题

10

帖子

165

积分

注册会员

积分
165
最新发帖

[已处理] 背景图片问题

linqx
注册会员   /  发表于:2018-9-25 11:07  /   查看:3218  /  回复:5
我想在工作簿中选中一个区域插入一张背景图片,但是实现后发现会每个单元格赋予一个背景图。求解决代码和效果如图 image.png903501586.png
image.png851989440.png

5 个回复

倒序浏览
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-9-25 13:58:49
沙发
您好,Spread JS不支持为一个Range设置背景图的接口,

目前可以采用重写CellTypes的方法来实现这个功能,

但是无法确保将来的新版本能够支持这个实现。

具体实现方法我上传一个Demo,请查阅附件。

printBackground.html

2.53 KB, 下载次数: 88

回复 使用道具 举报
linqx
注册会员   /  发表于:2018-9-25 14:40:03
板凳
KevinChen 发表于 2018-9-25 13:58
您好,Spread JS不支持为一个Range设置背景图的接口,

目前可以采用重写CellTypes的方法来实现这个功能 ...

你好,您的这个方法如果滚动盖过图片背景图就乱了。就是把工作簿滚动条拉到最下面盖过图片,在拉到最上面就有问题了
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-9-25 15:42:34
地板
你好,这个问题我这边重现了一下。

造成这个问题的原因是,由于Demo中是把单个单元格中的背景图进行了放大绘制,

而当滚动条滚动到目标单元格下方时,目标单元格并未被绘制,此时就会出现问题。

解决办法是添加滚动条事件,在事件中注册setTimeout,将sheet重绘即可。

setTimeout时间应控制在不影响视觉效果的情况下尽量长一些。

代码如下:

  1. function WaterMarkCellType() {
  2.             this.typeName = "WaterMarkCellType"
  3.         }
  4.         WaterMarkCellType.prototype = new GC.Spread.Sheets.CellTypes.Text();
  5.         WaterMarkCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
  6.             //Paints a cell on the canvas.
  7.             var that = this;
  8.             var background = style.backgroundImage;
  9.             style.backgroundImage = undefined;
  10.             GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
  11.             GC.Spread.Sheets.CellTypes.Text.prototype.paint.call(that, ctx, undefined, x, y, w+100, h+100, {backgroundImage:background}, options);
  12.         };

  13.         $(document).ready(function () {
  14.             var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"));
  15.             var sheet = spread.getActiveSheet();
  16.             sheet.getCell(3, 3).cellType(new WaterMarkCellType()).backgroundImage('https://www.grapecity.com.cn/images/metalsmith/home/logo_spjs.png')

  17.             sheet.setArray(2, 2, [[1,2,3,4,5,6,],[1,2,3,4,5,6,],[1,2,3,4,5,6,],[1,2,3,4,5,6,],[1,2,3,4,5,6,],[1,2,3,4,5,6,]]);

  18.             var setTimeoutId = null;
  19.             sheet.bind(GC.Spread.Sheets.Events.TopRowChanged, function (s, e) {
  20.                 clearTimeout(setTimeoutId);
  21.                 // 这里的间隔时间,在不影响视觉效果的情况下尽可能长一点
  22.                 setTimeoutId = setTimeout(function(){
  23.                     e.sheet.repaint();
  24.                 }, 50);
  25.             });
  26.         });
复制代码

评分

参与人数 1满意度 +5 收起 理由
linqx + 5 很给力!

查看全部评分

回复 使用道具 举报
linqx
注册会员   /  发表于:2018-9-25 16:47:01
6#
KevinChen 发表于 2018-9-25 15:42
你好,这个问题我这边重现了一下。

造成这个问题的原因是,由于Demo中是把单个单元格中的背景图进行了放 ...

好的感谢~
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-9-25 16:54:05
7#
谢谢您的反馈,本帖我结帖操作,如有别的问题欢迎发新帖询问~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部