去那儿看看
http://www.inprise.com.cn/support/word.htm

解决方案 »

  1.   

    用COM技术,在DELPHI的DEMOS下有例程
      

  2.   

    比较简单的方法是下在一套turbo power的office partener,专门为delphi和office软件无缝集成.在 www.chinaasp.com下的delphi页面.
      

  3.   

    这是我自己用的模块,用来显示存储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;
      

  4.   

    还有没有更好的解答?
        我是想在C/S模式下将Word文档内容存储在服务器的数据库中,让所有的客户端都能看到,并非只想在本地存取Word文档。
        
      

  5.   

    用Tolecontainer,嵌如文档后用savetostream保存,读的时候用Loadfromstream,可以保证在嵌入文档时需要word ,但保存后就可以不要了。
      

  6.   

    谢谢各位网友的帮忙,我已经基本解决了这各问题,但尚为完全解决,现在的关键问题就是如何用低级文件函数将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;
      

  7.   

    用Blob为好。
    用savetostream时:
     bs:= TBlobstream.create( fieldname as TBlobfield,bmwrite );
     tolecontainer.savetostream( bs );
     bs.free;
    前提是使用Tolecontainer,具体可查看delphi的帮助。
    如保存文件,用TFilestream.
      

  8.   

    谢谢zsr,我已经能够成功地存储数据流,但是在往olecontainer载入数据的时候出现错误,请指点。
      

  9.   

    根本不能直接将数据库读出的流装入OLEContainer!!!
    简单一点的办法是将读出的流存入一个临时文件,然后用OLEContainer的CreateLinkFromFile函数。
      

  10.   

    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更长的数据类型。
      

  11.   

    在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文档的存取发生在正确的记录位置。 
      

  12.   

    要保存文件格式,当然不能用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单元。
      

  13.   

      照上面两位大侠所述,向DB2数据库保存数据时仍然出现“Invaild  BLOB Length”的错误,只是向Paradox表存数据时非常正常,何解????