如何在内存中直接打开Word文档?悬赏1000分,另开贴给分!

sn12345678 2008-05-20 03:29:55
现在服务器端有一word文档,以二进制流的方式下载到本地,请问如何用Word直接在内存中打开文档,而不是先将二进制流存成文件到本地再使用Word打开文档?
谢谢!
http://topic.csdn.net/u/20080520/15/a2e170f0-f809-4648-9f55-59d7134d9018.html
...全文
499 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
w62558739 2008-12-01
  • 打赏
  • 举报
回复
学习
sn12345678 2008-05-26
  • 打赏
  • 举报
回复
to 蒋老师:
就是Ctrl+C拷贝一份DOC文档,然后打开一个DOC文档,Ctrl+V粘贴进取,然后就成一个OLE对象了,没有做程序的测试,偷个懒,呵呵
blazingfire 2008-05-26
  • 打赏
  • 举报
回复
已经都回复了
仙侣步惊云 2008-05-26
  • 打赏
  • 举报
回复
to sxqwhxq兄:
你说的方法可以实现打开Word文档,但是有一点与我的需求有些出入,LoadFromStream打开的不是Word文件,而是结构化的OLE对象,要得到这个OLE的通用对象,就需要将我下载的二进制数据存成文件,然后通过OLEContainer的CreateObjectFromFile打开这个文件,然后从他的Object属性获取数据存成流,才是你最初需要的数据。

至于这么做的目的,是不想有些敏感数据在本地落地,增加窃取的难度。
//---------------------------------------------------------------
你完全可以这样做:
将OLE对象以流的方式保存在服务器的数据库中,使用类似下面的语句:
str:=ADODoc.CreateBlobStream(ADODoc.FieldByName('Content'),bmReadWrite);
str.Position:=0;
OleContainer1.DoVerb(-1);
OleContainer1.SaveToStream(str);
Tblobfield(ADODoc.FieldByName('Content')).loadfromstream(str);
ADODoc.Post;
........
blazingfire 2008-05-26
  • 打赏
  • 举报
回复
通过Delphi的TOleContainer组件可作到。此代码可以打Word文档流直接在OleContainer里打开,
不用产生什么临时文件。

procedure LoadOleCtnrFromStream(OleContainer: TOleContainer; Stream: TStream);
const
DataFormatCount = 2;
StreamSignature = $434F4442; {'BDOC'}
type
TStreamHeader = record
case Integer of
0: ( { New }
Signature: Integer;
DrawAspect: Integer;
DataSize: Integer);
1: ( { Old }
PartRect: TSmallRect);
end;
var
Header: TStreamHeader;
Mem: TMemoryStream;
begin
Mem:= TMemoryStream.Create;
try
Header.Signature := StreamSignature;
Header.DrawAspect := 1;
Mem.Write(Header, SizeOf(Header));
Mem.CopyFrom(Stream, 0);
Mem.Position := 0;
OleContainer.LoadFromStream(Mem);
//OleContainer.DoVerb(0);//就可以通过OleContainer.OleObject得到Word文档对象
finally
Mem.Free;
end;
end;

//测试代码,当然你也可以通过从数据库的一字段取出Word文档然后放到一个流里传给LoadOleCtnrFromStream函数
procedure TForm1.Button4Click(Sender: TObject);
var
fileStream: TFileStream;
begin
fileStream := TFileStream.Create('D:\1.doc', fmOpenReadWrite);
try
LoadOleCtnrFromStream(OleContainer, fileStream);
finally
fileStream.Free;
end;
end;

但是有没有1k分呢?:)
aluyue 2008-05-26
  • 打赏
  • 举报
回复
MARK......
蒋晟 2008-05-26
  • 打赏
  • 举报
回复
偷懒是不行的
flashtong 2008-05-26
  • 打赏
  • 举报
回复
问题的解决方法有很多变通的,不能死死挂在一个地方.
如果一定要用word在客户端打开的话,可以用ms的sharepoint来支持实现,那样成本就高了很多了.
word提供的接口还没有发现有读内存流的,都是读文件,不知道07后版本是否解决了.
楼主如果解决了,也要给小弟发一份解决方案啊.
amumu@126.com
flashtong 2008-05-26
  • 打赏
  • 举报
回复
楼主的这个问题我也遇到过,我说说的解决方法,供楼主参考,至于1000分,只有眼馋的份了
1/第一次访问doc文件时,在服务器端,把word文件转化成HTML文件,用word接口,另存为html即可.
2/保存后的html文件为原来doc文件的副本同时保存到服务器上.
3/把html文本传到客户端,至于怎么在客户端显示html流就简单多了,直接在浏览器就行了.
4/当以后的用户访问时,实际浏览的是副本.
5/对xls,ppt等都有效.

特别适合bs开发,如果用delphi开发的话,内嵌个webbrowser就行了.
W9757 2008-05-23
  • 打赏
  • 举报
回复
路过,学习了........
蒋晟 2008-05-23
  • 打赏
  • 举报
回复
用的什么剪贴板格式?rtf?
sn12345678 2008-05-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jiangsheng 的回复:]
你可以写到剪贴板然后在word里面贴出来
[/Quote]
手工试了一下,贴到文档里后是一个对象,并不是文档的内容,还需要双击打开。
sn12345678 2008-05-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 soweb 的回复:]
结构化的OLE对象可以与二进制WORD数据相互转换的,结构化的OLE对象只是在二进制WORD数据前面加了一个文件头。
[/Quote]
能不能说的详细一些,怎么加这个文件头?谢谢!
byteh 2008-05-23
  • 打赏
  • 举报
回复
关注
yujingfree 2008-05-23
  • 打赏
  • 举报
回复
1000分只有眼馋的份
soweb 2008-05-22
  • 打赏
  • 举报
回复
结构化的OLE对象可以与二进制WORD数据相互转换的,结构化的OLE对象只是在二进制WORD数据前面加了一个文件头。
studyrandy 2008-05-21
  • 打赏
  • 举报
回复
学习了,帮顶下。
sn12345678 2008-05-21
  • 打赏
  • 举报
回复
先谢谢各位的支持!
to sxqwhxq兄:
你说的方法可以实现打开Word文档,但是有一点与我的需求有些出入,LoadFromStream打开的不是Word文件,而是结构化的OLE对象,要得到这个OLE的通用对象,就需要将我下载的二进制数据存成文件,然后通过OLEContainer的CreateObjectFromFile打开这个文件,然后从他的Object属性获取数据存成流,才是你最初需要的数据。

至于这么做的目的,是不想有些敏感数据在本地落地,增加窃取的难度。
蒋晟 2008-05-21
  • 打赏
  • 举报
回复
你可以写到剪贴板然后在word里面贴出来
加载更多回复(8)

5,402

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