这是我自己用的模块,用来显示存储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;
谢谢各位网友的帮忙,我已经基本解决了这各问题,但尚为完全解决,现在的关键问题就是如何用低级文件函数将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;
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更长的数据类型。
在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文档的存取发生在正确的记录位置。
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;
我是想在C/S模式下将Word文档内容存储在服务器的数据库中,让所有的客户端都能看到,并非只想在本地存取Word文档。
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;
用savetostream时:
bs:= TBlobstream.create( fieldname as TBlobfield,bmwrite );
tolecontainer.savetostream( bs );
bs.free;
前提是使用Tolecontainer,具体可查看delphi的帮助。
如保存文件,用TFilestream.
简单一点的办法是将读出的流存入一个临时文件,然后用OLEContainer的CreateLinkFromFile函数。
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更长的数据类型。
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文档的存取发生在正确的记录位置。
不会这么复杂吧?用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单元。