一段程序,希望可以帮你的忙!procedure TForm4.BinWordClick(Sender: TObject);
var
  WordApp,WordDoc,WordParagraph,WordRange,WordTable:variant;
  SltRec,SltCol,VisCol :integer;
  ColIndex,RowIndex : Integer;
  I,J : integer;
  PrintAll : Boolean;
begin
  PrintAll := false;
  if DBGrid1.SelectedRows.Count = 0 then
  begin
    if MessageDlg('当前没有选定打印的记录,是否全部打印?',mtconfirmation,[Mbyes,Mbno],0) = mrno then
    begin
      Application.MessageBox(pchar('没有选定的数据记录,打印终止!'),pchar('注意'),mb_ok);
      Abort;
    end else
      PrintAll := true;
  end;  try
    if VarIsEmpty(WordApp) then
      WordApp := CreateOleObject('word.Application');    WordDoc := WordApp.documents.add;
    WordParagraph := WordApp.activedocument.paragraphs.add;    WordRange := WordParagraph.range;
    WordRange.Font.Size := 18;
    WordRange.Font.Name := '宋体';
  except
    Application.MessageBox(pchar('Ms Word 无法启动,数据转入终止!'),pchar('注意'),mb_ok);
    Abort;
  end;  //统计打印行数
  if PrintAll then
    SltRec := dm1.QryMain.RecordCount
  else
    SltRec:=DBGrid1.SelectedRows.Count;  //统计打印列数
  SltCol := 0;
  VisCol := 0;
  for j := 0 to DBGrid1.Columns.Count-1 do
  begin
    if DBGrid1.Columns[J].Visible then
    begin
      VisCol := VisCol + 1;      if DBGrid1.Columns[j].Title.Color=clAqua then
      begin
        SltCol := SltCol + 1;
      end;
    end;
  end;
  if SltCol = 0 then
    SltCol := VisCol;  WordRange := WordApp.ActiveDocument.Content;
  WordRange.Collapse(wdCollapseEnd);
  WordTable:= WordApp.activedocument.tables.add(WordRange,SltRec + 1,SltCol);  {打印表头}
  ColIndex := 1;
  for  j := 0 to dbgrid1.Columns.Count-1  do
  begin
    if SltCol <> VisCol then
    begin
      if (dbgrid1.Columns[j].Visible = false) or (dbgrid1.Columns[j].Title.color <> clAqua) then
        Continue;
    end;    WordTable.Cell(1,ColIndex).Range.InsertAfter(dbgrid1.Columns[j].Title.Caption);
    DBGrid1.Columns[J].Title.Color := clAqua;
    ColIndex := ColIndex + 1;
  end;  //打印数据
  dm1.QryMain.First;
  RowIndex := 2;
  ColIndex := 1;
  while not dm1.QryMain.Eof do
  begin
    if SltRec <> dm1.QryMain.RecordCount then
    begin
      if dbgrid1.SelectedRows.CurrentRowSelected = false then
      begin
        dm1.QryMain.Next;
        Continue;
      end;
    end;    for j := 0 to dbgrid1.Columns.Count-1 do begin
      if (dbgrid1.Columns[j].Visible<>false) and (dbgrid1.Columns[j].Title.color=clAqua) then
      begin
        WordTable.Cell(RowIndex,ColIndex).Range.InsertAfter
          (dm1.QryMain.Fieldbyname(dbgrid1.Columns[j].FieldName).asstring);
        ColIndex := ColIndex + 1;
      end;
    end;
    RowIndex := RowIndex + 1;
    ColIndex := 1;
    dm1.QryMain.Next;
  end;{End of While...not...}
  WordApp.Visible := true;
  for j := 0 to dbgrid1.Columns.Count-1 do
    DBGrid1.Columns[J].Title.Color := clAqua;
end;

解决方案 »

  1.   

    我要的是,将生成的报表输出到WORD,就是将预览时所看到的东西原原本本输出到WORD,请问,谁有高招?
      

  2.   

    第一个问题cobi(小新国际)已经说的很明白
     
    对其各列的宽度进行调整修改
    wordTable.Columns.Item(第几列).SetWidth(宽度,1);
    大致如此,用cobi的程序在编程时不会有Code Insight 提示,建议用Delphi自带的控件
    有一个例子在Borland\Delphi5\Demos\Activex\Oleauto\SrvComp
      

  3.   

    你的问题有点怪,但也不是不能实现。
    只要将你(如果用QuickReport)的所有相关控件的值读一遍,按这个值在Word中生成一个一模一样的表格,然后挨个将数据库数据发送过去,反过来做也没有什么技术上的难题。只是好象有点自找麻烦——有好好的报表为什么不用。
      

  4.   

    没有高人会做吗? 或者有现成的控件将报表转化成word文件?大家帮忙!
      

  5.   

    不行,我要的是将自己做好的报表输出到WORD里,而小新的是将数据集的数据直接往WORD里写。
    征集高招!
      

  6.   

    那就按照wk_knife(我是石油工人多荣耀,头戴铝盔走天涯)的方法~~将你(如果用QuickReport)的所有相关控件的值读一遍,按这个值在Word中生成一个一模一样的表格