找回密码
 立即注册

QQ登录

只需一步,快速开始

dexteryao 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-3-9 23:30  /   查看:3485  /  回复:0

自定义StatusItem,实现在状态栏中显示事实未通过验证数据验证数量



  1.       statusBar.add(new GCStatusBarValidatorItem("validatorStatus", {tipText: "数据验证状态", workbooMessageClick: this.workbooMessageClick}), 1);
复制代码



  1. import GC from "@grapecity/spread-sheets"

  2. export default class GCStatusBarValidatorItem extends GC.Spread.Sheets.StatusBar.StatusItem {

  3.     STATUSBAR_NS = '.statusbar'
  4.     name: string;
  5.     option: any;
  6.     _context: GC.Spread.Sheets.Workbook | null;
  7.     _eventNs: string;
  8.     _dispalyControl: HTMLElement | null;
  9.     _sheetMessage = "当前sheet共有错误数:";
  10.     _bookMessage = " | 点击查看整个工作薄";
  11.     constructor(name: string, options?: Object) {
  12.         super(name, options);
  13.         this.name = name;
  14.         this.option = options;
  15.         this._context = null;
  16.         this._eventNs = this.STATUSBAR_NS + this.name;
  17.         this._dispalyControl = null;
  18.     }

  19.     onCreateItemView(container: HTMLElement) {
  20.         let self = this;
  21.         if (self && !self._dispalyControl) {
  22.             self._dispalyControl = document.createElement('div');
  23.             self._dispalyControl.style.color = "red";
  24.             let sheetMessageSpan = document.createElement('span');
  25.             let errorCountSpan = document.createElement('span');
  26.             let booktMessageSpan = document.createElement('span');
  27.             sheetMessageSpan.innerHTML = self._sheetMessage;
  28.             errorCountSpan.innerHTML = "0";
  29.             booktMessageSpan.innerHTML = self._bookMessage;
  30.             self._dispalyControl.appendChild(sheetMessageSpan);
  31.             self._dispalyControl.appendChild(errorCountSpan);
  32.             self._dispalyControl.appendChild(booktMessageSpan);
  33.             booktMessageSpan.onclick = function () {
  34.                 if (self.option.workbooMessageClick) {
  35.                     self.option.workbooMessageClick.call(null, self._getWorkbookValidatorResult());
  36.                 }
  37.             }
  38.             container.appendChild(self._dispalyControl);
  39.         }
  40.     }

  41.     onBind(context: GC.Spread.Sheets.Workbook) {
  42.         let self = this;
  43.         this._context = context;
  44.         // context.bind(GC.Spread.Sheets.Events.ActiveSheetChanged + self._eventNs, function () {
  45.             // self._onActionChangeValue();
  46.         // });
  47.         context.bind(GC.Spread.Sheets.Events.RangeChanged + self._eventNs, function () {
  48.             self._onActionChangeValue();
  49.         });
  50.         context.bind(GC.Spread.Sheets.Events.ValueChanged + self._eventNs, function () {
  51.             self._onActionChangeValue();
  52.         });
  53.         // 监听fromJSON后事件 和 通过代码切换active sheet
  54.         context.bind((<any>GC.Spread.Sheets.Events).FormulatextboxActiveSheetChanged + self._eventNs, function (e:any, data:any) {
  55.             // if (data.oldSheet === undefined) {
  56.                 self._onActionChangeValue();
  57.             // }
  58.         });


  59.     }
  60.     // onUpdate() {
  61.     //     super.onUpdate();
  62.     // }
  63.     onUnbind() {
  64.         if (this._context) {
  65.             this._context.unbind(GC.Spread.Sheets.Events.ValueChanged + this._eventNs);
  66.             this._context.unbind(GC.Spread.Sheets.Events.RangeChanged + this._eventNs);
  67.             // this._context.unbind(GC.Spread.Sheets.Events.ActiveSheetChanged + this._eventNs);
  68.             this._context.unbind((<any>GC.Spread.Sheets.Events).FormulatextboxActiveSheetChanged + this._eventNs);
  69.             this._context = null;
  70.         }
  71.     };
  72.     onDispose() {
  73.         this._context = null;
  74.         if (this._dispalyControl) {
  75.             this._dispalyControl.getElementsByTagName("span")[1].onclick = null;
  76.         }
  77.     }
  78.     _onActionChangeValue() {
  79.         if (this._dispalyControl != null && this._context) {
  80.             let validatorResult = this._getSheetValidatorResult(this._context.getActiveSheet())
  81.             this._dispalyControl.getElementsByTagName("span")[1].innerHTML = validatorResult.length.toString();
  82.             console.log("_onActionChangeValue")
  83.         }
  84.     }

  85.     _getSheetValidatorResult(sheet: GC.Spread.Sheets.Worksheet): Array<any> {
  86.         let rowCount = sheet.getRowCount(),
  87.             colCount = sheet.getColumnCount();
  88.         let validatorResult = [];
  89.         for (let row = 0; row < rowCount; row++) {
  90.             for (let col = 0; col < colCount; col++) {
  91.                 if (!sheet.isValid(row, col, sheet.getValue(row, col))) {
  92.                     let dv = sheet.getDataValidator(row, col, GC.Spread.Sheets.SheetArea.viewport);
  93.                     validatorResult.push(
  94.                         {
  95.                             sheetName: sheet.name(),
  96.                             row: row,
  97.                             col: col,
  98.                             cell: GC.Spread.Sheets.CalcEngine.rangeToFormula(new GC.Spread.Sheets.Range(row, col, 1, 1), 0, 0, GC.Spread.Sheets.CalcEngine.RangeReferenceRelative.allRelative, false),
  99.                             title: dv.inputTitle(),
  100.                             message: dv.inputMessage()
  101.                         }
  102.                     )
  103.                 }
  104.             }
  105.         }
  106.         return validatorResult;
  107.     }

  108.     _getWorkbookValidatorResult() {
  109.         let validatorResult: Array<any> = [];
  110.         if (this._context) {
  111.             for (let index = 0; index < this._context.getSheetCount(); index++) {
  112.                 let sheet = this._context.getSheet(index);
  113.                 let result = this._getSheetValidatorResult(sheet);
  114.                 if (result && result.length > 0) {
  115.                     validatorResult = validatorResult.concat(result);
  116.                 }
  117.             }
  118.         }
  119.         return validatorResult;
  120.     }
  121. }
复制代码


0 个回复

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