找回密码
 立即注册

QQ登录

只需一步,快速开始

zongxudong
初级会员   /  发表于:2013-8-13 10:38  /   查看:8228  /  回复:9
你好.
      Spread 的表达式类似于Excel 的写法, 比如 A1 + A2 的方式. 但是在我们开发的产品中表格的列, 行都有自己的设置方式. 我能不能重写表达式的解析计算功能.  比如 我想要 实现  (表达式 = 工资 + 保险) 这样的方式

9 个回复

倒序浏览
山水
初级会员   /  发表于:2013-8-13 17:39:00
沙发
你好,
可以使用Spread的AddCustomName方法增加一个自定义Formula,实现类似你需要的功能。例子代码如下:
            fpSpread1.AllowUserFormulas = true;
            fpSpread1.ActiveSheet.Columns[0].Label = "其他1";
            fpSpread1.ActiveSheet.Columns[1].Label = "工资";
            fpSpread1.ActiveSheet.Columns[2].Label = "其他2";
            fpSpread1.ActiveSheet.Columns[3].Label = "保险";
            fpSpread1.ActiveSheet.Columns[4].Label = "其他3";
            fpSpread1.ActiveSheet.Columns[5].Label = "合计";
            fpSpread1.ActiveSheet.AddCustomName("工资保险合计", "Sum(B1, D1)", 0, 5);
            fpSpread1.ActiveSheet.Columns[5].Formula = "工资保险合计";

请注意,CustomName中不能有运算符号如:+,-,*,/等。
回复 使用道具 举报
zongxudong
初级会员   /  发表于:2013-8-14 09:38:00
板凳
你好, 非常感谢你的回复.

    目前这种解决方式还是使用了定义的函数, 不过我无法预知用户在使用时候要做出什么样的计算. 我也只能暴露计算公式给用户操作. 但是目前的表达式的地址引用只有两种方式 A1 或者 R1C1, 这两种都只能对我固定列或者行. 但是用户的地址计算又不是针对行, 或者列的. 对于我的项目来说. 用户能却定的是 以 科目编码, 或者 数据库的主键.
    目前我能理解的是, formulas 是保存在 DefaultSheetDataModel 类里面, 在公式解析的时候 由 Parser 解析成 Expression 设置到对应的区域.  如果解析方法做成虚函数我还能继承由我自己来实现我自己的 Parser 可惜的是这个方法又不能覆盖. :-| 那不是我要自己实现 SheetDataModel ? 诶呀, 这样的的工作量是不是太大了. 还请你们能够帮我解决这样的问题
回复 使用道具 举报
山水
初级会员   /  发表于:2013-8-14 15:19:00
地板
你好,
如同你了解的情况,要想控制formula的解析,必须重新实现DefaultSheetDataModel中的ParseFormula等方法,而该方法不是虚方法,不能够重载。
除非实现一个自定义的功能强大的类似Spread的SheetDataModel,但对任何用户这是几乎不可能的。
所以结论是:你现在的这种需求Spread不支持。
回复 使用道具 举报
zongxudong
初级会员   /  发表于:2013-8-15 09:13:00
5#
你好,
      我只想要重写公式的东西. 为了一个公式需要重写DataModel太吐血了. 能不能反应一下, 改成虚函数呀.  类似于Excel 的表达式固然普遍, 但是对于应用型的表格, 表达式也需要对用户开放呀
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-8-15 14:59:00
6#
回复 5楼zongxudong的帖子

zongxudong 你好,

能否留个联系方式,我们做进一步沟通呢?
回复 使用道具 举报
zongxudong
初级会员   /  发表于:2013-8-16 11:58:00
7#
非常感谢, 对这个问题的重视

我的邮箱 zxd@lemsun.com

昨天我也在看 Spread 的 BaseSheetDataModel , 如果是重写支持数据显示还是比较简单. 但是Spread的设计模式, 是通过对 接口的实现来支持更多的功能, 要是把那些接口都实现了, 确实有点复杂. 应该多提供几个抽象类来支撑一下
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-8-16 17:56:00
8#
回复 7楼zongxudong的帖子

能否考虑通过对比公式名称和列名来转换成 A1 或者 R1C1 的格式呢?
回复 使用道具 举报
zongxudong
初级会员   /  发表于:2013-8-19 14:26:00
9#
总觉得 Spread 的定制度太低. 可能本身的想法是做个大的集成来支持多种需求. 我也想过转换格式来做, 不过我们的项目本身就有自己的领域语言. 这样翻译效率也低. 还不如下定决心自己实现 DataModel, 这样也有好处. 至少可以自己控制数据的读写. 而且 Spread 的设计模式也不错, 需要什么功能就实现什么接口. 我也可以省去一些我不需要的数据支持, 比如 Note, Tag 这些
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-8-20 08:42:00
10#
回复 9楼zongxudong的帖子

如果在实现过程中遇到问题,可以随时和我们沟通。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部