delphi操作word -- 转


转自 http://xxzqb.blog.163.com/blog/static/4122142920089249514506/


   开发原因:公司财务要每月与专卖店对帐,其对帐单格式是统一的,只是每月改变其中的数据。

如下图:

所以,我设置了一个模板,名字为 xldzd.dot ,格式如下:

即把每月要修改的数据做成批注。

然后在 d:\对帐单 目录下创建 每月的目录,其名称为日期,如: d:\对帐单\2008-10 。(这部分是由程序产生)

然后,查询数据表(adoquery),

在刚才建立的目录下,产生word文档,上面查询出的数据依次替换 批注,完毕后,删除批注,并且关闭该word文档,然后继续替换,每一个专卖店产生一个word文档,其名称为专卖店的email 。 在电脑中的结果如下图:

 

 

程序的关键语句在 procedure TForm9.Button3Click(Sender: TObject);

 

unit Unit9;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, Grids, DBGrids, StdCtrls, DBXpress, SqlExpr, DBTables,
  WordXP, OleServer, ComCtrls;

type
  TForm9 = class(TForm)
    Button1: TButton;
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    WordDocument1: TWordDocument;
    WordApplication1: TWordApplication;
    OpenDialog1: TOpenDialog;
    Button3: TButton;
    StatusBar1: TStatusBar;
    ADOConnection2: TADOConnection;
    ADOQuery2: TADOQuery;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure deletecomment();
    procedure writecomment(explans:array of string);
    procedure wordini(template:olevariant);
    procedure setopendialog;
    procedure substpostils(postils:array of string);
    procedure deletepostils;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form9: TForm9;
  ptotal:integer;

implementation

uses Unit10;

{$R *.dfm}
procedure TForm9.deletecomment;
var
   total:integer;
begin
   total:=worddocument1.Comments.Count;
   while total<>0 do
      begin
       worddocument1.comments.item(total).Delete;
       total:=worddocument1.comments.Count;
      end;
end;

procedure TForm9.wordini(template: olevariant);
var
   newtemplate,itemindex:olevariant;
begin
   newtemplate:=false;
   itemindex:=1;

   try
      wordapplication1.Connect;
   except
      wordapplication1.Disconnect;
      messagedlg('请安装Office中的Word软件!',mterror,[mbok],0);
      exit;
   end;
   wordapplication1.Visible:=true;
   wordapplication1.Documents.Add(template,newtemplate,emptyparam,emptyparam);
   worddocument1.ConnectTo(wordapplication1.Documents.Item(itemindex));

   ptotal:=worddocument1.Comments.count;
end;

procedure TForm9.writecomment(explans: array of string);
var
    i,total:integer;
begin
    total:=worddocument1.Comments.Count;
    for i:=0 to total do
        worddocument1.Comments.item(i).Scope.Text:=explans[i-1]

end;

procedure TForm9.setopendialog;
var
     pathname,filename:string;
begin
    //保证选择的文件必须存在
    opendialog1.Options:=[offilemustexist];
    opendialog1.filter:='word files(*.dot)|*.dot|all files(*.*)|*.*';
    //设置*.dot类型为缺省类型
    opendialog1.FilterIndex:=1;
    //设置文档模板文件名为缺省值
    opendialog1.FileName:='xldzd.dot';

    if not opendialog1.Execute then
        exit;
    pathname:=extractfilepath(opendialog1.FileName);
    filename:=extractfilename(opendialog1.FileName);

    if lowercase(copy(filename,length(filename)-4+1,4))<>'.dot' then
        begin
            messagedlg('请打开Word模板文件!',mterror,[mbok],0);
            exit;
        end;
    if lowercase(filename)<>'xldzd.dot' then
        begin
            messagedlg('请选择正确的Word模板文件!',mterror,[mbok],0);
            exit;
        end;
end;

procedure TForm9.substpostils(postils: array of string);
var
   i:integer;
begin
   //逐个替换批注
   for i:=1 to ptotal do
      begin
          worddocument1.Comments.Item(i).Scope.Text:=postils[i-1];
      end;

end;

procedure TForm9.deletepostils;
var
    total:integer;
begin
    total:=ptotal;
    while total<>0 do
        begin
            //删除文档中的一个批注
            worddocument1.comments.Item(total).Delete;
            //获得文档中的剩余批注总数
            total:=worddocument1.Comments.Count;
        end;
end;

procedure TForm9.Button1Click(Sender: TObject);
begin
//查询富友中的数据(太慢)
 with adoquery2 do
        begin
            close;
            sql.clear;
            sql.add('select kcckdm,sum(kcqcje),sum(kcrkje),sum(kcckje) from kct06');
            sql.add('where kckjnd=2008 and kckjyf=8');
            sql.Add('group by kcckdm');
            sql.add('order by kcckdm');
            open;

 

            //下面代码没问题
            {close;
            sql.clear;
            sql.add('select * from ylm03');
            open; }
        end;

 


end;

procedure TForm9.Button3Click(Sender: TObject);
var
    postils:array of string;
    //y,m,d:word;
    pathname,filename:string;
    savedocfile,emptypara:olevariant;

