求救,在delphi中如何把word文档(EXCEL)保存到sql server数据库? 或者有什么优秀的第三方控件来操作word文档。谢谢。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 读出:var tempfile:string; Fstream:TfileStream;begintmpfile := GetTempPath + FFilename;tryFstream := TFileStream.create(tmpfile, fmCreate);TBlobField(FField).SaveToStream(Fstream);ShellExecute(Application.handle, nil, pchar(tmpfile), '', nil, sw_shownormal);finally freeandnil(fstream);end;写入: if opendialog.Execute then begin FFilename := opendialog.FileName; TBlobField(FField).LoadFromFile(ffilename); FField.dataset.post; end; 用Blob来存数据不就完了。读取的时候可以先生成一个临时文件…… 保存是可以保存,但在delphi中有没有操作word的件,如打开word 文档,对文档进行浏览之类的控件? 读写可以用tadoblobstream,浏览文档可以用olecontainer,通过文件创建createobjectfrom(filename,false),其中filename可以是从数据库中读出数据后保存的文件,false表明不要以图标方式显示.如果想对文件进行更多的操作,可以使用wordapplication和worddocument. 谢谢大家!请问,对应的sql sever数据库字段存放word文档内容的(字段)是什么类型?用TEXT还是其它? 看这段代码,不用控件!文档保存字段用image类型! 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; if条件判断语句是先判断前面还是后面 DBCHART标题相互档住了 为何我的程序在第二次调用WORD时会产生RPC服务错误???请赐教! vcl是啥意思?全称是啥?? 请问如何判断一个文件的后缀名是 .~* 帮我调试一下 急!! 一条报错的sql语句!! 敬请指导 关于delphi6.0(分布式开发)的四个问题~~~ 技术求助!!! 可以用Delphi开发基于Web的应用程序吗 关于数据库树的问题 一个小的问题,在线等待 哪里有 TdxBarControl 是在哪个控件包里里面
var tempfile:string;
Fstream:TfileStream;
begin
tmpfile := GetTempPath + FFilename;
try
Fstream := TFileStream.create(tmpfile, fmCreate);
TBlobField(FField).SaveToStream(Fstream);
ShellExecute(Application.handle, nil, pchar(tmpfile), '', nil, sw_shownormal);
finally
freeandnil(fstream);
end;
写入:
if opendialog.Execute then
begin
FFilename := opendialog.FileName;
TBlobField(FField).LoadFromFile(ffilename);
FField.dataset.post;
end;
用TEXT还是其它?
文档保存字段用image类型!
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;