Word的流如何转换成Word文件? ( 积分: 200 )

  • 主题发起人 主题发起人 wjp888
  • 开始时间 开始时间
W

wjp888

Unregistered / Unconfirmed
GUEST, unregistred user!
如下:-----------------------------------------------------------
Var
OleStream : TMemoryStream;
begin
OleStream := TMemoryStream.Create;
try
OleContainer1.SaveToStream(OleStream);
OleStream.Position := 0;
OleStream.SaveToFile('c:/word1.doc');
//这个'c:/word1.doc'不是word文件呀,用Word打开是乱码,但我必须要把这个OleStream转换成word型文件,在下请了。
finally
OleStream.Free;
end;
end;
 
如下:-----------------------------------------------------------
Var
OleStream : TMemoryStream;
begin
OleStream := TMemoryStream.Create;
try
OleContainer1.SaveToStream(OleStream);
OleStream.Position := 0;
OleStream.SaveToFile('c:/word1.doc');
//这个'c:/word1.doc'不是word文件呀,用Word打开是乱码,但我必须要把这个OleStream转换成word型文件,在下请了。
finally
OleStream.Free;
end;
end;
 
以上的代码,只是举例说明,中心是Word的流如何转换成Word文件,要求转换的速度快。比如,有一个表中的字段存的是Word的流,如何不用OleContainer直接存成Word文件?
 
olecontainer1.SaveAsDocument(wordfile);用这个吧
 
若存在表中就好办了
TBlobField(Table1.FieldByName('WORDOLE')).SaveToFile(...)
 
to saridon,
olecontainer1.SaveAsDocument(wordfile);
这个是可以的,但olecontainer1加载那个表中word流很慢呀,而且还要OleContainer1.DoVerb(1)这样击活后才能SaveAsDocument(wordfile),所以太慢行不通,还有更好的Word的流快速转换成Word文件吗?
 
<来自:saridon, 时间:2005-1-8 15:09:37, ID:2957313
若存在表中就好办了
TBlobField(Table1.FieldByName('WORDOLE')).SaveToFile(...) >
---------------------------------------------------------------------

这样另存的那个文件是二进制,用word打开是乱码呀,因为我是用流这样存进去的:
Tblobfield(Table1.FieldByName('WORDOLE')).loadfromstream(oleStream);
所以还是行不通的,我试过了。
 
那你是不是用OLE显示WORD啊?
 
是呀,我要快速的打开表中word流文件.
 
不知管用否?
首先OLEContainer预先打开一个空文档,
将WORD文件以流格式保存在表的BLOB字段中,当显示WORD文档时,
用TBlobField(Table1.FieldByName('WORDOLE')).SaveToFile(...) 将流
存为文件A.
将此文件通过WordApplication的Insert文档方法将文件插入OLEContainer中
显示另一个文档时,先将OLEContainer 中的内容清除再插入.

这样OLE只需装入一次,速度很快.
 
to saridon:
TBlobField(Table1.FieldByName('WORDOLE')).SaveToFile(...)
这句得到是二进制文件,不是Word文件,所以不行,现在只要Word的流快速转换成Word文件就行,还有好方法吗?
 
你的WORD流是怎样存到字段里的?像下面这样:
Tblobfield(Table1.FieldByName('WORDOLE')).loadfromstream(oleStream);
oleStream的内容是怎么来的?是从OLEContaine中来的?
这样不行,建议你换成下面的方法保存Word到字段
Tblobfield(Table1.FieldByName('WORDOLE')).LoadFromFile(WordFile)
 
to saridon,
用这Tblobfield(Table1.FieldByName('WORDOLE')).LoadFromFile(WordFile),太慢了
因为这WordFile,还要olecontainer1.SaveAsDocument(wordfile)这样才能出来,所以这样速度跟不上,效率第一,所以不能这样做呀!

 
procedure TOleContainer.LoadFromStream(Stream: TStream);
var
DataHandle: HGlobal;
Buffer: Pointer;
Header: TStreamHeader;
begin
DestroyObject;
Stream.ReadBuffer(Header, SizeOf(Header));
if (Header.Signature <> StreamSignature) and not FOldStreamFormat then
raise EOleError.CreateRes(@SInvalidStreamFormat);
DataHandle := GlobalAlloc(GMEM_MOVEABLE, Header.DataSize);
if DataHandle = 0 then OutOfMemoryError;
try
Buffer := GlobalLock(DataHandle);
try
Stream.Read(Buffer^, Header.DataSize);
finally
GlobalUnlock(DataHandle);
end;
OleCheck(CreateILockBytesOnHGlobal(DataHandle, True, FLockBytes));
DataHandle := 0;
OleCheck(StgOpenStorageOnILockBytes(FLockBytes, nil, STGM_READWRITE or
STGM_SHARE_EXCLUSIVE, nil, 0, FStorage));
OleCheck(OleLoad(FStorage, IOleObject, Self, FOleObject));
FDrawAspect := Header.DrawAspect;
InitObject;
UpdateView;
except
if DataHandle <> 0 then GlobalFree(DataHandle);
DestroyObject;
raise;
end;
end;
这是Delphi的源码,那位高人能把TStream转成Word文件,还在感谢中.....
 
自己顶了!
 
没人能换吗?
 
难道必需通过OleContainer才能转换吗?
 
这个问题我刚回答过类似的,你可以去看看。http://www.delphibbs.com/delphibbs/dispq.asp?lid=2954168
 
to llfirst,
谢谢您,但您的代码必需通过OleContainer才能转换成WORD文件,太慢了,所以不行。
 
佩服你,脑筋灵活点行不?方法在那里,你用流读取,根据偏移量跳过一些不必要的数据,然后写文件就行。
 
后退
顶部