十年

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

导出DataSet中数据为Word文件之VBA实现篇

引言:
       由于项目中有客户要求将程序中的数据库导出为Word.Doc文件进行编辑和打印,所以忙乎了一个上午写了一个通用的类,不敢私藏,拿出来共享之。

    程序中借用delphiservers控件的相关word控件,通过OLEServerWord进行通信,并用VBA的方法画出一个表格,然后遍历数据库将字段值逐个写进表格单元。


    此方法虽然简单易用,但也有小小的缺陷,资料量大时速度会很慢,所以对于大量数据库导出建议还是用别的方法,或者改进此类。


    以下是类描述:

 

//========================================================//

重构Create方法(参数aDataSet用于传入一个TdataSet):

constructor TwsWord.Create(aDataSet: TDataSet);

begin

  inherited Create;

  FDataSet:= aDataSet;

  if not Assigned(FWordApp) then

  begin

    FWordApp := TWordApplication.Create(nil);

  end;

  if not Assigned(FWordDoc) then

  begin

    FWordDoc := TWordDocument.Create(nil);

  end;

end;


//========================================================//

声明一个public成员,用以外部调用,有两个参数(fileName为保存的文件名;wsVisible决定Word是否显示):

procedure TwsWord.SaveAsWord(const FileName: String; wsVisible: Boolean);

begin

  SavetoFile(FileName, wsVisible);

end;

 

//=========================================================//

声明一个private成员,用以内部集中调用,用以外部调用的过程通过它与内部通信:

procedure TwsWord.SavetoFile(FileName: OLEVariant; wsVisible: Boolean);

begin

  OpenWord(wsVisible);

  ReadDataset;

  FWordDoc.SaveAs(fileName);      

  if wsVisible= False then

  begin

    FWordApp.Quit;

  end;

  FWordApp.Disconnect;

end;

 

打开Word之后,进行资料读取并导出

//=================================================

procedure TwsWord.ReadDataset;

var

  wsSel: WordSelection;

  i, j, k, iTitleRow:integer;

  iRangeEnd: LongInt;

  wsTable: Variant;

  wsRange: Range;

  FCols:integer;

  FRows:Integer;

begin

  wsSel := FWordApp.Selection ;

  FWordFont.ConnectTo(wsSel.Font);     //用以改变字体样式等,暂未使用

  wsSel.TypeText('This is a PageTitle'); //段内容

  wsSel.TypeParagraph;                                             //分段

  wsSel.TypeText('');

  wsSel.TypeParagraph;

 

  FWordApp.ScreenUpdating := False;                      //关闭自动刷新

 

  iTitleRow := 1;                                                       //标题列,第一行

  if FDataSet.Active= True then

  begin

    FCols := FDataSet.FieldCount ;

    FRows := FDataSet.RecordCount+1;

  end;

 

  wsRange := FWordDoc.Paragraphs.item(2).Range;

  wsTable := FWordDoc.Tables.Add(wsRange,FRows, FCols, EmptyParam, EmptyParam);                                                                       //画表格

  wsTable.columns.AutoFit;

 

  k:=1;

  FDataset.DisableControls;

  for i:=0 to FDataSet.FieldCount-1 do

  begin 

    wsTable.Cell(1,k).Range.InsertAfter(fDataSet.Fields[i].FieldName);

    inc(k);

  end;

 

  k:=2;

  FDataSet.First;

  while not FDataSet.Eof do

  begin

    for j:=0 to FDataSet.FieldCount-1 do

    begin

      if (FDataSet.Fields[j].DataType=ftBlob) then

        wsTable.Cell(k,j+1).Range.InsertAfter('')

      else

        wsTable.cell(k,j+1).Range.insertAfter(fDataSet.Fields[j].AsString);

    end;

    inc(k);

    FDataset.Next;

  end;

  FDataSet.First;

  Fdataset.EnableControls;

  FWordApp.ScreenUpdating := True;

end;

 

调用实例:

procedure TForm1.Button1Click(Sender: TObject);

begin

  try

    with TwsWord.Create(AdoTable1) do

    begin

      SaveAsWord('C:\wsWord.doc',False);

    end;

  except

    showmessage('Error');

  end;

end;

 

    通过以上方法,能较为方便的导出资料至Word中,如果你也正在寻求这方面的解决方法,希望能给你提供一点点思路:)

 

源代码及演示下载请点击这里

作者声明:转载请注明文章出处
        文章出处:http://www.cnblogs.com/bonny.wong
        文章作者:bonny.wong(让思想飞翔)
        写作时间:2005-03-15

posted on 2005-03-15 15:40  留不住的时光  阅读(2836)  评论(1编辑  收藏  举报