我以前试着存过,但存进去了,打不开!
而用richedit控件存就可以存,也能打开!
帮你up吧!

解决方案 »

  1.   

    我也是用的richedit控件,可以存,也能打开,但我只能用rtf或txt文本文件,而不能用doc文件.
      

  2.   

    unit OfficeForm;interfaceuses
      SysUtils, Windows, Messages, Classes, Graphics,
      Controls, Forms, DBCtrls, StdCtrls, DBTables,
      ExtCtrls, Mask, Db, Dialogs, Excel97, Word97,
      OleServer;type
      TFormOff = class(TForm)
        DBEdit3: TDBEdit;
        Label3: TLabel;
        Label2: TLabel;
        DBEdit2: TDBEdit;
        DBEdit1: TDBEdit;
        Label1: TLabel;
        DBNavigator1: TDBNavigator;
        Table1: TTable;
        DataSource1: TDataSource;
        BtnWord: TButton;
        BtnExcel: TButton;
        SaveDialog1: TSaveDialog;
        ExcelApplication1: TExcelApplication;
        WordDocument1: TWordDocument;
        procedure BtnWordClick(Sender: TObject);
        procedure BtnExcelClick(Sender: TObject);
      end;var
      FormOff: TFormOff;implementation{$R *.DFM}uses
      ComObj, ActiveX;procedure TFormOff.BtnWordClick(Sender: TObject);
    var
      Book: TBook;
      RangeW: Word97.Range;
      v1: Variant;
      ov1: OleVariant;
      Row1: Word97.Row;
    begin
      WordDocument1.Activate;
      // insert title
      WordDocument1.Range.Text := 'American Capitals from ' + Table1.TableName;
      WordDocument1.Range.Font.Size := 14;
      // disable the UI
      Table1.DisableControls;
      try
        // store the current position
        Book := Table1.GetBook;
        try
          // scan the database table
          Table1.First;
          while not Table1.EOF do
          begin
            // send the two fields
            WordDocument1.Range.InsertParagraphAfter;
            WordDocument1.Paragraphs.Last.Range.Text :=
              Table1.FieldByName ('Name').AsString + #9 +
              Table1.FieldByName ('Capital').AsString;
            Table1.Next;
          end;
        finally
          // go back to the book and destroy it
          Table1.GotoBook (Book);
          Table1.FreeBook (Book);
        end;
      finally
        // re-enable the controls
        Table1.EnableControls;
      end;
      RangeW := WordDocument1.Content;
      v1 := RangeW;
      v1.ConvertToTable (#9, 19, 2);
      Row1 := WordDocument1.Tables.Item(1).Rows.Get_First;
      Row1.Range.Bold := 1;
      Row1.Range.Font.Size := 30;
      Row1.Range.InsertParagraphAfter;
      ov1 := ' ';
      Row1.ConvertToText (ov1);
    end;procedure TFormOff.BtnExcelClick(Sender: TObject);
    var
      RangeE: Excel97.Range;
      I, Row: Integer;
      Book: TBookStr;
    begin
      // create and show
      ExcelApplication1.Visible [0] := True;
      ExcelApplication1.Workbooks.Add (NULL, 0);
      // fill is the first row with field titles
      RangeE := ExcelApplication1.ActiveCell;
      for I := 0 to Table1.Fields.Count - 1 do
      begin
        RangeE.Value := Table1.Fields [I].DisplayLabel;
        RangeE := RangeE.Next;
      end;
      // add field data in following rows
      Table1.DisableControls;
      try
        Book := Table1.Book;
        try
          Table1.First;
          Row := 2;
          while not Table1.EOF do
          begin
            RangeE := ExcelApplication1.Range ['A' + IntToStr (Row),
              'A' + IntToStr (Row)];
            for I := 0 to Table1.Fields.Count - 1 do
            begin
              RangeE.Value := Table1.Fields [I].AsString;
              RangeE := RangeE.Next;
            end;
            Table1.Next;
            Inc (Row);
          end;
        finally
          Table1.Book := Book;
        end;
      finally
        Table1.EnableControls;
      end;
      // format the section
      RangeE := ExcelApplication1.Range ['A1', 'E' + IntToStr (Row - 1)];
      RangeE.AutoFormat (3, NULL, NULL, NULL, NULL, NULL, NULL);
    end;initialization
      CoInitialize (nil);
    end.--------------------------------------------------------------------------------
    procedure TTumOgr.SpeedButton1Click(Sender: TObject); var XApp:Variant; sheet:Variant; r,c:Integer; row,col:Integer; filName:Integer; q:Integer; begin XApp:=CreateOleObject('Excel.Application'); XApp.Visible:=true; XApp.WorkBooks.Add(-4167); XApp.WorkBooks[1].WorkSheets[1].Name:='Sheet1'; sheet:=XApp.WorkBooks[1].WorkSheets['Sheet1'];   for filName:=0 to DMod.OgrSiralaQuery.FieldCount-1 do   begin   q:=filName+1;   sheet.Cells[1,q]:=DMod.OgrSiralaQuery.Fields[filName].FieldName;   end; for r:=0 to DMod.OgrSiralaQuery.RecordCount-1 do begin   for c:=0 to DMod.OgrSiralaQuery.FieldCount-1 do   begin   row:=r+2;   col:=c+1;   sheet.Cells[row,col]:=DMod.OgrSiralaQuery.Fields[c].AsString;   end;   DMod.OgrSiralaQuery.Next; end; XApp.WorkSheets['Sheet1'].Range['A1:AA1'].Font.Bold:=True; XApp.WorkSheets['Sheet1'].Range['A1:K1'].Borders.LineStyle :=13; XApp.WorkSheets['Sheet1'].Range['A2:K'+inttostr(DMod.OgrSiralaQuery.RecordCount-1)].Borders.LineStyle :=1; XApp.WorkSheets['Sheet1'].Columns[1].ColumnWidth:=16; XApp.WorkSheets['Sheet1'].Columns[2].ColumnWidth:=7; XApp.WorkSheets['Sheet1'].Columns[3].ColumnWidth:=19; XApp.WorkSheets['Sheet1'].Columns[4].ColumnWidth:=9; XApp.WorkSheets['Sheet1'].Columns[5].ColumnWidth:=9; XApp.WorkSheets['Sheet1'].Columns[6].ColumnWidth:=9; XApp.WorkSheets['Sheet1'].Columns[7].ColumnWidth:=46; XApp.WorkSheets['Sheet1'].Columns[8].ColumnWidth:=9; XApp.WorkSheets['Sheet1'].Columns[9].ColumnWidth:=7; XApp.WorkSheets['Sheet1'].Columns[10].ColumnWidth:=6; XApp.WorkSheets['Sheet1'].Columns[11].ColumnWidth:=13;  end;    
      

  3.   

    SQL Server和Delphi中有一个讨厌的地方就是,存储任意二进制文件的时候,比较烦人,例如把一个Word文件(25KB)保存到SQL Server中,但是等你重新提出保存成另外的文件的时候,可能生成的文件大小只有24.7KB左右大小了!这样Word就不能打开重新生成的文件!要解决这个问题,要做几个修改:
    首先,你必须修改SQL Server中用来保存任意文件的字段的类型为Image(不要用Text/nText字段,更加不要用Binary/VarBinary字段,因为binary字段最多只能存储8K的数据)数据类型,然后,你在Word里面添加字段的时候,Delphi会默认字段类型为ftMemo,你必须把这个字段改成ftBlob字段!以后你就可以通过
    Table1FileField.LoadFromFile()/SaveToFile()来读取任意的二进制文件了!而且不会丢失任何字节!也不会多出什么东西来!这是Kingron的经验之谈。
      

  4.   

    to Kingron:   您的方法正是我想要的,我也曾使用Image类型,ftBlob存储,无奈不能用RichEdit来编辑显示,看来只能用Ole容器试一试了.
      

  5.   

    本人技术实在太差,现在的问题集中在如何编辑和显示这个字段的信息?请大侠指教以下几步代码:一、1: OleContainer.CreateObject('word.Application',fase);
    2: OleContainer.LoadFromFile('path\xx.doc');  //error!!!
       OleContainer.LoadFromStream(xxStream);  //error too!!!二、1: OleContainer.CreateObjectFromFile('path\xx.doc',fase);
    2: 编辑后如何保存?若把内容存储数据库,以后第二种方法显然不可取,实际上这是OleContainer
    的用法问题,请高手指教!!!
      

  6.   

    我要实现一个功能:我要打印报表和文本,要存储成*.DOC文件。以标准形式文本显示在屏幕上,请各位高手帮帮小女子。不胜感谢。有关WORD  OLE控件的文章可以给我发邮件,   多谢了
      

  7.   

    // 从数据库中取出文档;
    TBlobField(Table.FieldByName('Doc')).SaveToFile('xx.doc');
    // 打开文档;
    OleContainer.CreateObjectFromFile('xx.doc',fase);
    // 编辑后保存;
    OleContainer.SaveToFile('xx.doc');
    // 保存到数据库中;
    TBlobField(Table.FieldByName('Doc')).LoadFromFile('xx.doc');
      

  8.   

    还是不行,现将源代码贴出:表:大文本模板:类别varchar(50) 模板:image调入外部doc文件:
    procedure TForm1.BtnOpenClick(Sender: TObject);
    begin
      if OpenDialog1.Execute then
        OleContainer1.CreateObjectFromFile(OpenDialog1.FileName,false);
    end;保存模板:
    procedure TForm1.BtnSaveModalClick(Sender: TObject);
    begin
      OleContainer1.SaveToFile('tmp.doc');
      Adoquery1.Close;
      Adoquery1.SQL.Clear;
      Adoquery1.SQL.Add('update 大文本模板 set 模板=:CC where 类别=''值班记录''');
      Adoquery1.Parameters.ParamByName('CC').LoadFromFile('tmp.doc',ftBlob);
      Adoquery1.ExecSQL;  //通过
    end;新增记录:
    procedure TForm1.BtnAddClick(Sender: TObject);
    begin
      Adoquery1.Close;
      Adoquery1.SQL.Clear;
      Adoquery1.SQL.Add('select 模板 from 大文本模板 where 类别=''值班记录''');
      Adoquery1.Open;
      (Adoquery1.FieldByName('模板') as TBlobField).SaveToFile('tmp.doc');
      OleContainer1.CreateObjectFromFile('tmp.doc',false);//异常 Ole error 80030002
    end;保存记录:
    procedure TForm1.BtnSaveClick(Sender: TObject);
    begin
      OleContainer1.SaveToFile('tmp.doc');
      Adoquery1.Close;
      Adoquery1.SQL.Clear;
      Adoquery1.SQL.Add('insert into 值班记录(情况) values(:CC)');
      Adoquery1.Parameters.ParamByName('cc').LoadFromFile('tmp.doc',ftBlob);
      Adoquery1.ExecSQL;
    end;
      

  9.   

    保存不是使用SaveToFile,
    是SaveAsDocument('Tmp.doc'),这样保存出来的才是真正的DOC文件,用SaveToFile保存的是OLE内部格式!注意这一点即可。
      

  10.   

    说来话长,我介绍一本书给你看吧!人家说太多也只能接受一点,看书就懂得了《DELPHI6高级编程》里面有。
      

  11.   

    多谢Kingron(单身走我路……) 的关键指点。我出错的这一句:
    OleContainer1.CreateObjectFromFile('tmp.doc',false);//异常 Ole error 80030002必须指定路径,'tmp.doc'并不意味是当前路径的文件,不知为何?但SaveAsDocument('Tmp.doc')这一句很关键。至此,该问题已经解决,随之即来的另一个问题:在编辑文档时,能不能新建一个word窗口,嵌套在Ole容器中实在难看,况且“保存”等按钮都不可用,也不能恢复到原始状态(灰灰的颜色)。
      

  12.   

    不使用Ole就可以了!直接加载你的那个临时文件!
      

  13.   

    请明释,是否使用wordApplication和WordDocuments控件?
      

  14.   

    哎,随便你啊!自己找一下关于OLE的资料吧。还问这个问题,不想回答了……