找回密码
 立即注册

QQ登录

只需一步,快速开始

zblongman

高级会员

5

主题

14

帖子

1953

积分

高级会员

积分
1953

活字格认证

最新发帖
zblongman
高级会员   /  发表于:2012-11-12 15:51  /   查看:8278  /  回复:9
在导入的Excel文件的G58单元的公式为“=SLOPE(E58:E62,LN(D58:D62))”
现象(如下图所示):
question.jpg (24.7 KB, 下载次数: 815)

9 个回复

倒序浏览
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-11-12 18:06:00
沙发
zblongman 你好

你的这个问题正在处理中,明天给你回复。
回复 使用道具 举报
zblongman
高级会员   /  发表于:2012-11-12 20:15:00
板凳
dof 辛苦了 谢谢!!
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-11-13 15:26:00
地板
zblongman 你好

非常抱歉,让你久等了。

你遇到的这个问题时Spread和Excel中的LN公式实现有些差异照成的,在Excel中LN可以接受一个单元格范围作为参数,而Spread中的LN只识别单元格范围中的第一个单元格的值。

比如有这样的公式设置 ==SLOPE(B1:B6,C1:C6) ,可以用以下解决方案:
1、给A1单元格设置公式:=SLOPE(B1:B6,C1:C6)
2、给C1:C6设置LN(D1)的公式
回复 使用道具 举报
zblongman
高级会员   /  发表于:2012-11-13 16:44:00
5#
dof 你好!
谢谢你的回答!
但是这里有一个问题,就是Excel表是客户自己事先定义好的,不是我们设计的,我们这里是想解决这种不兼容的问题。
换言之,我想做的是自己开发程序解决这个公式差异问题,比如用自定义的公式替换Spread控件中已有的公式,这样可行吗?我该如何做?
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-11-13 17:53:00
6#
zblongman 你好

我这边正在尝试使用自定义公式来解决该问题,已有消息我会立即给你回复。
回复 使用道具 举报
zblongman
高级会员   /  发表于:2012-11-13 20:20:00
7#
dof 你好
辛苦你你们了,谢谢了!
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-11-14 09:53:00
8#
你好!

通过自定义公式可以实现该需求,具体代码如下:
  1.     public partial class MainPage : UserControl
  2.     {
  3.         public MainPage()
  4.         {
  5.             InitializeComponent();

  6.             gcSpreadSheet1.Sheets[0].Cells[0, 1].Value = 1;
  7.             gcSpreadSheet1.Sheets[0].Cells[1, 1].Value = 2;
  8.             gcSpreadSheet1.Sheets[0].Cells[2, 1].Value = 3;
  9.             gcSpreadSheet1.Sheets[0].Cells[3, 1].Value = 9;

  10.             gcSpreadSheet1.Sheets[0].Cells[0, 2].Value = 5;
  11.             gcSpreadSheet1.Sheets[0].Cells[1, 2].Value = 6;
  12.             gcSpreadSheet1.Sheets[0].Cells[2, 2].Value = 7;
  13.             gcSpreadSheet1.Sheets[0].Cells[3, 2].Value = 5;

  14.             gcSpreadSheet1.AddCustomFunction(new CalcCSLOPEFunctionInfo());
  15.             gcSpreadSheet1.AddCustomFunction(new CLNFunctionInfo());

  16.             gcSpreadSheet1.Sheets[0].SetFormula(0, 0, "CSLOPE(B1:B4,CLN(C1:C4))");
  17.         }
  18.     }

  19.     public class CalcCSLOPEFunctionInfo : GrapeCity.CalcEngine.Functions.CalcSlopeFunction
  20.     {
  21.         public override string Name
  22.         {
  23.             get
  24.             {
  25.                 return "CSLOPE";
  26.             }
  27.         }

  28.         public override object Evaluate(object[] args)
  29.         {
  30.             // 将第二个参数封装成 CCalcArray 类型,并传作为调用基类 Evaluate 方法的参数
  31.             if (args[1] is object[,])
  32.             {
  33.                 CCalcArray array = new CCalcArray(args[1] as object[,]);
  34.                 args[1] = array;
  35.             }

  36.             return base.Evaluate(args);
  37.         }
  38.     }

  39.     public class CLNFunctionInfo : GrapeCity.CalcEngine.Functions.CalcFunction
  40.     {
  41.         public override string Name
  42.         {
  43.             get
  44.             {
  45.                 return "CLN";
  46.             }
  47.         }

  48.         public override object Evaluate(object[] args)
  49.         {
  50.             if (args[0] is CalcReference)
  51.             {
  52.                 // 如果传递的是单元格范围的引用,使用使用以下方法进行计算
  53.                 CalcReference array = (CalcReference)args[0];
  54.                 int rowCount = array.GetRowCount(0);
  55.                 int columnCount = array.GetColumnCount(0);
  56.                 object[,] result = new object[rowCount, columnCount];
  57.                 for (int i = 0; i < rowCount; i++)
  58.                 {
  59.                     for (int j = 0; j < columnCount; j++)
  60.                     {
  61.                         object value = array.GetValue(0, i, j);
  62.                         if (value is CalcError)
  63.                         {
  64.                             result[i, j] = value;
  65.                         }
  66.                         else
  67.                         {
  68.                             result[i, j] = Math.Log(Convert.ToDouble(value.ToString()));
  69.                         }
  70.                     }
  71.                 }
  72.                 return result;
  73.             }
  74.             else
  75.             {
  76.                 return Math.Log(Convert.ToDouble(args[0].ToString()));
  77.             }
  78.         }

  79.         public override int MaxArgs
  80.         {
  81.             // 最多接收一个单元格引用范围
  82.             get { return 1; }
  83.         }

  84.         public override int MinArgs
  85.         {
  86.             // 至少需要一个单元格引用范围
  87.             get { return 1; }
  88.         }

  89.         public override bool AcceptsReference(int i)
  90.         {
  91.             // 允许接收单元格引用的参数类型
  92.             return true;
  93.         }
  94.     }

  95.     // 自定义 CalcArray 类型
  96.     public class CCalcArray : CalcArray
  97.     {
  98.         object[,] items;

  99.         public CCalcArray(object[,] items)
  100.         {
  101.             this.items = (object[,])items.Clone();
  102.         }
  103.         public override int RowCount
  104.         {
  105.             get { return items.GetLength(0); }
  106.         }
  107.         public override int ColumnCount
  108.         {
  109.             get { return items.GetLength(1); }
  110.         }
  111.         public override object GetValue(int row, int column)
  112.         {
  113.             return items[row, column];
  114.         }
  115.     }
复制代码


源码下载:
6847_Formula.zip (7.46 KB, 下载次数: 983)
回复 使用道具 举报
zblongman
高级会员   /  发表于:2012-11-19 09:06:00
9#
谢谢 dof
我还有点疑问,我另外开个帖子吧!
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-11-19 17:49:00
10#
OK,我在另外一个帖子给你回复。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部