Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 冲浪宝典 > 网络资源 > delphi 调用 Excel 宏
【标  题】:delphi 调用 Excel 宏
【关键字】:delphi,Excel
【来  源】:http://blog.csdn.net/handsome1234/archive/2007/02/14/1509820.aspx

delphi 调用 Excel 宏

Your Ad Here

delphi 调用 Excel 宏

我的理解宏就是函数,只要我能调用VBA的函数就算是调用Excel宏.
最近很长时间研究如何用delphi调用Excel宏,找了很多资料,大多是讲如何调用Excel,有好几种方式,但真正讲宏的很少,我现在把我的资料共享一下,省得今后有想了解这方面内容的兄弟姐妹们少走弯路。:
1、加载activex和vbide97单元,其中vbide97具体路径在C:\Program Files\Borland\Delphi5\Ocx\Servers下
   
{动态加载宏除了的几种方法:V.CodeModule.AddFromString
                          V.CodeModule.AddFromFile
                          V.CodeModule.InsertLines
还有一些方法在vbide97.pas里面都可以找到
}
其中V:_VBComponent;类型

我在 UseExcel单元中加了AddExcelMaro这个函数,可以直接调用。

下面是UseExcel.pas 其中是msgboxVBA的一个函数。

unit UseExcel;   //将数据导入Excel的单元
{XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}
Interface
Uses DBGrids,SysUtils,StdCtrls,ExtCtrls,Windows,Dialogs,Classes,Forms,Excel97,
Controls,DB,OleServer,activex,vbide97;
{------------------------------------------------------------------------------}
procedure PutOutData(DBN:TDataSet; PXM:TDBGrid);
//PXM=TDBGrid控件显示的内容, DBN=TDBGrid控件连接的TDataSet.
//将PXM显示的内容输出数据到Excel
procedure AddExcelMaro();
{------------------------------------------------------------------------------}
{XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}
Implementation
Var ExApp:TExcelApplication; ExlWb:TExcelWorkbook; ExWS:TExcelWorksheet;
{******************************************************************************}
Function CreateExcel:Boolean;
Begin
  ExApp:=TExcelApplication.Create(Forms.Application);//这里也很关键,在vbide里Application也是一个类型,所以只能在他前面加上Forms.,否则编译报错。
  ExApp.ConnectKind:=ckNewInstance;
  ExlWb:=TExcelWorkbook.Create(Forms.Application);
  ExlWb.ConnectKind:=ckRunningOrNew;
  ExWS:=TExcelWorksheet.Create(Forms.Application);
  ExWS.ConnectKind:=ckRunningOrNew;
  CreateExcel:=True;
  Try
  ExApp.Connect;
  Except
  CreateExcel:=False;
  ExApp.Free;
  ExlWb.Free;
  ExWS.Free;
  End;
End;
{******************************************************************************}
Function CheckPrtXM(DBN:TDataSet; DBField:String):Boolean; Var X:Integer;
Begin
  CheckPrtXM:=False;
  For X:=0 To DBN.FieldDefs.Count-1 Do If DBField=DBN.FieldDefs[X].Name Then
  Begin
    CheckPrtXM:=True;
    Exit;
  End;
End;
{******************************************************************************}
Procedure WriteToExcel(DBN:TDataSet; PXM:TDBGrid); Var X,Y,Row,Column:Integer;

Begin
  ExApp.Visible[0]:=True;
  ExApp.Caption:='编辑打印数据';
  ExApp.Workbooks.Add(Null,0);
  ExlWb.ConnectTo(ExApp.Workbooks[1]);
  ExWS.ConnectTo(ExlWb.Worksheets[1] as _Worksheet);
  Y:=1;
  For X:=0 To PXM.Columns.Count-1 Do If (PXM.Columns[X].Visible=True)
  And (CheckPrtXM(DBN,PXM.Columns[X].FieldName)=True) Then
  Begin
    ExWS.Cells.Item[1,Y]:=PXM.Columns[X].Title.Caption;
    Y:=Y+1;
  End;
  DBN.Last;
  DBN.First;
  Row:=2;
  While Not DBN.Eof Do
  Begin
    Column:=1;
    For X:=0 To PXM.Columns.Count-1 Do If(PXM.Columns[X].Visible=True)
    And(CheckPrtXM(DBN,PXM.Columns[X].FieldName)=True) Then
    Begin
      ExWS.Cells.Item[Row,Column]:=
      DBN.FieldByName(PXM.Columns[X].FieldName).AsString;
      Column:=column+1;
    End;
    DBN.Next;
    Row:=Row+1;
  End;
