如何在Delphi中显示和存取Word文档之急上加急!!!

mmxer 2000-07-24 04:05:00
各位大侠:
请问如何在Delphi中显示和存取Word文档,望不吝赐教,不胜感激!
...全文
588 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ninestar 2000-07-28
  • 打赏
  • 举报
回复
照上面两位大侠所述,向DB2数据库保存数据时仍然出现“Invaild BLOB Length”的错误,只是向Paradox表存数据时非常正常,何解????
ninestar 2000-07-27
  • 打赏
  • 举报
回复
zsr大侠,为什么我在保存blob数据,如果Word页面长度大于一页的时候出现了"Invaild BLOB Length"的错误,我将BDE中BLOB Size加大也毫无效果,我的代码如下,请各位网友指正:
procedure TForm_ole.BitBtn2Click(Sender: TObject);
var
l_Stream:TStream;
begin
Table1.Insert;
l_Stream:=TBlobStream.Create(Table1DOC as TBlobField,bmWrite);
ole1.SaveToStream(l_Stream);
Table1DOC.SaveToStream(l_Stream);
Table1.Post;
l_Stream.Free;
end;
另外BLOB字段最大长度是多少,如果有100M的Word文档是否能保存。
在DB2中有没有比BLOB更长的数据类型。
hfyun 2000-07-27
  • 打赏
  • 举报
回复
要保存文件格式,当然不能用AsString存取了。
不会这么复杂吧?用TBlobField存取就行了,代码职下:
存:
if not OpenDialog.Execute then
Exit ;
sFileName := OpenDialog.FileName ;
tblTable.Insert;
tblTableIndex.AsInteger := 20000727001 ;
TBlobField(tblTableDOC).LoadFromFile(sFileName) ;
tblTable.Post;
读:
sFileName := GetTempFileName ;//自定义函数,生成临时文件名。
sFileName := sFileName + '.DOC' ;
//定位记录 略
TBlobField(tblTableDOC).SaveToFile(sFileName) ;
ShellExecute(handle,'OPEN',PChar(sFileName),'','',SW_SHOWNORMAL) ;
//API函数,要用到ShellAPI单元。

蝈蝈俊 2000-07-27
  • 打赏
  • 举报
回复
在Delphi中处理word文档与数据库的互联

---- 目前,Delphi被越来越多的人选中作为MIS系统开发中的前台工具。在以Delphi为前台,一些大型数据库为后台的MIS系统中,图形的处理不可避免;即从以Delphi开发的前台界面输入图形,并保存到相应的数据库字段中。在这种形式的图形处理中,BMP文件的处理比较简单,因为Delphi本身有Image和DBImage构件,用这些构件与数据库中可以保存图形的大型字段BLOB比较容易地进行数据交换。以这种方式进行图形处理已应用在许多MIS软件中,包括处理人员照片的人事档案系统等。

---- 但是,BMP文件一般都比较大。而且有时要录入的是自己在计算机上画的简图,并伴随大量文字说明。这种情况用Win95中的画图板等处理BMP文件的工具处理就比较困难。一般应用人员都喜欢用WORD画图和写说明文字,然后保存到数据库中。

