本站首页    管理页面    写新日志    退出


«September 2025»
123456
78910111213
14151617181920
21222324252627
282930


公告
================

注会练习软件
http://www.cpasoft.com.cn
我的注会软件官网

http://blog.163.com/abc7105@126/

 

 


哈哈,热爱快“过气”的DELPHI


我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:注册会计师(注会)练习软件
日志总数:398
评论数量:116
留言数量:27
访问次数:3270496
建立时间:2005年6月6日




[delpih编程]给亿君表格 ejungrid增加处理excel的sunif函数功能
软件技术

吕向阳 发表于 2010/8/13 11:37:31

ejungrid亿君表格很强大,还体现自定义函数功能的扩充非常方便。在使用中我发现没有内置 sumif的excel函数,但我又着急用不能等升级,自己动手很方便,下面是sumif的代码 unit test_ejungrid; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, ZcCalcExpress, ZJGrid, ZcDataGrid, ZcUniClass,  ZcSheetControl, ZcFormulas, StdCtrls, ExtCtrls, ZcGridStyle,  ZcGridClasses; type  TstrArray = array of string;  TDataArray = array of Extended; type  TForm1 = class(TForm)    ejnlcns1: TEjunLicense;    ejungrid1: TEjunDataGrid;    btn1: TButton;    btn2: TButton;    dlgOpen1: TOpenDialog;    btn3: TButton;    procedure FormCreate(Sender: TObject);    procedure btn1Click(Sender: TObject);    procedure btn2Click(Sender: TObject);    procedure btn3Click(Sender: TObject);  private    { Private declarations }    function sumif(ACaller: TZcFormulaFunctionCaller; const Args: array of      TZcFormulaValue): TZcFormulaValue;  public    { Public declarations }  end; var  Form1: TForm1; implementation {$R *.dfm}   function TForm1.sumif(ACaller: TZcFormulaFunctionCaller; const Args: array of  TZcFormulaValue): TZcFormulaValue;   procedure ReadDataArray(var Data: TDataArray; Args: TZcFormulaValue);  var    iCount1: Integer;    iCol, iRow: Integer;    I: Integer;    strtmp: string;  begin    iCount1 := (Args.VRight - Args.VLeft + 1) * (Args.VBottom - Args.VTop + 1);    SetLength(Data, iCount1);    I := 0;    for iRow := Args.VTop to Args.VBottom do      for iCol := Args.VLeft to Args.VRight do      begin        Data[i] := 0;        strtmp := ACaller.GetSheetValue(Args.VSheet, iCol, iRow).AsString;        if trim(strtmp) = '' then          Data[i] := 0        else        begin          strtmp := stringreplace(strtmp, '''', '', [rfReplaceAll]);          strtmp := stringreplace(strtmp, ',', '', [rfReplaceAll]);          try            Data[i] := strtofloat(strtmp);          except           end;        end;        Inc(I);       end;  end;   procedure ReadstrArray(var Data: TstrArray; Args: TZcFormulaValue);  var    iCount1: Integer;    iCol, iRow: Integer;    I: Integer;  begin    iCount1 := (Args.VRight - Args.VLeft + 1) * (Args.VBottom - Args.VTop + 1);    SetLength(Data, iCount1);    I := 0;    for iRow := Args.VTop to Args.VBottom do      for iCol := Args.VLeft to Args.VRight do      begin        Data[I] := ACaller.GetSheetValue(Args.VSheet, iCol, iRow).asstring;        Inc(I);      end;   end;var  Data1: TstrArray;  Data2: TDataArray;  I: Integer;begin  if (Args[0].ValueType <> fvArea) and (Args[2].ValueType <> fvArea) then    raise Exception.Create('参数必须是范围类型');  // 把区域中的值读到动态数组中  ReadstrArray(Data1, Args[0]);  ReadDataArray(Data2, Args[2]);   if High(data1) <> High(data2) then    raise Exception.Create('第一个参数,第三个参数必须是范围类型,且范围大小相等!');   Result.ValueType := fvNumber;  Result.VNumber := 0;  for I := 0 to High(Data1) do  begin    if Trim(Data1[i]) = Trim(Args[1].vstring) then      Result.VNumber := Result.VNumber + Data2[I];  end; end; procedure TForm1.FormCreate(Sender: TObject);begin  // 注册自定义函数//  EjunDataGrid1.Formulas.UserFunctions.Add('fc', [ptNumber, ptNumber], ptNumber, 2, 2, FootCell);  EjunGrid1.Formulas.UserFunctions.Add(     //'fc', [ptNumber, ptNumber], ptNumber, 2, 2, FootCell);     'sumif', // 函数名称    [ptRef, ptstring, ptRef], // 定义定义函数的参数类型, 表明这个函数有两个引用类型的参数,                      // 如果输入其他类型的参数将会产生异常    ptNumber, // 定义返回值的类型    3, 3, // 指明函数参数个数, 最小参数个数和最大参数个数    sumif);end; procedure TForm1.btn1Click(Sender: TObject);begin  ejungrid1.SaveToExcel('d:\a000.xls', 'sheet1');end; procedure TForm1.btn2Click(Sender: TObject);begin  ejungrid1.LoadFromExcel('d:\a000.xls', 'sheet1');end; procedure TForm1.btn3Click(Sender: TObject);var file1: string;begin  dlgOpen1.Filter := '*.xls|*.xls';  if dlgOpen1.Execute then  begin    file1 := dlgOpen1.FileName;    ejungrid1.LoadFromExcel(file1);   end;   end; end.


阅读全文(2204) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144780930 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号