火急!!! word 文件与filestream之间的转换操作 (50分)

  • 主题发起人 主题发起人 ramble
  • 开始时间 开始时间
R

ramble

Unregistered / Unconfirmed
GUEST, unregistred user!
[:(!]看了题:Delphi与Word之间的融合技术 ( 积分:0, 回复:152, 阅读:5369 )
分类:OLE/Automation ( 版主:g622, hubdog )
来自:yzhshi 的文章 (http://www.delphibbs.com/delphibbs/dispq.asp?LID=737517)
很受启发, 我的问题是现在之到数据库中可以把word文件存为filestream, 但是怎么把filestream
在转换为 .doc 以及怎样把doc 转换为filestream的操作我不太清楚, 希望高手指点, 最好详细点
 
var Stream:TMemoryStream;
begin
Stream:=TMemoryStream.Create;
Stream.LoadFromFile('aaa.doc'); //把doc文件转换为流
Stream.SaveToFile('bbb.doc'); //把流保存为doc文件
Stream.Free;
end;
 
这是TMemoryStream
TFilestream 应该是怎样的呢
好像数据库中存储的话 只可以用 TFilestream的
 
?????????????
怎没人回答, 帮忙啊! 同志们
 
看来这个问题还是我来吧
两种解决方法 希望有益于大家的进步, 其中第儿中方法其实就是yzhshi 的文章 (http://www.delphibbs.com/delphibbs/dispq.asp?LID=737517)
这个人不错, 谢喽! ramble, have a look,please!
从数据库读取文件到本地硬盘和从本地硬盘读取文件到数据库

////////////////////////////////
// 方法一 // //
// TFilestream $ TBlobStream //
////////////////////////////////

//1 .doc保存到数据库
procedure (.doc -> DB)
MemeSize: Integer
Buffer: PChar
MyFile: TFileStream
Stream: TBlobStream
Filename: String
begin
...
Filename:= Opendglg.Filename
MyFile:=FileStream.Create(Filename,fmRead); //只读方式打开文件流
with table1 do begin
stream:= TBlobStream.Create(FielByName('Doc') as TBlobfield, bmReadWrite)
/////////////////////////////////////////////
//doc: 字段名 文件 - - - - -〉 DB
// | |
// 文件流 —————〉 Blob流
/////////////////////////////////////////////
MemSize:=Stream.Size;
Inc(MemSize); //增一字节给结尾NULL
Buffer:=AllocMem(MemSize);
try
Stream.Seek(0,soFormBegining);
//流指针位置放前
Stream.Read(Buffer^,MemSize);
MyFile.Wite(Buffer^,MemSize);
text1.Caption:=...
......
Finally
MyFile.Free
Stream.Free
end
...
end
end

// 从数据库读取文件到本地硬盘并存为 .doc:
procedure (DB -> .doc)
MemeSize: Integer
Buffer: PChar
MyFile: TFileStream
Stream: TBlobStream
Filename: String
begin
...

MyFile:=FileStream.Create('c:/temp.tmp',fmOpenRead);
with table1 do begin
stream:= TBlobStream.Create(FielByName('Doc') as TBlobfield, bmRead)
//只读方式打开文件流
MemSize:=Stream.Size;
Inc(MemSize); //增一字节给结尾NULL
Buffer:=AllocMem(MemSize);
try
Stream.Read(Buffer^,MemSize);
MyFile.Wite(Buffer^,MemSize);
text1.Caption:=...
......
Finally
MyFile.Free
Stream.Free
end
...
if FileExists('c:/temp.doc') then DeleteFile()
if FileExists('c:/temp.tmp') then RenameFile(,)
end

end

在数据库上使用Image二进制字段保存,使用Stream流的方式。


1 .doc保存到数据库的Image字段:
创建文件流:
Word_FileStream:=TFileStream.Create('MyDoc.doc',fmOpenWrite or fmCreate);
Word_FileStream.Position:=0;
TBlobField(AdoQuery1.FieldByName(Column_Name)).LoadFromStream(Word_FileStream);

2 从数据库读取文件到本地硬盘并存为 .doc:
Word_FileStream:=TFileStream.Create('Temp.DOC',fmOpenWrite or fmCreate);
TBlobField(AdoQuery1.FieldByName(Column_Name)).SaveToStream(Word_FileStream);

释放文件流:
Word_FileStream.Free;



//////////////////////////
// 方法二 //
// TfileStream //
//////////////////////////

在数据库上使用Image二进制字段保存,使用Stream流的方式。


1 .doc保存到数据库的Image字段:
创建文件流:
Word_FileStream:=TFileStream.Create('MyDoc.doc',fmOpenWrite or fmCreate);
Word_FileStream.Position:=0;
TBlobField(AdoQuery1.FieldByName(Column_Name)).LoadFromStream(Word_FileStream);

2 从数据库读取文件到本地硬盘并存为 .doc:
Word_FileStream:=TFileStream.Create('Temp.DOC',fmOpenWrite or fmCreate);
TBlobField(AdoQuery1.FieldByName(Column_Name)).SaveToStream(Word_FileStream);

释放文件流:
Word_FileStream.Free;

 
嗯 不错不错, 不过要做到activeX 里, 希望成功阿
也得谢谢 HunterTeam 的旁敲侧击。
只是不知道在COM 里, 要把这个由WORD文件形成的Stream , 怎么把他当变量传出去呢
COM的interface接口可没有stream阿, 只有BSTR之类。 或者说把他传出去, 到底该用
什么类型呢, 哎! 谁能来帮我? 可以再加分啊。
help, help!!! 。。扑通。。 “救人啊!“
 
为什么把分都给 hunterTeam? 因为 hussar也是在我启发下想通的
再说 hunterTeam也的确临时帮了点忙, 哦hussar也已经同意了,真哥们。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部