求用Delphi控制WORD的文档的完整可下载的例子,要求如下(30分)

  • 主题发起人 主题发起人 TENTODBV
  • 开始时间 开始时间
T

TENTODBV

Unregistered / Unconfirmed
GUEST, unregistred user!
把数据库的内容提取出来插入到预先制做好的复杂的WORD的模板文档中。
我看了一下这个网址的例子
http://www.oioj.net/blog/user2/16727/archives/2005/98541.shtml
可是总是无法调试通过,在执行到WordDocument1.Range.Find.Executeold(....)语句时发生"Access Violation at address xxxxxxxx module oleaut32.dll"错误。

给出的例子不一定非要是把数据库的内容插入WORD文档,随便插入字符串也行,能说明问题即可。
 
插入倒是不难!我知道可以用书签的方式;
在指定的书签名处插入相应的文本!
var tmpstring:String;
...
tmpstring:=table1.fieldbyname('MM1').AsString;
BookMark1:='addr';
try
WordApp.ActiveDocument.Bookmarks.Item(BookMark1).Range.InsertAfter(tmpstring);
except
end;
 
你可以尝试用一下Servers下的WordApplication等相关组件。
 
procedure TFrmCertificate_Sample.Word2000Instrument(var FTable: Table);
var
OleWhat,OleWhich,OleCount,OleName:OleVariant;
FRow,I:Integer;
FLevel:Integer;
begin
OleWhat:=wdGoToBookmark; OleName:='Instrument';
OleWhich:=emptyenum; OleCount:=emptyenum;
Word2000.Selection.GoTo_(OleWhat,OleWhich,OleCount,OleName);
FLevel:=Word2000.Selection.Tables.Item(1).NestingLevel;
if FLevel>1 then
Word2000.Selection.Tables.Item(1).Delete;
//----------------
if MyFrame.Suffix='测试报告' then Exit;
Word2000Table(FTable,100,9,FRowCount+1,5,False);
with FTable do
begin
Cell(1,1).Range.Text:='名称';
Cell(1,2).Range.Text:='规格型号';
Cell(1,3).Range.Text:='测量范围';
Cell(1,4).Range.Text:='不确定度/准确度';
Cell(1,5).Range.Text:='证书编号';
//------------------填写数据-------------
FRow:=2;
for I:=1 to StoreGrid.RowCount-1 do
begin
if StoreGrid.Cells[0,I]<>'' then
begin
Cell(FRow,1).Range.Text:=StoreGrid.Cells[1,I];
Cell(FRow,2).Range.Text:=StoreGrid.Cells[2,I];
Cell(FRow,3).Range.Text:=StoreGrid.Cells[3,I];
Cell(FRow,4).Range.Text:=StoreGrid.Cells[4,I];
Cell(FRow,5).Range.Text:=StoreGrid.Cells[5,I];
FRow:=FRow+1;
end;
end;
end;//end table
end;
--------
procedure TFrmCertificate_do.Word2000ReplaceText(FSection:Boolean;OldText,
ReplaceText: String);
var
OleForword,OleRelaceOption:OleVariant;
OleFindText,OleReplaceText:OleVariant;
begin
OleForword:=wdForward;
OleRelaceOption:=wdReplaceAll;
OleFindText:=OldText;
OleReplaceText:=ReplaceText;
if FSection then
Word2000.Selection.Sections.Item(1).Headers.Item(1).Range.Find.ExecuteOld(
OleFindText,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
OleForword, EmptyParam,EmptyParam,OleReplaceText,OleRelaceOption)
else
Word2000.Selection.Range.Find.ExecuteOld(OleFindText,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,OleForword, EmptyParam,EmptyParam,
OleReplaceText,OleRelaceOption);
end;
以上都是成功的函数代码。。。,如果出现请检查你的DELPHI是不是出问题了。
 
能否给个简化的例子。拿到代码粘贴后,最多添加几个采用默认名称的控件即可直接运行的那种。
说明需要添加的控件(全部用默认名称)。需要手工添加引用的单元以及预先制做的模板文档的内容是怎样的。

还有,Word2000Table过程是在那里定义的?
 
