读出word文档(100分)

  • 主题发起人 主题发起人 mhlang
  • 开始时间 开始时间
M

mhlang

Unregistered / Unconfirmed
GUEST, unregistred user!
某数据表中的blob字段存储了一段含有图片的word文档。(设字段名为field1)。我首先选定了其中一些记录,现在想把选定记录的field1字段中的word文档逐个读出,并逐个写入一个新的word文档如“temp.doc”,(每写入一个同时想插入一段文字,如“No. 1”、“No. 2”等),最后保存,以便以后能用word对temp.doc重新排版等。有什么较快较好的办法。
 
先帮你换换行。

某数据表中的blob字段存储了一段含有图片的word文档。(设字段名为field1)。
我首先选定了其中一些记录,现在想把选定记录的field1字段中的word文档逐个读出,
并逐个写入一个新的word文档如“temp.doc”,(每写入一个同时想插入一段文字,
如“No. 1”、“No. 2”等),最后保存,以便以后能用word对temp.doc重新排版等。
有什么较快较好的办法。
 
一个一个读呗
 
这个很简单,你可以把Blob字段的内容读到内存流中,然后拷贝到剪贴板,在创建一个
Ole的Word文件,写入NO.1,将剪贴板的内容拷贝到Word文档中,移到下一条记录,读出
blob到内存流拷贝剪贴板,写入NO.2,在将剪贴板的内容拷贝到Wrod文档中,如此循环即可。
其中要用到VBA的知识,用户可以自己查一查,比较简单。
 
有没有例子啊?呵呵...
 
to wbcp2000 :
终于有时间了。我想你的建议是对的。只是我初学,有很多不懂。能否举个例子。
写几句关键的也行。

 
我在已答问题中查了很久,找不到“把Blob字段的内容读到内存流中,
然后拷贝到剪贴板,在创建一个Ole的Word文件,写入NO.1,将剪贴板的
内容拷贝到Word文档中”的例子,哪位大仙可以帮帮忙?
 
大侠们,不要不理我啊。Help me.
 
推销,[:)]
http://www.delphibbs.com/delphibbs/dispq.asp?lid=737517
 
无论如何,感谢yzhshi。等我读完737517再说。
 
和你的处理差不多,不同之处在于这个数据库里存放的不是文件而是路径。
通过路径把文件打开,然后拷贝,粘贴。你可以通过录制宏来了解word的操作函数。
希望能对你有所帮助。

procedure Tdoccombin.BitBtn4Click(Sender: TObject);

var
msworda,mswordb:variant;
i:integer;
namee:string;
begin
msworda:=createoleobject('word.application');
mswordb:=createoleobject('word.application');
mswordb.Documents.Add;
mswordb.visible:=1;


for i:=0 to checklistbox1.Items.Count -1 do
begin //2
if checklistbox1.State =cbchecked then
begin //3
namee:=checklistbox1.Items.Strings;
with query1 do
begin //4
close;
sql.clear;
sql.add('select * from 信息文件信息表');
sql.Add ('where 名称='''+ namee+'''');
open;
if not isempty then
begin
try
msworda.ActiveDocument.Close;
except
end;
msworda.documents.open(filename:=fieldbyname('路径').asstring+fieldbyname('文件名').asstring,readonly:=true);
msworda.visible:=0;
msworda.Selection.WholeStory;//选择全部
msworda.selection.copy; //拷贝
mswordb.selection.paste;//新的文件中粘贴
end;
end; //4
end;//3
end;//2

end;
 
to 东问西答:等我解决了问题再为你加点分
 
呵呵,不用客气了。
我觉得麻烦一点的办法就是你把数据库里的文件还原成文件,然后,用我的方法进行操作。
但是麻烦,应该可以把数据直接读到内存中
 
同意。现在数据已读入内存流了,只不知道怎样把它弄进剪帖板
以便word中可以paste它。
 
我在HUBDOG的葵花宝典中找到将流中的内容复制到剪帖板的方法:(如下)
Procedure CopyStreamToClipboard( fmt: Cardinal; S: TStream );
Var
hMem: THandle;
pMem: Pointer;
Begin
S.Position := 0;
hMem := GlobalAlloc( GHND or GMEM_DDESHARE, S.Size );
If hMem <> 0 Then Begin
pMem := GlobalLock( hMem );
If pMem <> Nil Then Begin
S.Read( pMem^, S.Size );
S.Position := 0;
GlobalUnlock( hMem );
Clipboard.Open;
try
Clipboard.SetAsHandle( fmt, hMem );
finally
Clipboard.Close;
end;
End { If }
Else Begin
GlobalFree( hMem );
OutOfMemoryError;
End;
End { If }
Else
OutOfMemoryError;
End; { CopyStreamToClipboard }
于是我调用该过程,如下:
var MS: TStream;
begin
with adotable1 do
begin
open;
MS:=CreateBlobStream(FieldbyName('question'),bmRead);
CopyStreamToClipboard(soFromcurrent,ms);
Close ;
end;
end;
但是在word中paste却只得到了“BDOC”字样,不能得到流中的word文档。
请高手指教,问题出在哪里?
 
没有问题!告诉你一个往word中贴图的方法。至于打开Word以及图的定位和文字输入自己搞定吧,
那就简单了。

var
AData : THandle;
APalette: HPALETTE;
MyFormat : Word;
TempImage:Timage;
begin
TempImage:=Timage.Create(application);
tempimage.parent:=nil;
TempImage.Picture.Assign(Picture);
try
//把剖面图发送到剪贴板,设定句柄。
TempImage.Picture.SaveToClipboardFormat(MyFormat,AData,APalette);
ClipBoard.SetAsHandle(MyFormat,AData);
finally
Mydoc.Paragraphs.Item(ParagraphsNum).Range.Paste;
end;
end;

 
多谢楼上的朋友。我仍有点不太明白,我的word文档已在流中,
流好象没有SaveToClipboardFormat()的方法,不能如同
TempImage.Picture.SaveToClipboardFormat(MyFormat,AData,APalette);
不好意思,我笨了点。希望你多帮忙
 
word不能识别stream的格式:(
 
请教楼上的:有什么变通的方法吗?
 
后退
顶部