找回密码
 立即注册

QQ登录

只需一步,快速开始

前端工程师
注册会员   /  发表于:2018-9-12 14:01  /   查看:7583  /  回复:13
本帖最后由 前端工程师 于 2018-9-27 10:35 编辑

blob807969970.png
实现的代码是
var cfs = this.$refs.worksheet.sheet.conditionalFormats ;
        var dataBarRule1 = new GC.Spread.Sheets.ConditionalFormatting.DataBarRule();
        dataBarRule1.minType(GC.Spread.Sheets.ConditionalFormatting.ScaleValueType.automin);
        dataBarRule1.maxType(GC.Spread.Sheets.ConditionalFormatting.ScaleValueType.automax);
        dataBarRule1.ranges([new GC.Spread.Sheets.Range(3, 1, 10, 1)]);  dataBarRule1.color("orange").showBorder(true).borderColor("orange").dataBarDirection(GC.Spread.Sheets.ConditionalFormatting.BarDirection.rightToLeft);
        cfs.addRule(dataBarRule1);


有个需求是先根据 值的大小 改变bar的颜色
比如说 0~50 是绿色  50~80是黄色  80以上是红色
能不能自定义这个颜色函数呢?

13 个回复

倒序浏览
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-9-12 15:23:48
沙发
您好,您的这个需求,类似于Excel表格中条件格式的单元格色阶,Spread JS中可以实现,我贴一个JS的Demo给您参考:
  1. $(document).ready(function () {
  2.     var spread = new GC.Spread.Sheets.Workbook(document.getElementById('ss'), {
  3.         sheetCount: 1
  4.     });
  5.     initSpread(spread);
  6. });

  7. function initSpread(spread) {

  8.     var activeSheet = spread.getSheet(0);
  9.     activeSheet.suspendPaint();

  10.     var scale = new GC.Spread.Sheets.ConditionalFormatting.ScaleRule();
  11.     scale.ruleType(GC.Spread.Sheets.ConditionalFormatting.RuleType.threeScaleRule);
  12.     scale.midColor("red");
  13.     scale.midType(GC.Spread.Sheets.ConditionalFormatting.ScaleValueType.number);
  14.     scale.midValue(50);
  15.     scale.maxColor("blue");
  16.     scale.maxType(GC.Spread.Sheets.ConditionalFormatting.ScaleValueType.number);
  17.     scale.maxValue(100);
  18.     scale.minColor("yellow");
  19.     scale.minType(GC.Spread.Sheets.ConditionalFormatting.ScaleValueType.number);
  20.     scale.minValue(10);
  21.     scale.ranges([new GC.Spread.Sheets.Range(0, 0, 10, 10)]);
  22.     activeSheet.conditionalFormats.addRule(scale);
  23.     activeSheet.setValue(0,0, 10,3);
  24.     activeSheet.setValue(1,0, 20,3);
  25.     activeSheet.setValue(2,0, 30,3);
  26.     activeSheet.setValue(3,0, 40,3);
  27.     activeSheet.setValue(4,0, 50,3);
  28.     activeSheet.setValue(5,0, 60,3);
  29.     activeSheet.setValue(6,0, 70,3);
  30.     activeSheet.setValue(7,0, 80,3);
  31.     activeSheet.setValue(8,0, 90,3);
  32.     activeSheet.setValue(9,0, 100,3);

  33.     activeSheet.resumePaint();
  34. }
复制代码

回复 使用道具 举报
前端工程师
注册会员   /  发表于:2018-9-12 15:48:02
板凳
blob738028259.png
那么这种方式 只能提供三段的区域值么?  mid max min
如果需要展示更多段值域   比如  0~10  10~40  40~50 50~60 ......
可以解决么?
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-9-12 16:20:10
地板
您好,您可以尝试运行一下这个Demo,
实际上设置mid、max、min的颜色后,
单元格的颜色会在这三个色域中实现渐变效果,
如图:

颜色渐变效果

颜色渐变效果

您也可以尝试操作Excel中“条件格式”的“色阶”设置,与这个效果是一致的。

回复 使用道具 举报
前端工程师
注册会员   /  发表于:2018-9-12 16:43:00
5#
不好意思还得问一下,
刚才您发的这个是颜色渐变的,
但是根据实际需求写代码的时候更多的情况是需要 自己指定多段值域,
有可能些值域渐变是非线性的,
希望可以在代码中 自己定义 哪些值域 展示什么样的颜色
回复 使用道具 举报
前端工程师
注册会员   /  发表于:2018-9-12 16:54:48
6#
blob839995117.png
var cfs = this.$refs.worksheet.sheet.conditionalFormats ;
        var style1 = new GC.Spread.Sheets.Style();
        style1.backColor = "#FFCCCC";
        cfs.addCellValueRule(GC.Spread.Sheets.ConditionalFormatting.ComparisonOperators.between, 60, 70, style1, [ new GC.Spread.Sheets.Range(3,1,10,1) ]);
        var style2 = new GC.Spread.Sheets.Style();
        style2.backColor = "#FFffCC";
        cfs.addCellValueRule(GC.Spread.Sheets.ConditionalFormatting.ComparisonOperators.between, 10, 60, style2, [ new GC.Spread.Sheets.Range(3,1,10,1) ]);

刚刚查了一下Demo用这种方式可以实现自定义值域,但是只能使用style改变背景样色,怎么样结合DataBarRule呢?
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-9-12 17:00:08
7#
明白了,您可以参考一下DataBarRule的API,可以设置在程序中设置color:
http://help.grapecity.com/spread ... ng.DataBarRule.html
再结合一下表格事件,比如您可以绑定一个编辑结束事件,然后拿到对应的单元格的值,并赋予其相应的颜色:
  1. activeSheet.bind(spreadNS.Events.EditEnded, function (e, args) {
  2.         // 在此执行操作;
  3.     });
复制代码

关于编写表格事件,您可以参考一下葡萄城官网的学习指南中的Demo,地址:
https://demo.grapecity.com.cn/Sp ... /demos/spreadEvents
回复 使用道具 举报
前端工程师
注册会员   /  发表于:2018-9-12 17:49:12
8#
如果使用spreadNS.Events.EditEnded 事件的话 只有在修改单元格数值后 经过逻辑判断才会变色
那么一开始加载数据进来就不会有变色的效果了,
需要数据初始化的时候遍历每个单元格然后设定不同的DataBarRule么?,感觉这么做很繁琐

之前看到demo中的GC.Spread.Sheets.ConditionalFormatting.ComparisonOperators.between 这个可以直接指定值域,但是只能改变style,
有没有可能让GC.Spread.Sheets.ConditionalFormatting.ComparisonOperators.between和DataBarRule组合起来用呢?
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2018-9-12 18:47:21
9#
参考下这个:
https://demo.grapecity.com.cn/Sp ... icConditionalFormat
给同一个单元格设置多个条件格式就可以满足您的需求了
image.png234236449.png
回复 使用道具 举报
前端工程师
注册会员   /  发表于:2018-9-13 10:11:20
10#
这个Demo之前看过了,这种只能使用style实现改变颜色,不能使用DataBarRule
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部