找回密码
 立即注册

QQ登录

只需一步,快速开始

Ellia.Duan SpreadJS 开发认证
超级版主   /  发表于:2024-10-28 18:02  /   查看:148  /  回复:0
本帖最后由 Ellia.Duan 于 2024-10-29 12:21 编辑

ReportSheet可以在模板中为单元格设置背景色,在预览时,字段进行扩展,会为整个字段设置同样的背景色,如下图所示,右侧是模板,左侧是预览数据

image.png86920775.png
但是有一些场景下,需要在数据填报时,对部分数据进行背景色标识,如下图所示,为同一个字段,不同的数据设置背景色。
image.png589473876.png
为此,我们可以通过设置条件格式,或者自定义单元格来实现。
关于条件格式,可以参考这个文章:https://demo.grapecity.com.cn/sp ... ng/condition-format
下面重点介绍下,如何用自定义单元格来实现。
一、创建数据源
  1.   let data = [
  2.                 {id: 1, name: '张三', age: 27, sex: 0},
  3.                 {id: 2, name: "李四", age: 31, sex: 1},
  4.                 {id: 3, name: "小王", age: 22, sex: 1},
  5.                 {id: 4, name: "小韩", age: 45, sex: 0},
  6.                 {id: 5, name: "小明", age: 25, sex: 0},
  7.             ];
  8. const ordersTable = spread.dataManager().addTable('student',
  9.                 {
  10.                     autoSync: true,
  11.                     remote: {
  12.                         read: function () {
  13.                             return Promise.resolve(data);
  14.                         },
  15.                         create: function () {
  16.                             return Promise.resolve(data);
  17.                         },
  18.                         update: function (data) {
  19.                             return Promise.resolve(data);
  20.                         },
  21.                         delete: function () {
  22.                             return Promise.resolve(data);
  23.                         },
  24.                     }
  25.                 }
  26.             );
复制代码

二、定义报表基础数据
  1. const reportSheet = spread.addSheetTab(0, 'report', GC.Spread.Sheets.SheetType.reportSheet);

  2.             ordersTable.fetch().then(() => {
  3.                 spread.suspendPaint();
  4.                 const templateSheet = reportSheet.getTemplate();
  5.                 const columns = ['id', 'name', 'age', 'sex'];
  6.                 columns.forEach((columnName, i) => {
  7.                     templateSheet.setValue(0, i, columnName);
  8.                     templateSheet.setTemplateCell(1, i, {
  9.                         type: 'List',
  10.                         binding: `student[${columnName}]`,
  11.                     });
  12.                 });
  13.                 templateSheet.setCellType(1, 1, new RichTextCellType())
  14.                 templateSheet.getRange(0, 0, 2, 4).hAlign(GC.Spread.Sheets.HorizontalAlign.center);
  15.                 templateSheet.getRange(0, 0, 2, 4).borderLeft(new GC.Spread.Sheets.LineBorder("black", GC.Spread.Sheets.LineStyle.thin));
  16.                 templateSheet.getRange(0, 0, 2, 4).borderRight(new GC.Spread.Sheets.LineBorder("black", GC.Spread.Sheets.LineStyle.thin));
  17.                 templateSheet.getRange(0, 0, 2, 4).borderTop(new GC.Spread.Sheets.LineBorder("black", GC.Spread.Sheets.LineStyle.thin));
  18.                 templateSheet.getRange(0, 0, 2, 4).borderBottom(new GC.Spread.Sheets.LineBorder("black", GC.Spread.Sheets.LineStyle.thin));
  19.                 templateSheet.getRange(0, 0, 1, 4).backColor('pink');

  20.                 spread.resumePaint();
  21.                 reportSheet.refresh()
  22.             });
复制代码
通过上述代码,创建了模板,填充了字段,并设置了样式。
结果如下:
image.png935556945.png
三、定义右键菜单
接下来 ,我们可以添加一个右键菜单,使其选择颜色。
结果如下图所示:
image.png565122680.png
接下来,我们分三个步骤来实现这个效果。
第一步:定义一级菜单以及二级菜单,将其添加到右键菜单。相关代码如下:
  1. var menuItem = {
  2.                 commandName: "selectWithBg",
  3.                 text: "选择颜色",
  4.                 iconClass: "separator",
  5.                 visibleContext: "ReportSheetActive",
  6.                 subMenu: [
  7.                     {
  8.                         name: "selectColorPicker",
  9.                         command: "selectWithBg",
  10.                     }
  11.                 ],

  12.             };
  13.      let config = GC.Spread.Sheets.Designer.DefaultConfig;
  14.             config.contextMenu.push('setBackColor')
  15.             config.commandMap = {
  16.                 'setBackColor': menuItem
  17.             };
  18.             var designer = new GC.Spread.Sheets.Designer.Designer(document.getElementById("designerHost"), config);


