求救,在delphi如何把word文档保存到sql server数据库,保存后又如何取出来在word中显示其内容? 求救,在delphi如何把word文档保存到sql server数据库,保存后又如何取出来在word中显示其内容?另:存放word文档的字段是什么类型?image还是text 还是....谢谢!如有调试通过的这方面的code,本人高分答谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不是image也不是text,其实可以只保存路径。 在程序中将数据库的查询结果输出到word文档A.Delphi 安装目录下有个Demo 例子,很简单你把它改改,加上个循环就搞定!!!!!!!c:\Program Files\Borland\Delphi5\Demos\Activex\Oleauto\Word8 B............下面是调用word模版的程序,但是跟你要实现的可能有一定的差别,以下仅供参考:procedure TForm1.Button2Click(Sender: TObject);//按钮事件var fn,i:OleVariant;begin with WordApplication1 do begin try Connect(); fn:='d:\小蔡\wordprt\wordot\01.dot';//指定已建模板的路径。 i:=false;//当i为true或零并且已有指定模板,系统根据所建模板再重新建一个模板, //若以前没有建模板则系统将会出现有关文档不存在或文档路径出错等信息 //若i为false或1并且已有指定模板,系统将会启动所指定模板。 Documents.Add(fn,i); Replace('Edit1',Edit1.Text);//替换文本 Replace('Edit2',Edit2.Text); Replace('Edit3',memo1.Text); finally Visible:=True; Disconnect(); end; end;end;procedure TForm1.Replace(Source,Dest:string);//replace函数var FindText,MatchCase,MatchWholeWord,MatchWildCards,MatchSoundsLike, MatchAllWordForms,FForward,Wrap,Format,ReplaceWith,Replace, MatchKaShida,MatchDiacritics,MatchAlefHamza,MatchControl:OleVariant; What,Which,Count,CName:OleVariant;begin with WordApplication1 do begin FindText:=Source; MatchCase:=True; MatchWholeWord:=False; MatchAllWordForms:=False; MatchSoundsLike:=False; FForward:=True; Wrap:=False; Format:=False; //ReplaceWith:=''; replaceWith:=dest; replace:=true; //Replace:=False; MatchKaShida:=False; MatchDiacritics:=False; MatchAlefHamza:=False; MatchControl:=False; Selection.Find.Execute(FindText,MatchCase,MatchWholeWord, MatchWildCards,MatchSoundsLike, MatchAllWordForms,FForward,wrap,Format, ReplaceWith,Replace); //Selection.TypeText(Dest);该语句和前面的两条语句结合后word中被替换的文字 是长文本,而如果用现有的语句,则word中被替换的文本最长为504个字节。 What:=wdGotoPage; Which:=wdGotoNext; Count:=1; CName:=''; Selection.GoTo_(What,Which,Count,CName); end;end; 可不可以将WORD文档存SQL SERVER 的image类型的字段?保存word文档:procedure Tfrmdyqk1.BitBtn3Click(Sender: TObject);var ms:TMemoryStream;begin ms:= TMemoryStream.create; OleContainer1.SaveToStream (ms); ms.Position := 0; Query1.close; Query1.sql.clear; Query1.sql.text:='select * from oadbo.bw_qwb'; Query1.open; Query1.append; Query1.fieldbyname('wjid').value:=77777777 ; Query1.fieldbyname('wjdid').value:=7; Query1.fieldbyname('kzm').value:='txt'; TBlobField(Query1.fieldbyname('qw')).loadfromstream(ms); ms.free; Query1.post; //Query1.applyupdates; Query1.close;end;取出word文档:procedure Tfrmdyqk1.Button2Click(Sender: TObject);var strstream:Tmemorystream; //ls_qw:string;begin OleContainer1.DestroyObject; strstream := Tmemorystream.Create; query1.Close; query1.sql.clear; query1.SQL.Add('select qw from oadbo.bw_qwb where wjid =' + inttostr(77777777)); query1.open ; query1.First; Tblobfield(query1.fieldbyname('qw')).savetostream(strstream); strstream.position:=0; OleContainer1.loadfromstream(strstream); strstream.free;end; 对,保存WORD路径是最明智的,点击后再用WORD打开 procedure towordsave(sourcetablename: string;sourceid:integer;dataset:tadodataset) ;var sCommandLine: string; bCreateProcess: boolean; lpStartupInfo: TStartupInfo; lpProcessInformation: TProcessInformation; MemSize: Integer; Buffer: PChar; MyFile: TFileStream; Stream: TADOBlobStream; RegF:TRegistry;begin RegF:=TRegistry.Create; //查看.doc文档的打开程序 RegF.RootKey:=HKEY_classes_root; try RegF.OpenKey('worddocument\protocol\stdfileediting\server',True); sCommandLine:=regf.ReadString('')+' '+ExtractFilePath(Application.EXEName)+'temp.doc'; except End; RegF.CloseKey; RegF.Free; dataset.Close; dataset.commandtext :='select * from 二进制文档 where 来源=''' +sourcetablename+''' and 来源id='+inttostr(sourceid); dataset.open; if not dataset.eof then begin MyFile:=TFileStream.Create(ExtractFilePath(Application.EXEName)+'temp.tmp',fmCreate); Stream:=TADOBlobStream.Create(dataset.FieldByName('内容') as TBlobField, bmRead); MemSize := Stream.Size; Inc(MemSize); Buffer := AllocMem(MemSize); try Stream.Read(Buffer^,MemSize); MyFile.Write(Buffer^,MemSize); finally MyFile.Free;Stream.Free; end; if FileExists(ExtractFilePath(Application.EXEName)+'temp.DOC') then DeleteFile(ExtractFilePath(Application.EXEName)+'temp.DOC'); if FileExists(ExtractFilePath(Application.EXEName)+'temp.tmp') then RenameFile(ExtractFilePath(Application.EXEName)+'temp.tmp', ExtractFilePath(Application.EXEName)+'temp.DOC'); end else begin if FileExists(ExtractFilePath(Application.EXEName)+'empty.DOC') then copyfile(pchar(ExtractFilePath(Application.EXEName)+'empty.DOC'),pchar(ExtractFilePath(Application.EXEName)+'temp.DOC'),false) else begin ShowMessage('<'+ExtractFilePath(Application.EXEName)+'empty.DOC>不存在!'); dataset.close ; exit; end; end; dataset.close ; //sCommandLine :='C:\Program Files\Microsoft Office\Office\winword.exe '+ExtractFilePath(Application.EXEName)+'temp.doc'; FillChar(lpStartupInfo, Sizeof(TStartupInfo), #0); lpStartupInfo.cb := Sizeof(TStartupInfo); lpStartupInfo.dwFlags := STARTF_USESHOWWINDOW; lpStartupInfo.wShowWindow := SW_NORMAL; bCreateProcess := CreateProcess(nil, PChar(sCommandLine),nil, nil, True, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil, nil, lpStartupInfo, lpProcessInformation); //ShellExecute(zxdcc.Handle,'save',pchar(ExtractFilePath(Application.EXEName)+'empty.doc') ,'','',SW_SHOWNORMAL); if bCreateProcess then WaitForSingleObject(lpProcessInformation.hProcess, INFINITE); dataset.Close; dataset.commandtext:='select * from 二进制文档 where 来源=''' +sourcetablename+''' and 来源id='+inttostr(sourceid); dataset.open; if not dataset.eof then dataset.Edit else begin dataset.close; dataset.commandtext:='select * from 二进制文档'; dataset.open; dataset.append; end; dataset.FieldValues['来源']:=sourcetablename; dataset.FieldValues['来源id']:=sourceid; MyFile:=TFileStream.Create(ExtractFilePath(Application.EXEName)+'temp.doc',fmOpenRead); Stream := TADOBlobStream.Create(dataset.FieldByName('内容') as TBlobField, bmWrite);{‘Doc’为BLOB字段名} MemSize := MyFile.Size; Inc(MemSize);//增加的一字节给结尾的null Buffer := AllocMem(MemSize); try Stream.Seek(0, soFromBeginning);//流指针位置放到最前 MyFile.Read(Buffer^,MemSize); Stream.Write(Buffer^,MemSize); finally MyFile.Free; Stream.Free; end; dataset.post; dataset.close;end; qwertyasd(昊): 你好!请问以下语句中的确“二进制文档“指的是表名吗?来源呢? dataset.commandtext:='select * from 二进制文档 where 来源='''谢谢! 可以在sqlserver中保存word文档,采用adoblobstream和olecontainer,或者直接采用wordapplication.在sqlserver中用image保存,然后用adoblobstream.create(tblobfield(imagefieldname),fmread)读出,这样就可以loadfromfile和savetofile。olecontainer可以createobjectfromfile(savedfile),编辑完成后可以saveasdocument(filename),最后可以用adoblobstream的loadfromfile(filename)将文件存到sqlserver中。 二进制文档 是image类型字段,来源 保存的文档来自那个 表id 是 来自那个表的id我是建一个表用这三个字段,专门存储二进制文档 ,例如word 的文档 上面错了 二进制文档就是这个表名。内容是image类型字段 用来保存word文档。 procedure towordsave(sourcetablename: string;sourceid:integer;dataset:tadodataset) ;是一个通用过程,使用方法towordsave('撰写文章',toint(key.text),data.ADODataSet1);'撰写文章'是指来源,toint(key.text)来源iddata.ADODataSet1 数据元 qwertyasd(昊) : 你好!代码执行到:bCreateProcess := CreateProcess(nil, PChar(sCommandLine),nil, nil, True, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil, nil, lpStartupInfo, lpProcessInformation); 时,总是自动打开c:\program.doc这个文档(其实C:\下根本没有program.doc)。请解释一下。另,该行代码的作用是什么? 最后发现,保存成功,但又如何取出来,在word中显示呢? 需要在可执行文件目录下有一个empty.DOC文件。如果二进制文档表的来源和 ID,与 towordsave('撰写文章',toint(key.text),data.ADODataSet1);传过来的参数相同,说明已有此文档,则自动打开!你不要机械的用我跟你的带吗?应该理解它的原理! TCompressionStream压缩流的问题 Listview ViewStyle属性为vsReport怎么显示像DBGrid那样有线条的样子的啊? 窗口控件的大小,位置问题 关于opencv 怎么动态删除LISTVIEW中的记录 请教Delphi 6.0 中带有的 InstallShield Express 的使用方法 如何将窗口作为指针传递? 请教关于DBLookupComboBox的用法? 如果设置窗体不可用不能接受消息,鼠标消息跟键盘消息 关于array与string的一个问题 大家能给我一个方案吗? 挑战高手的问题。
A.Delphi 安装目录下有个Demo 例子,很简单
你把它改改,加上个循环就搞定!!!!!!!
c:\Program Files\Borland\Delphi5\Demos\Activex\Oleauto\Word8
B............
下面是调用word模版的程序,但是跟你要实现的可能有一定的差别,以下仅供参考:procedure TForm1.Button2Click(Sender: TObject);//按钮事件
var fn,i:OleVariant;
begin
with WordApplication1 do
begin
try
Connect();
fn:='d:\小蔡\wordprt\wordot\01.dot';//指定已建模板的路径。
i:=false;//当i为true或零并且已有指定模板,系统根据所建模板再重新建一个模板,
//若以前没有建模板则系统将会出现有关文档不存在或文档路径出错等信息
//若i为false或1并且已有指定模板,系统将会启动所指定模板。
Documents.Add(fn,i);
Replace('Edit1',Edit1.Text);//替换文本
Replace('Edit2',Edit2.Text);
Replace('Edit3',memo1.Text);
finally
Visible:=True;
Disconnect();
end;
end;
end;procedure TForm1.Replace(Source,Dest:string);//replace函数
var FindText,MatchCase,MatchWholeWord,MatchWildCards,MatchSoundsLike,
MatchAllWordForms,FForward,Wrap,Format,ReplaceWith,Replace,
MatchKaShida,MatchDiacritics,MatchAlefHamza,MatchControl:OleVariant;
What,Which,Count,CName:OleVariant;
begin
with WordApplication1 do
begin
FindText:=Source;
MatchCase:=True;
MatchWholeWord:=False;
MatchAllWordForms:=False;
MatchSoundsLike:=False;
FForward:=True;
Wrap:=False;
Format:=False;
//ReplaceWith:='';
replaceWith:=dest;
replace:=true;
//Replace:=False;
MatchKaShida:=False;
MatchDiacritics:=False;
MatchAlefHamza:=False;
MatchControl:=False;
Selection.Find.Execute(FindText,MatchCase,MatchWholeWord,
MatchWildCards,MatchSoundsLike,
MatchAllWordForms,FForward,wrap,Format,
ReplaceWith,Replace);
//Selection.TypeText(Dest);该语句和前面的两条语句结合后word中被替换的文字
是长文本,而如果用现有的语句,则word中被替换的文本最长为504个字节。
What:=wdGotoPage;
Which:=wdGotoNext;
Count:=1;
CName:='';
Selection.GoTo_(What,Which,Count,CName);
end;
end;
procedure Tfrmdyqk1.BitBtn3Click(Sender: TObject);
var ms:TMemoryStream;
begin
ms:= TMemoryStream.create;
OleContainer1.SaveToStream (ms);
ms.Position := 0; Query1.close;
Query1.sql.clear;
Query1.sql.text:='select * from oadbo.bw_qwb';
Query1.open;
Query1.append;
Query1.fieldbyname('wjid').value:=77777777 ;
Query1.fieldbyname('wjdid').value:=7;
Query1.fieldbyname('kzm').value:='txt';
TBlobField(Query1.fieldbyname('qw')).loadfromstream(ms);
ms.free;
Query1.post;
//Query1.applyupdates;
Query1.close;
end;
取出word文档:
procedure Tfrmdyqk1.Button2Click(Sender: TObject);
var strstream:Tmemorystream;
//ls_qw:string;
begin OleContainer1.DestroyObject;
strstream := Tmemorystream.Create; query1.Close;
query1.sql.clear;
query1.SQL.Add('select qw from oadbo.bw_qwb where wjid =' + inttostr(77777777));
query1.open ;
query1.First;
Tblobfield(query1.fieldbyname('qw')).savetostream(strstream);
strstream.position:=0;
OleContainer1.loadfromstream(strstream); strstream.free;
end;
var
sCommandLine: string;
bCreateProcess: boolean;
lpStartupInfo: TStartupInfo;
lpProcessInformation: TProcessInformation;
MemSize: Integer;
Buffer: PChar;
MyFile: TFileStream;
Stream: TADOBlobStream;
RegF:TRegistry;
begin
RegF:=TRegistry.Create; //查看.doc文档的打开程序
RegF.RootKey:=HKEY_classes_root;
try
RegF.OpenKey('worddocument\protocol\stdfileediting\server',True);
sCommandLine:=regf.ReadString('')+' '+ExtractFilePath(Application.EXEName)+'temp.doc';
except
End;
RegF.CloseKey;
RegF.Free;
dataset.Close;
dataset.commandtext :='select * from 二进制文档 where 来源=''' +sourcetablename+''' and 来源id='+inttostr(sourceid);
dataset.open;
if not dataset.eof then
begin
MyFile:=TFileStream.Create(ExtractFilePath(Application.EXEName)+'temp.tmp',fmCreate);
Stream:=TADOBlobStream.Create(dataset.FieldByName('内容') as TBlobField, bmRead);
MemSize := Stream.Size;
Inc(MemSize);
Buffer := AllocMem(MemSize);
try
Stream.Read(Buffer^,MemSize);
MyFile.Write(Buffer^,MemSize);
finally
MyFile.Free;Stream.Free;
end;
if FileExists(ExtractFilePath(Application.EXEName)+'temp.DOC') then DeleteFile(ExtractFilePath(Application.EXEName)+'temp.DOC');
if FileExists(ExtractFilePath(Application.EXEName)+'temp.tmp') then RenameFile(ExtractFilePath(Application.EXEName)+'temp.tmp', ExtractFilePath(Application.EXEName)+'temp.DOC');
end
else
begin
if FileExists(ExtractFilePath(Application.EXEName)+'empty.DOC') then
copyfile(pchar(ExtractFilePath(Application.EXEName)+'empty.DOC'),pchar(ExtractFilePath(Application.EXEName)+'temp.DOC'),false)
else begin
ShowMessage('<'+ExtractFilePath(Application.EXEName)+'empty.DOC>不存在!');
dataset.close ;
exit;
end;
end;
dataset.close ;
//sCommandLine :='C:\Program Files\Microsoft Office\Office\winword.exe '+ExtractFilePath(Application.EXEName)+'temp.doc'; FillChar(lpStartupInfo, Sizeof(TStartupInfo), #0);
lpStartupInfo.cb := Sizeof(TStartupInfo);
lpStartupInfo.dwFlags := STARTF_USESHOWWINDOW;
lpStartupInfo.wShowWindow := SW_NORMAL;
bCreateProcess := CreateProcess(nil, PChar(sCommandLine),nil, nil, True, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil, nil, lpStartupInfo, lpProcessInformation);
//ShellExecute(zxdcc.Handle,'save',pchar(ExtractFilePath(Application.EXEName)+'empty.doc') ,'','',SW_SHOWNORMAL); if bCreateProcess then
WaitForSingleObject(lpProcessInformation.hProcess, INFINITE);
dataset.Close;
dataset.commandtext:='select * from 二进制文档 where 来源=''' +sourcetablename+''' and 来源id='+inttostr(sourceid);
dataset.open;
if not dataset.eof then
dataset.Edit
else begin
dataset.close;
dataset.commandtext:='select * from 二进制文档';
dataset.open;
dataset.append;
end;
dataset.FieldValues['来源']:=sourcetablename;
dataset.FieldValues['来源id']:=sourceid;
MyFile:=TFileStream.Create(ExtractFilePath(Application.EXEName)+'temp.doc',fmOpenRead);
Stream := TADOBlobStream.Create(dataset.FieldByName('内容') as TBlobField, bmWrite);{‘Doc’为BLOB字段名}
MemSize := MyFile.Size;
Inc(MemSize);//增加的一字节给结尾的null
Buffer := AllocMem(MemSize);
try
Stream.Seek(0, soFromBeginning);//流指针位置放到最前
MyFile.Read(Buffer^,MemSize);
Stream.Write(Buffer^,MemSize);
finally
MyFile.Free;
Stream.Free;
end;
dataset.post;
dataset.close;
end;
你好!请问以下语句中的确“二进制文档“指的是表名吗?来源呢?
dataset.commandtext:='select * from 二进制文档 where 来源='''
谢谢!
来源 保存的文档来自那个 表
id 是 来自那个表的id我是建一个表用这三个字段,专门存储二进制文档 ,例如word 的文档
内容是image类型字段 用来保存word文档。 procedure towordsave(sourcetablename: string;sourceid:integer;dataset:tadodataset) ;
是一个通用过程,使用方法
towordsave('撰写文章',toint(key.text),data.ADODataSet1);
'撰写文章'是指来源,
toint(key.text)来源id
data.ADODataSet1 数据元
你好!代码执行到:bCreateProcess := CreateProcess(nil, PChar(sCommandLine),nil, nil, True, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil, nil, lpStartupInfo, lpProcessInformation); 时,总是自动打开c:\program.doc这个文档(其实C:\下根本没有program.doc)。请解释一下。另,该行代码的作用是什么?
最后发现,保存成功,但又如何取出来,在word中显示呢?
towordsave('撰写文章',toint(key.text),data.ADODataSet1);
传过来的参数相同,说明已有此文档,则自动打开!
你不要机械的用我跟你的带吗?应该理解它的原理!