如何实现在一个Word文件上输出内容(300分)

  • 主题发起人 主题发起人 vine
  • 开始时间 开始时间
V

vine

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在有一个Word文档,是一个传真件模板
我现在想在数据库中读取一些内容
如传真收件人,内容等
写入到文档中的指定位置
要如何做呢?
谢谢
 
以前写的小东西
procedure TDataConver.BitBtn8Click(Sender: TObject);

var
i,row,column:integer;
RangeW: Word2000.Range;
v1: Variant;
Row1: Word2000.Row;
begin
if (RadioButton1.Checked) then //word开始
begin
if (RadioButton4.Checked) then
begin
ADOTable1.TableName:='员工信息';
ADOTable1.Open;
wordapplication1.Connect;
wordapplication1.Visible:=true;
while not adoTable1.EOF do
begin
WordDocument1.Range.InsertParagraphAfter;
WordDocument1.Paragraphs.Last.Range.Text :=adotable1.fieldbyname('员工编号').AsString +
#9 + adotable1.fieldbyname('姓名').AsString +
#9 + adotable1.fieldbyname('年龄').AsString +
#9 + adotable1.fieldbyname('性别').AsString +
#9 + adotable1.fieldbyname('出生日期').AsString +
#9 + adotable1.fieldbyname('学历').AsString +
#9 + adotable1.fieldbyname('政治面貌').AsString +
#9 + adotable1.fieldbyname('联系电话').AsString;
adoTable1.Next;
end;
RangeW := WordDocument1.Content;
v1 := RangeW;
v1.ConvertToTable (#9, 8);
Row1 := WordDocument1.Tables.Item(1).Rows.Get_First;
Row1.Range.Bold := 1;
Row1.Range.Font.Size := 5;
Row1.Range.InsertParagraphAfter;
end;
DataConver.Close;
end;
 
用Selection.TypeText
 
这是我写的一个word操作类中的一个函数,其中使用特殊字符串功能替换的方法实现
procedure TWordObj.Replace(str1,str2 : String);
var
findtext, matchcase, matchwholeword,
matchwildcards, matchsoundslike,
matchallwordforms, forward,
wrap, format, replacewith,
replace: OleVariant;
begin
findtext :=str1;
matchcase := false;
matchwholeword := true;
matchwildcards := false;
matchsoundslike := false;
matchallwordforms := false;
forward := true;
wrap := wdFindContinue;
format := false;
replacewith :=str2;
replace := true;
FWordApp.Selection.Range.Find.ExecuteOld(findtext, matchcase, matchwholeword,
matchwildcards, matchsoundslike, matchallwordforms, forward,
wrap, format, replacewith, replace);
end;
 
同意楼上说的,如果添加内容不多的话,用替换的方法是最佳的了。
 
如果我有个Memo字段的

格式的控制可能不好吧??
 
用word的域,先设定好文档的格式,然后对指定的域操作,代码和楼上差不多。

for i :=olecWord.OleObject.application.ActiveDocument.Fields.Count downto 1 do
begin
str :=
olecWord.OleObject.application.ActiveDocument.Fields.item(i).Code.Text;
if str <> ' FORMTEXT ' then
begin
lFieldName := GetRefName(str);
if lFieldName <> '' then
begin
olecWord.OleObject.application.ActiveDocument.Fields.item(i).select;

{为了保持域中字段的字体格式不变;测试}

wordfont1.AutoConnect := true;

WordApplication1.AutoConnect := true;

wordfont1.ConnectTo(WordApplication1.Selection.Font);

lFormField := olecWord.OleObject.FormFields.Add(
olecWord.OleObject.application.Selection.Range,
wdFieldFormTextInput);
//为了保持域中字段的字体格式不变;测试

lFormField.select;
WordApplication1.Selection.Font := wordfont1.Duplicate;


lFormField.Name := lFieldName + '_机添_' + inttostr(i);
olecWord.OleObject.AcceptAllRevisions;

lFiledValue := lFieldDatasetList.Values[lFieldName];
lFieldDatasetList.Add(lFieldName + '_机添_' + inttostr(i)
+
'=' + lFiledValue);
Memo1.Lines.Add(' 域修改纪录:' + str + ' => ' +
lFieldName + '_机添_' + inttostr(i));
modify := true;
end;
end;
end;
end;
 
既然是模板,可以在里面添加一些书签,设好书签位置的格式就行了

NewTemplate := DocFileNameWithPath;
NoneTemplate := EmptyParam;
dataform.WordApplication1.Connect;
dataform.WordApplication1.Visible:=true;
MyDoc:=dataform.WordApplication1.Documents.Add(NewTemplate,NoneTemplate);

MyDoc.BookMarks.Item('SBND_1').Select;
dataform.WordApplication1.Selection.Text := SB_Year;

MyDoc.BookMarks.Item('XMBH').Select;
dataform.WordApplication1.Selection.Text := dataform.Query2.fieldbyname('BH').asstring
 
帮你up,顺便问一下我想在word中当前鼠标位置增加图片怎么做?
附在指定的位置(数字)添加图片:
var
MS: TStream;
FPicture:OleVariant;
FS:TMemoryStream;
begin
Result := True;
try
Table1.Locate('curNo',curRow,[]);
with Table1 do
MS:=CreateBlobStream(FieldbyName('Image'),bmRead);
if MS.Size > 100 then
begin
try
FS := TMemoryStream.Create;
FS.LoadFromStream(MS);
FS.SaveToFile('temp.jpg');
FPicture:=WordApplication1.documents.Item(ItemIndex).InlineShapes.AddPicture('temp.jpg',EmptyParam,EmptyParam, EmptyParam);
FPicture.ConvertToShape.select;
WordDocument1.Application.Selection.ShapeRange.width:=100;
WordDocument1.Application.Selection.ShapeRange.height:=100;
if imgnum = 3 then
begin
imgnum := 0;
WordDocument1.Application.Selection.ShapeRange.IncrementLeft(100*imgnum);
WordDocument1.Application.Selection.ShapeRange.IncrementTop(100*(imgnum div 3));
end;
finally
FS.Free;
DeleteFile('temp.jpg');
end;
end
else
Result := False;
finally
MS.Free;
end;
end;
 
agree with dogfish
 
看我的在WORD中生成表格后插入
var
i,j:integer;
str,str_name:string;
WordApp,WordDoc,WordParagraph,WordRange,WordTable:variant;
SltRec,SltCol,ColIndex,RowIndex : Integer;
begin
//导出EXCEL文件
if listbox3.Items.Text='' then begin
application.MessageBox('数据信息不能为空,请选择“数据库字段名”!','亿业后勤管理系统',mb_iconerror+mb_ok);
exit;
end else begin
str_name:=listbox1.Items[listbox1.ItemIndex];
if listbox3.Count>0 then begin
with data.gg do begin
close;
sql.Text:='select * from '+str_name;
open;
end;
if application.MessageBox('确认要导出数据吗?如果数据量过大,将会有一段时间不能响应!','警告!',MB_OKCANCEL+MB_ICONQUESTION)=IDCANCEL then
exit;
try
WordApp := CreateOleObject('word.Application');
Worddoc := WordApp.documents.add;
wordapp.application.visible:=true;
WordParagraph := WordApp.activedocument.paragraphs.add;
WordRange := WordParagraph.range;
except
showmessage('请确认WORD安装正确!');
end;
export_form.Cursor:=crSQLWait;
begin
statusbar1.Panels[3].Text:='正在导出...!';
i:=0;
SltRec:=data.gg.RecordCount;
SltCol :=ListBox3.Count-1;
WordTable:= WordApp.activedocument.tables.add(WordRange,SltRec + 1,SltCol);
ColIndex := 1;
data.gg.first;
while not data.gg.eof do
begin
inc(i);
for j:=0 to listbox3.Count-1 do begin
str:=listbox3.Items.Strings[j];
WordTable.Cell(ColIndex,j+1).Range.InsertAfter(data.gg.FieldByName(str).asstring);
end;
ColIndex:=ColIndex+1;
data.gg.next;
end;
statusbar1.Panels[3].Text:='导出成功!';
export_form.Cursor:=crDefault;
end;
end else exit;
end;
 
最简单实现的方法就是 dogfish 所说的用书签了,我就是用的这个方法。
但是word模板得设计好,比如说传真头用表格,表格里的电话号码、收件
人等信息,可以用书签控制,当然你也可以通过表格属性付值,正文部分
用书签最好了,最好不用表格,因为在表格填写正文对于多行、多页文字
有标点符号换行的问题。而且模板是外部文件,程序做完以后,如果要改
写传真的显示样式、格式等直接修改模板就可以了,十分灵活方便,所以
我认为 dogfish 的方法比较好。
 
想问一下 dogfish 代码中的 mydoc 是怎么定义的
 
小弟急用 哪位大虾可以解释的详细一些么?

谢谢,谢谢 谢谢
 
在源码空间上有一个控件ekrtf202,它完全能符合你的要求,就是先在word中建立一个word文档模板,然后将数据集与word模板相连,就可以将数据传入到word中,很方便的。
mzrong@163.com
 
请说说地址
 
多人接受答案了。
 
后退
顶部