//这些都是目录名称

    dir:string;
   
    currdir:string;
    dirname:string;
    curr_dir:string;
begin

   //先建立文件夹 (放在d:\对帐单\下)

    //先判断文件夹是否已存在 , 不存在,就创建之
    if not directoryexists('d:\对帐单') then
           begin
              try
               //创建文件夹
               mkdir('d:\对帐单');
               statusbar1.Panels[2].Text:='  ① d:\对帐单 目录创建成功!';

              except
               statusbar1.Panels[2].Text:='  ③ d:\对帐单 目录无法创建!';;
               exit;
              end;
           end else
           begin
               statusbar1.Panels[2].Text:='  ② d:\对帐单 目录已经存在!';
              
           end;

 

    //把日期当前日期当作新建文件夹的名称
     dir:=formatdatetime('yyyy-mm',date);
    
     try
         //改变当前文件夹为 d:\对帐单
         chdir('d:\对帐单');
         //取得当前文件夹,赋值给变量 currdir
         getdir(0,currdir);
         statusbar1.Panels[2].Text:='  ④ 当前目录为:'+currdir;
     except

     end;

     //在文件夹 d:\对帐单 下根据日期创建文件夹,文件夹名为日期
     if not directoryexists('d:\对帐单\'+dir) then
           begin
              try
               //创建文件夹
               mkdir('d:\对帐单\'+dir);
               statusbar1.Panels[2].Text:='  ⑤ d:\对帐单\'+dir+' 目录创建成功!';

              except
               statusbar1.Panels[2].Text:='  ⑥ d:\对帐单\'+dir+' 目录无法创建!';;
               exit;
              end;
           end else
           begin
               statusbar1.Panels[2].Text:='  ⑦ d:\对帐单\'+dir+' 目录已经存在!';
               //exit;
           end;

     //转换当前文件夹至 d:\对帐单\日期
     try
         //改变当前文件夹为 d:\对帐单\日期
         chdir('d:\对帐单\'+dir);
         //取得当前文件夹,赋值给变量 curr_dir
         getdir(0,curr_dir);
         statusbar1.Panels[2].Text:='  ⑧ 当前目录为:'+curr_dir;
     except

     end;
     //------------------------------------------------------------

 

 


    //setopendialog;
    //保证选择的文件必须存在
    opendialog1.Options:=[offilemustexist];
    opendialog1.filter:='Word Files(*.dot)|*.dot|All Files(*.*)|*.*';
    //设置*.dot类型为缺省类型
    opendialog1.FilterIndex:=1;
    //设置文档模板文件名为缺省值
    opendialog1.FileName:='xldzd.dot';

    //如果打开对话框没有运行,就退出
    if not opendialog1.Execute then
        exit;
    //赋文件名
    pathname:=extractfilepath(opendialog1.FileName);
    filename:=extractfilename(opendialog1.FileName);

    if lowercase(copy(filename,length(filename)-4+1,4))<>'.dot' then
        begin
            messagedlg('请打开Word模板文件!',mterror,[mbok],0);
            exit;
        end;
    if lowercase(filename)<>'xldzd.dot' then
        begin
            messagedlg('请选择正确的Word模板文件!',mterror,[mbok],0);
            exit;
        end;

 


     //查询出要插入的数据表数据
     with adoquery1 do
        begin
            close;
            sql.clear;
            sql.add('select * from xldzd');
            open;
            first;
            //赋值给批注
            while not adoquery1.Eof do
                begin
                        wordini(pathname+filename);
                        setlength(postils,ptotal);
                        postils[0]:=trim(fieldbyname('t1').asstring);
                        postils[1]:=trim(fieldbyname('t2').asstring);
                        postils[2]:=trim(fieldbyname('t3').asstring);
                        postils[3]:=trim(fieldbyname('t4').asstring);
                        postils[4]:=trim(fieldbyname('a1').asstring);
                        postils[5]:=trim(fieldbyname('a2').asstring);
                        postils[6]:=trim(fieldbyname('a3').asstring);
                        postils[7]:=trim(fieldbyname('a4').asstring);
                        postils[8]:=trim(fieldbyname('a5').asstring);
                        postils[9]:=trim(fieldbyname('b1').asstring);
                        postils[10]:=trim(fieldbyname('b2').asstring);
                        postils[11]:=trim(fieldbyname('b3').asstring);
                        postils[12]:=trim(fieldbyname('b4').asstring);
                        postils[13]:=trim(fieldbyname('b5').asstring);

                        //填充批注
                        substpostils(postils);
                        //删除批注
                        deletepostils;

                        //保存目录及文件 ,文件名为 email.doc
                        savedocfile:=curr_dir+'\'+fieldbyname('email').asstring+'.doc';
                        emptypara:=emptyparam;
                        //保存文档
                        worddocument1.SaveAs(savedocfile,emptypara);
                        //关闭该文档
                        worddocument1.Close;

                        next;
                end;
        end;


        statusbar1.Panels[3].Text:='  对帐单已全部保存完毕!';
        //最后关闭word
        wordapplication1.Disconnect;

end;

end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值