或者有什么优秀的第三方控件来操作word文档。谢谢。

解决方案 »

  1.   

    读出:
    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;
      

  2.   

    用Blob来存数据不就完了。读取的时候可以先生成一个临时文件……
      

  3.   

    保存是可以保存,但在delphi中有没有操作word的件,如打开word 文档,对文档进行浏览之类的控件?
      

  4.   

    读写可以用tadoblobstream,浏览文档可以用olecontainer,通过文件创建createobjectfrom(filename,false),其中filename可以是从数据库中读出数据后保存的文件,false表明不要以图标方式显示.如果想对文件进行更多的操作,可以使用wordapplication和worddocument.
      

  5.   

    谢谢大家!请问,对应的sql sever数据库字段存放word文档内容的(字段)是什么类型?
    用TEXT还是其它?
      

  6.   

    看这段代码,不用控件!
    文档保存字段用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;