复制代码
在上述代码中,通过config.contextMenu.push('setBackColor')来实现添加菜单的目的。

第二步:设置二级菜单dom结构。我们观察上图,二级菜单似乎与其他菜单长得不一样,在这里我们用自定义菜单的方式进行实现。

关于自定义菜单,可以查看这篇学习指南:
https://demo.grapecity.com.cn/sp ... om-menu-view/purejs
image.png900691833.png
我们继续,相关代码如下:


  1.       function CustomMenuView() {
  2.         }

  3.         CustomMenuView.prototype = new GC.Spread.Sheets.ContextMenu.MenuView();
  4.         CustomMenuView.prototype.createMenuItemElement = function (menuItemData) {
  5.             var self = this;
  6.             if (menuItemData.name === "selectColorPicker") {
  7.                 var containers = GC.Spread.Sheets.ContextMenu.MenuView.prototype.createMenuItemElement.call(self, menuItemData);
  8.                 var supMenuItemContainer = containers[0];
  9.                 while (supMenuItemContainer.firstChild) {
  10.                     supMenuItemContainer.removeChild(supMenuItemContainer.firstChild);
  11.                 }
  12.                 var colorPicker = createColorpicker();
  13.                 supMenuItemContainer.appendChild(colorPicker);

  14.                 return supMenuItemContainer;
  15.             } else {
  16.                 return GC.Spread.Sheets.ContextMenu.MenuView.prototype.createMenuItemElement.call(self, menuItemData);
  17.             }
  18.         };
  19.         CustomMenuView.prototype.getCommandOptions = function (menuItemData, host, event) {
  20.             if (menuItemData && menuItemData.name === "selectColorPicker") {
  21.                 var ele = event.target || event.srcElement;
  22.                 return ele.style.backgroundColor;
  23.             }
  24.         };


  25.         // 定义子菜单
  26.         var colors = ['#1abc9c', '#2ecc71', '#3498db', '#9b59b6', '#34495e',
  27.             '#f1c40f', '#e67e22', '#e74c3c'];

  28.         function createColorpicker() {
  29.             var colorPicker = document.createElement('div');
  30.             colorPicker.className = 'colorPickerContent';
  31.             for (var j = 0; j < 8; j++) {
  32.                 var colorDom = document.createElement("div");
  33.                 colorDom.className = 'colorDom';
  34.                 colorDom.style['backgroundColor'] = colors[j];
  35.                 colorPicker.appendChild(colorDom);
  36.             }
  37.             return colorPicker;
  38.         }
复制代码

在上述代码中,我们获取到当前选中的区域,并遍历单元格,获取其richText值,执行editCell命令。
最后,我们执行下下面这行代码
  1. spread.contextMenu.menuView = new CustomMenuView();
复制代码

四、定义自定义单元格
执行完上述代码后,发现,设置颜色设置不上去,因为ReportSheet 预览模式下,不支持背景色的修改。这时候我们需要设置自定义单元格。

  1.    function RichTextCellType() {
  2.             this.typeName = "RichTextCellType"
  3.         }

  4.         RichTextCellType.prototype = new GC.Spread.Sheets.CellTypes.Text();
  5.         RichTextCellType.prototype.paint = function (ctx, value, x, y, w, h, style, context) {
  6.             if (value && value.backColor) {
  7.                 style.backColor = value.backColor;
  8.             }
  9.             GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, [ctx, value, x, y, w, h, style, context]);
  10.         };
复制代码


在上述代码中,我们重写了paint方法,将paint中style属性进行了修改。
接下来为B2单元格(name字段)设置cellType
  1. templateSheet.setCellType(1, 1, new RichTextCellType())
复制代码



通过上述代码,我们就简单实现了报表在预览时同一个字段设置不同背景色的需求。

上述代码较复杂,建议还是通过条件格式来完成此需求。
我们来看下最后的效果:
设置背景色.gif

demo: 报表中添加背景色.html (11.36 KB, 下载次数: 5)

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部