一段程序,希望可以帮你的忙!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;
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;
对其各列的宽度进行调整修改
wordTable.Columns.Item(第几列).SetWidth(宽度,1);
大致如此,用cobi的程序在编程时不会有Code Insight 提示,建议用Delphi自带的控件
有一个例子在Borland\Delphi5\Demos\Activex\Oleauto\SrvComp
只要将你(如果用QuickReport)的所有相关控件的值读一遍,按这个值在Word中生成一个一模一样的表格,然后挨个将数据库数据发送过去,反过来做也没有什么技术上的难题。只是好象有点自找麻烦——有好好的报表为什么不用。
征集高招!