End;

procedure AddExcelMaro();
var
V:_VBComponent;
  vArg1, vArg2, vArg3, vArg4, vArg5, vArg6, vArg7, vArg8, vArg9, vArg10,
  vArg11, vArg12, vArg13, vArg14, vArg15, vArg16, vArg17, vArg18, vArg19, vArg20,
  vArg21, vArg22, vArg23, vArg24, vArg25, vArg26, vArg27, vArg28, vArg29, vArg30: OLEVariant;
begin
vArg1:= EmptyParam; vArg2:= EmptyParam; vArg3:= EmptyParam; vArg4:= EmptyParam;
      vArg5:= EmptyParam; vArg6:= EmptyParam; vArg7:= EmptyParam; vArg8:= EmptyParam;
      vArg9:= EmptyParam; vArg10:= EmptyParam; vArg11:= EmptyParam; vArg12:= EmptyParam;
      vArg13:= EmptyParam; vArg14:= EmptyParam; vArg15:= EmptyParam; vArg16:= EmptyParam;
      vArg17:= EmptyParam; vArg18:= EmptyParam; vArg19:= EmptyParam; vArg20:= EmptyParam;
      vArg21:= EmptyParam; vArg22:= EmptyParam; vArg23:= EmptyParam; vArg24:= EmptyParam;
      vArg25:= EmptyParam; vArg26:= EmptyParam; vArg27:= EmptyParam; vArg28:= EmptyParam;
      vArg29:= EmptyParam; vArg30:= EmptyParam;
  V:=ExlWb.VBProject.VBComponents.Add(TOleEnum($00000001));
  V.name:='Module';
//  V.CodeModule.AddFromString('Public Sub test() '+#13+'msgbox("test") '+#13+'end sub');
{动态加载宏除了的几种方法:V.CodeModule.AddFromString
                          V.CodeModule.AddFromFile
                          V.CodeModule.InsertLines
}
  ExApp.Visible[0] := True;
  ExApp.Run('test',vArg1, vArg2, vArg3, vArg4, vArg5, vArg6, vArg7, vArg8, vArg9, vArg10,
  vArg11, vArg12, vArg13, vArg14, vArg15, vArg16, vArg17, vArg18, vArg19, vArg20,
  vArg21, vArg22, vArg23, vArg24, vArg25, vArg26, vArg27, vArg28, vArg29, vArg30);

    ExApp.Disconnect;
    ExApp.Quit;
    ExApp.Free;
    ExlWb.Free;
    ExWS.Free;


end;

 


{******************************************************************************}
procedure PutOutData(DBN:TDataSet; PXM:TDBGrid);
Begin
  If CreateExcel=False Then ShowMessage('系统中未安装Excel') Else
  Begin
    WriteToExcel(DBN,PXM);


  End;
End;
{******************************************************************************}
end. 

List sessions and some details about them:【上一篇】
水彩效果渲染:【下一篇】
【相关文章】
  • DELPHI中ADOQUERY的传参数法与Oracle的GROUP BY子句
  • jsp导出Excel(续)
  • jsp导出Excel
  • 在Excel中引用多维数据库数据制作报表(正在补充......)
  • Delphi中使用ADO访问Paradox表
  • 把EXCEL的数据导入数据库(ACCESS、MSSQL等)
  • 把表的数据导出到EXCEL,同时还可以打印
  • 将GridView导出到Excel并防止内容乱码
  • Web页面的数据导出excel时的格式问题
  • ZT:利用Delphi全面控制Windows任务栏
  • 【随机文章】
  • 如何防止被挂马攻击
  • 如何限制某个用户访问oracle的进程(/processes?)数量?
  • 【原创】AJAX开发简略续一
  • 根据接受的数字在控制台打印出各种大小的菱形
  • C ---> C++
  • Linux 编程之交叉编译
  • xiaoshen.exe详细信息(转)
  • ODM
  • 那些花儿MV
  • 无线网状网把以太网边缘扩展到无限
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.