---- 经过一段时间的摸索,我们解决了这个问题,并经过完善,在应用中运行较好。程序如下:
procedure TsampleForm.OpenDOCClick(Sender: TObject);
var
MemSize: Integer;
Buffer: PChar;
MyFile: TFileStream;
Stream: TBlobStream;
begin
OpenDialog1.Filter:='WORD文档(*.DOC)|*.DOC';{从对话窗选择文件}
if OpenDialog1.Execute then
begin
MyFile:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
with table1 do {‘table1’为含BLOB字段的表名}
begin
Open;
Edit;
Stream := TBlobStream.Create(FieldByName('Doc') as TBlobField, bmWrite);{‘Doc’为BLOB字段名}
MemSize := MyFile.Size;
Inc(MemSize); {Make room for the buffer's null terminator.}
Buffer := AllocMem(MemSize); {Allocate the memory.}
try
Stream.Seek(0, soFromBeginning); {Seek 0 bytes from the stream's end point}
MyFile.Read(Buffer^,MemSize);
Stream.Write(Buffer^,MemSize);
finally
MyFile.Free;
Stream.Free;
end;
try
Post;
except
on E: EDatabaseError do
if HandelException(E)< >0 then
exit
else
raise;
end;
end;
Doc_ole.CreateObjectFromFile(OpenDialog1.FileName,False);
Doc_ole.Run;{Doc_ole为ToleContainer构件名}
end;
end;


---- 以上为向数据库中写入的程序,应用中从对话窗取出文件在ToleContainer构件中显示的同时存入数据库。

procedure TsampleForm.GetDocClick(Sender: TObject);
var
MemSize: Integer;
Buffer: PChar;
MyFile: TFileStream;
Stream: TBlobStream;
begin
MyFile:=TFileStream.Create('c:\temp.tmp',fmCreate);
with Query1 do
begin
Stream := TBlobStream.Create(FieldByName('Doc') as TBlobField, bmRead);
MemSize := Stream.Size;
Inc(MemSize); {Make room for the buffer's null terminator.}
Buffer := AllocMem(MemSize); {Allocate the memory.}
try
Stream.Read(Buffer^,MemSize);
MyFile.Write(Buffer^,MemSize);
finally
MyFile.Free;
Stream.Free;
end;
end;
if FileExists('c:\temp.DOC') then
DeleteFile('c:\temp.DOC');
if FileExists('c:\temp.tmp') then
begin
RenameFile('c:\temp.tmp', 'c:\temp.DOC');
Doc_ole.CreateObjectFromFile('c:\temp.DOC',False);
Doc_ole.Run;
end;
end;

---- 以上程序为从数据库从将WORD文档取出,并放在temp.doc的临时文件上并在ToleContainer构件中显示。

---- 在程序的其他部份应准确控制表记录指针,使WORD文档的存取发生在正确的记录位置。

mmxer 2000-07-27
  • 打赏
  • 举报
回复
还有更好的答案吗?
mmxer 2000-07-26
  • 打赏
  • 举报
回复
谢谢各位网友的帮忙,我已经基本解决了这各问题,但尚为完全解决,现在的关键问题就是如何用低级文件函数将Word文档保存到数据库中,如果保存到数据库中是使用字符串类型字段还是用BLOB类型字段好,如果用Savetostream保存,又该如何保存呢,我已将代码张贴上,希望大侠指正:
procedure TForm1.savetostramClick(Sender: TObject);
var str:wideString;
FromF: file;
NumRead, NumWritten: Integer;
Buf: array[1..2048] of Char;
begin
if Od.Execute then
begin
AssignFile(FromF,Od.FileName);
Reset(FromF,1); { Record size = 1 }
repeat
BlockRead(FromF,buf,SizeOf(Buf),NumRead);
str:=str+buf;
until (NumRead = 0);
CloseFile(FromF);
end;

//****************
table1.Insert;
table1.FieldByName('doc').asstring:=str;
table1.post;

end;
码狂 2000-07-26
  • 打赏
  • 举报
回复
根本不能直接将数据库读出的流装入OLEContainer!!!
简单一点的办法是将读出的流存入一个临时文件,然后用OLEContainer的CreateLinkFromFile函数。
zsr 2000-07-26
  • 打赏
  • 举报
回复
是什么错误?能贴上来吗?
mmxer 2000-07-26
  • 打赏
  • 举报
回复
谢谢zsr,我已经能够成功地存储数据流,但是在往olecontainer载入数据的时候出现错误,请指点。
zsr 2000-07-26
  • 打赏
  • 举报
回复
用Blob为好。
用savetostream时:
bs:= TBlobstream.create( fieldname as TBlobfield,bmwrite );
tolecontainer.savetostream( bs );
bs.free;
前提是使用Tolecontainer,具体可查看delphi的帮助。
如保存文件,用TFilestream.
mmxer 2000-07-25
  • 打赏
  • 举报
回复
还有没有更好的解答?
我是想在C/S模式下将Word文档内容存储在服务器的数据库中,让所有的客户端都能看到,并非只想在本地存取Word文档。
wsf 2000-07-25
  • 打赏
  • 举报
回复
关注
Hank 2000-07-25
  • 打赏
  • 举报
回复
这是我自己用的模块,用来显示存储WORD文件,不过要安装WORD才能正确运行!

//********************//
procedure TForm3.Button1Click(Sender: TObject);
var MSWord:Variant;
i,j:Integer;
begin
SaveDialog1.Filter:='*.DOC|*.DOC';
SaveDialog1.DefaultExt:='DOC';
if SaveDialog1.Execute then
begin
MSWord:=CreateOLEObject('Word.Application');
MSWord.Documents.Open(FileName:=SaveDialog1.FileName,ReadOnly:=False);
MSWord.Visible:=False;
MSWord.ActiveDocument.Range(Start:=0,End:=0);
Table1.Open;
j:=Table1.RecordCount;
Table1.First;
for i:=1 to j do
begin
MSWord.ActiveDocument.Range.InsertAfter(Text:=Table1.FieldByName('CODE').AsString+Table1.FieldByName('COLOR').AsString+Chr(13));
Table1.Next;
end;
MSWord.Documents.Close;
end;
end;
yijun2000 2000-07-25
  • 打赏
  • 举报
回复
比较简单的方法是下在一套turbo power的office partener,专门为delphi和office软件无缝集成.在 www.chinaasp.com下的delphi页面.
zsr 2000-07-25
  • 打赏
  • 举报
回复
用Tolecontainer,嵌如文档后用savetostream保存,读的时候用Loadfromstream,可以保证在嵌入文档时需要word ,但保存后就可以不要了。
zsr 2000-07-24
  • 打赏
  • 举报
回复
用OLE也可以。
ploto 2000-07-24
  • 打赏
  • 举报
回复
用COM技术,在DELPHI的DEMOS下有例程
huliao 2000-07-24
  • 打赏
  • 举报
回复
去那儿看看
http://www.inprise.com.cn/support/word.htm

5,379

社区成员

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

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