找回密码
 立即注册

QQ登录

只需一步,快速开始

bingdaoice

中级会员

44

主题

208

帖子

608

积分

中级会员

积分
608
bingdaoice
中级会员   /  发表于:2020-6-9 15:31  /   查看:7181  /  回复:18
1金币
请问如何自编公式?
并将公式加入到Spread.Net中去,让用户可以使用我们自编的公式。
如果有的话,请给一个DEMO。谢谢!

最佳答案

查看完整内容

我不确定你说的最大偏差怎么计算,这里给出的是求一个区域内小于固定数值的单元格求和 可以参考一下 下面就是实际调用的代码

18 个回复

倒序浏览
最佳答案
最佳答案
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-6-9 15:31:02
来自 17#
本帖最后由 Richard.Ma 于 2020-6-24 14:26 编辑

我不确定你说的最大偏差怎么计算,这里给出的是求一个区域内小于固定数值的单元格求和
可以参考一下
  1. class CountIfLessThanFunction : GrapeCity.CalcEngine.Function
  2.         {
  3.             public CountIfLessThanFunction() : base("COUNTIFLESSTHAN", 2, 2, GrapeCity.CalcEngine.FunctionAttributes.Number) { }
  4.             protected override void Evaluate(IArguments arguments, IValue result)
  5.             {
  6.                 IValue range = arguments[0];
  7.                 //确认第一个参数是否是引用类型,不是的话返回错误值类型
  8.                 if (range.ValueType != GrapeCity.CalcEngine.ValueType.AdjustableReference)
  9.                 {
  10.                     arguments.EvaluationContext.Error = CalcError.Value;
  11.                     result.SetValue(CalcError.Value);
  12.                 }
  13.                 else
  14.                 {
  15.                     IEvaluationContext evaluationContext = arguments.EvaluationContext;
  16.                     //获取第二个参数
  17.                     double criteria = arguments[1].GetNumber(evaluationContext);
  18.                     
  19.                     IReferenceSource referenceSource = range.GetReferenceSource(evaluationContext);
  20.                     //获取第一个参数,这个即是你目前需要的一个范围,调用的时候需要写"$C$4:$C$9"这种
  21.                     RangeReference rangeRef = range.GetReference(evaluationContext, 0);
  22.                     double sum = 0;

  23.                     //获取范围,循环可以获取单元格的值,进行逻辑运算
  24.                     for (int c = rangeRef.Column; c <= rangeRef.Column2; c++)
  25.                     {
  26.                         for (int r = rangeRef.Row; r <= rangeRef.Row2; r++)
  27.                         {
  28.                             referenceSource.GetValue(evaluationContext, r, c, result);
  29.                             double cellValue = result.GetNumber(evaluationContext);
  30.                             if (cellValue < criteria)
  31.                             {
  32.                                 sum+= cellValue;
  33.                             }
  34.                         }
  35.                     }
  36.                     result.SetValue(evaluationContext, sum);
  37.                 }
  38.             }
  39.         }
复制代码


下面就是实际调用的代码
  1.             fpSpread2.AddCustomFunction(new CountIfLessThanFunction());
  2.             fpSpread2.ActiveSheet.Cells[12,3].Formula = "COUNTIFLESSTHAN($C$4:$C$9,4)";
复制代码










回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-6-9 17:00:29
2#
你好,如果是要自定义公式的话,可以参考下面的链接

https://www.grapecity.com/spread ... mulacustomfunc.html
https://www.grapecity.com/spread ... mulacustomname.html
回复 使用道具 举报
bingdaoice
中级会员   /  发表于:2020-6-11 15:55:39
3#
本帖最后由 bingdaoice 于 2020-6-11 16:07 编辑

谢谢Richard.Ma的回复,
已经看了上述两篇介绍,自己也测试过了,但是没有成功。
请问可以提供一个DEMO吗?谢谢
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-6-11 16:37:16
4#
抱歉,目前暂无demo,你按照文档操作是遇到了什么问题了吗
回复 使用道具 举报
bingdaoice
中级会员   /  发表于:2020-6-15 12:28:11
5#
目前我在尝试解决这些问题 。
如果还有不懂的,再来请教。
感 谢Richard.Ma。
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-6-15 14:24:45
6#
好的,不客气
回复 使用道具 举报
bingdaoice
中级会员   /  发表于:2020-6-19 16:07:01
7#
本帖最后由 bingdaoice 于 2020-6-19 16:10 编辑

回复错误,不用管。
回复 使用道具 举报
bingdaoice
中级会员   /  发表于:2020-6-19 16:46:35
8#
你好Richard.Ma,我按文档的方法添加了公式,在Spread中也能使用。这个公式只涉及了一个单元格。
我想做一个涉及不定数单元格的公式请问怎么添加。
https://gcdn.grapecity.com.cn/fo ... &extra=page%3D1
下面的好像有涉及多的例子,但是看不懂。
也不知道怎么用。
请问有具体一点的例子吗?


            Spread_RecdCertif.AddCustomFunction(new TaxValueFunction());
        public class TaxValueFunction : GrapeCity.CalcEngine.Function
        {
            public TaxValueFunction() : base("BINGDAO", 1, 2, FunctionAttributes.SingleCell | FunctionAttributes.Number) { }
            protected override void Evaluate(IArguments arguments, IValue result)
            {
                IEvaluationContext context = arguments.EvaluationContext;
                double num = arguments[0].GetNumber(context);
                double taxrate = arguments.Count > 1 ? arguments[1].GetNumber() : 0.15;
                result.SetValue(null, num - (num * taxrate));
            }
        }
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-6-19 19:00:32
9#
我先帮你找一下看看有没有更合适的例子
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部