生成word文档的问题

大风吹过脸颊 2013-05-03 03:49:22
我需要将一个dbgrideh中的所有内容插入到一个已有的word文档中形成一个合同,目前用以下代码实现了导出dbgrdieh到word中,但是这个自动创建了新的word代码从第一行开始的。而我这合同前后都有内容,只能把导出的表格插在中间,请问要怎么改才能输出到指定位置呢?请高手指点,谢谢


Function DBGird2Word(DBGrid: TDBGridEh): Boolean;
var
Count,I,J:Integer;
Doc:OleVariant;
CurrColumn,RecordNum:Integer;
wTable: Variant;
begin
try
Doc:=CreateOleObject('Word.Application');
Doc.Visible:=True;
Doc.Documents.Add;
except
Result:=false;
Exit;
end;

Count:=DBGrid.Columns.Count-1;
CurrColumn:=0;

for I:=0 to Count do
begin
if DBGrid.Columns.Items[I].Visible then
begin
Inc(CurrColumn);
end;
end;

RecordNum:=DBGrid.DataSource.DataSet.RecordCount+1;
wTable:=Doc.ActiveDocument.Tables.Add(Doc.ActiveDocument.Range(0, 0),RecordNum,CurrColumn);
wTable.Columns.AutoFit;
CurrColumn:=0;

for I:=0 to Count do
begin
if DBGrid.Columns.Items[I].Visible then
begin
wTable.Cell(1,CurrColumn+1).Range.InsertAfter(DBGrid.Columns.Items[I].Title.Caption);
Inc(CurrColumn);
end;
end;
J:=1;
DBGrid.DataSource.DataSet.First;

while not DBGrid.DataSource.DataSet.Eof do
begin
Inc(J);
CurrColumn:=0;
for I:=0 to Count do
begin
if DBGrid.Columns.Items[I].Visible then
begin

wTable.Cell(J,CurrColumn+1).Range.InsertAfter(DBGrid.Columns[I].Field.DisplayText);
Inc(CurrColumn);
end;
end;
DBGrid.DataSource.DataSet.Next;
end;
end;
...全文
164 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
bihai 2013-05-05
  • 打赏
  • 举报
回复
使用方法为: DBGird2Word2(DBGridEh1,3,1); function DBGird2Word2(DBGrid: TDBGridEh;iRow:Integer;iTable:Integer=1): Boolean; // IRow 为插入的行号(表头在内) iTable为DOC中的第几个表 var Count, I, J: Integer; Doc: OleVariant; CurrColumn, RecordNum: Integer; wTable: Variant; begin try Doc := GetActiveOleObject('Word.Application'); Doc.Visible := True; except Result := false; Exit; end; Count := DBGrid.Columns.Count - 1; CurrColumn := 0; for I := 0 to Count do begin if DBGrid.Columns.Items[I].Visible then begin Inc(CurrColumn); end; end; RecordNum := DBGrid.DataSource.DataSet.RecordCount; wTable := Doc.ActiveDocument.Tables.Item(iTable); wTable.Rows.Item(iRow).Select; Doc.Application.Selection.InsertRowsAbove(RecordNum); J := iRow-1; DBGrid.DataSource.DataSet.First; while not DBGrid.DataSource.DataSet.Eof do begin Inc(J); CurrColumn := 0; for I := 0 to Count do begin if DBGrid.Columns.Items[I].Visible then begin //导出数据 wTable.Cell(J, CurrColumn + 1).Range.InsertAfter(DBGrid.Columns[I].Field.DisplayText); Inc(CurrColumn); end; end; DBGrid.DataSource.DataSet.Next; end; Result := True; end;
大风吹过脸颊 2013-05-04
  • 打赏
  • 举报
回复
目前下面的代码是从word的第一行开始插入。按理说,Range(0,0) 应该是位置,但是只要写成 Range(3,0),就会报错“数值超出范围”,我想从第三行开始插入,要怎么修改才能实现呢?这个word文档是一个已有的doc,有三页,行是有的。 wTable:=Doc.ActiveDocument.Tables.Add(Doc.ActiveDocument.Range(0,0),RecordNum,CurrColumn); wTable.Columns.AutoFit;
虎子8 2013-05-03
  • 打赏
  • 举报
回复
wTable:=Doc.ActiveDocument.Tables.Add(Doc.ActiveDocument.Range(0, 0),RecordNum,CurrColumn); Doc.ActiveDocument.Range(0, 0) 这就是控制你要插入的位置啊,你得先定位到你要插入的位置 操作word api我的资源里面有

2,496

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