找回密码
 立即注册

QQ登录

只需一步,快速开始

极品毛肚
注册会员   /  发表于:2022-8-19 11:35  /   查看:1836  /  回复:4
100金币
本帖最后由 极品毛肚 于 2022-8-19 11:37 编辑

计算隐藏列.gif

如图,使用SUBTOTAL公式设置不计算隐藏值,橙色有效果,绿色无效果。改怎么使绿色有效果?或者不适用公式有什么好办法不计算隐藏单元格?

最佳答案

查看完整内容

我们可以添加自定义方法 然后,比如公式=SUM(C(A1:S1))就是计算显示的列的单元格的和。

4 个回复

倒序浏览
最佳答案
最佳答案
WilliamChang
葡萄城公司职员   /  发表于:2022-8-19 11:35:45
来自 3#
我们可以添加自定义方法

  1. function FactorialFunction() {
  2.     this.name = "C";
  3.     this.maxArgs = 1;
  4.     this.minArgs = 1;
  5. }
  6. FactorialFunction.prototype = new GC.Spread.CalcEngine.Functions.Function();
  7. FactorialFunction.prototype.acceptsReference = function(){return true;}
  8. FactorialFunction.prototype.evaluate = function (arg) {
  9.     var result = [];
  10.     for (var range = 0; range < arg.getRangeCount(); range++) {
  11.         for (var i=0, rc = arg.getRowCount(); i<rc; i++) {
  12.             var tmp = [];
  13.             for (var j=0, c = arg.getColumn(), cc = arg.getColumnCount(); j<cc; j++) {
  14.                 if (arg.getSource().getSheet().getColumnVisible(j+c)) {
  15.                     tmp.push(arg.getValue(range,i,j));
  16.                 }
  17.             }
  18.             result.push(tmp);
  19.         }
  20.     }
  21.     return new GC.Spread.CalcEngine.CalcArray(result);
  22. };

  23. spread.addCustomFunction(new FactorialFunction())

复制代码


然后,比如公式=SUM(C(A1:S1))就是计算显示的列的单元格的和。
回复 使用道具 举报
沉沉悬赏达人认证
金牌服务用户   /  发表于:2022-8-19 14:25:47
2#
Subtotal函数对隐藏的列区域无效。这个在excel中也是一样的效果。SpreadJs有一个ColumnChanged事件,可以获取改变的列,当判断当前改变的列的sheetArea是colHeader,且旧值为true,新值为false。可以判断出该列被隐藏了。此时可以重新计算。
  1. sheet.setFormula(8, 0, '=sum(B9:G9)')
  2.         sheet.setValue(8, 1, 1)
  3.         sheet.setValue(8, 2, 2)
  4.         sheet.setValue(8, 3, 3)
  5.         sheet.setValue(8, 4, 4)
  6.         sheet.setValue(8, 5, 5)


  7.         sheet.bind(GC.Spread.Sheets.Events.ColumnChanged, function (e, info) {
  8.    const {newValue, sheetArea, oldValue, col} = info;
  9.    if (sheetArea == 3 && newValue == false && oldValue == true) { //隐藏列
  10.       sheet.setFormula(8, 0, null)
  11.       let sum = 0;
  12.         for (let i = 1; i < 6; i++) {
  13.             if (i !== col) {
  14.                  sum += sheet.getValue(8, i);
  15.             }
  16.             }
  17.          sheet.setValue(8, 0, sum);
  18. }
  19.         });
复制代码


回复 使用道具 举报
沉沉悬赏达人认证
金牌服务用户   /  发表于:2022-8-19 16:38:12
4#
WilliamChang 发表于 2022-8-19 16:35
我们可以添加自定义方法

回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-8-19 18:06:05
5#
楼主可参考楼上方案。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部