procedure TFrmCertificate_do.Word2000Table(var FTable: Table; TableSize,FontSize: Single;
FRowNum, FColNum: Integer; BorderIndex: Boolean);
begin
//Selection 仅仅指当前选取区域
FTable:=Word2000.Selection.Tables.Add(Word2000.Selection.Range,FRowNum,FColNum,
EmptyParam,EmptyParam);
FTable.Range.Font.Name:=MyFrame.FontName;
FTable.Range.Font.Size:=FontSize;
FTable.PreferredWidthType:=wdPreferredWidthPercent;
FTable.PreferredWidth:=TableSize;
with FTable do
begin
//-----如果不是,设置为无边框-------
TopPadding:=Word2000.CentimetersToPoints(0);
BottomPadding:=Word2000.CentimetersToPoints(0);
LeftPadding:=Word2000.CentimetersToPoints(0);
RightPadding:=Word2000.CentimetersToPoints(0);
Spacing:=0;
AllowPageBreaks:=True;
AllowAutoFit:=False;
if BorderIndex=False then
begin
Borders.Item(wdBorderLeft).LineStyle:=wdLineStyleNone;
Borders.Item(wdBorderRight).LineStyle:=wdLineStyleNone;
Borders.Item(wdBorderTop).LineStyle:=wdLineStyleNone;
Borders.Item(wdBorderBottom).LineStyle:=wdLineStyleNone;
Borders.Item(wdBorderHorizontal).LineStyle:=wdLineStyleNone;
Borders.Item(wdBorderVertical).LineStyle:=wdLineStyleNone;
Borders.Item(wdBorderDiagonalDown).LineStyle:=wdLineStyleNone;
Borders.Item(wdBorderDiagonalUp).LineStyle:=wdLineStyleNone;
Borders.Shadow:=False;
end;
//------设置表格对齐方式---------------
FTable.Columns.PreferredWidthType:=wdPreferredWidthAuto;
FTable.Range.ParagraphFormat.Alignment:=wdAlignParagraphCenter;
Range.Cells.VerticalAlignment:=wdCellAlignVerticalCenter;
Rows.Alignment:=wdAlignRowCenter;
end;
end;
唉以上的是样板,包括替换标签,定义表格,替换字符修正模板等。
自己照着改喽,
WORD2000就是WORDAPPLICATION控件。
 
FRowCount 在哪定义?
 
你们好,我也想实现这样的功能,可否给出一个比较完整的代码呢,我的qq:444094419
 
FRowCount就是一个TStringGrid的行数,随便定义了的全局变量了。
 
在servers面板添加wordapplication控件,并重命名为wordapp
var
TemplateName, NewTemplate, ItemIndex: OleVariant;
vTB: Table;
vBM: BookMark;
i: Integer;
begin
try
WordApp.Connect();
except
MEssageBox(handle, '您的计算机上还未安装Microsoft Office Word97或更高的版本!', '错误', MB_ICONHAND);
Exit;
end;

TemplateName := ExtractFilePath(ParamStr(0)) + 'GZ1.DOT';
NewTemplate := false;
WordApp.Documents.AddOld(TemplateName, NewTemplate); //以模板打开
WordApp.Caption := '工资条报表';

for i := 1 to 6 do
begin
ItemIndex := i;
vBM := WordApp.ActiveDocument.Bookmarks.Item(ItemIndex);
vBM.Select;//已做好的模板中有六个书签,循环每个书签并选择
WordApp.Selection.InsertAfter('5');//在书签位置插入字符
vTB := WordApp.ActiveDocument.Tables.Item(i);//在模板中有六个表格
vTB.Cell(0, i).Range.Text := 'test';//在每个表格的第二行表格插入字符
end;

//是否打印创建好的WORD
if MEssageBox(handle, '工资条报表已创建完成,是否打印?', '提示', MB_ICONQUESTION or MB_YESNO or MB_DEFBUTTON2) = IDYES then WordApp.PrintOutOld;
WordApp.ActiveDocument.Close(EmptyParam, EmptyParam, EmptyParam);//关闭WORD
WordApp.Disconnect();//断开连接
WordApp.Quit;//退出WORD
 
请看以下地址

http://www.139chat.com/?user=dwxdzx
 
后退
顶部