还是不行,现将源代码贴出:表:大文本模板:类别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;
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;
首先,你必须修改SQL Server中用来保存任意文件的字段的类型为Image(不要用Text/nText字段,更加不要用Binary/VarBinary字段,因为binary字段最多只能存储8K的数据)数据类型,然后,你在Word里面添加字段的时候,Delphi会默认字段类型为ftMemo,你必须把这个字段改成ftBlob字段!以后你就可以通过
Table1FileField.LoadFromFile()/SaveToFile()来读取任意的二进制文件了!而且不会丢失任何字节!也不会多出什么东西来!这是Kingron的经验之谈。
2: OleContainer.LoadFromFile('path\xx.doc'); //error!!!
OleContainer.LoadFromStream(xxStream); //error too!!!二、1: OleContainer.CreateObjectFromFile('path\xx.doc',fase);
2: 编辑后如何保存?若把内容存储数据库,以后第二种方法显然不可取,实际上这是OleContainer
的用法问题,请高手指教!!!
TBlobField(Table.FieldByName('Doc')).SaveToFile('xx.doc');
// 打开文档;
OleContainer.CreateObjectFromFile('xx.doc',fase);
// 编辑后保存;
OleContainer.SaveToFile('xx.doc');
// 保存到数据库中;
TBlobField(Table.FieldByName('Doc')).LoadFromFile('xx.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;
是SaveAsDocument('Tmp.doc'),这样保存出来的才是真正的DOC文件,用SaveToFile保存的是OLE内部格式!注意这一点即可。
OleContainer1.CreateObjectFromFile('tmp.doc',false);//异常 Ole error 80030002必须指定路径,'tmp.doc'并不意味是当前路径的文件,不知为何?但SaveAsDocument('Tmp.doc')这一句很关键。至此,该问题已经解决,随之即来的另一个问题:在编辑文档时,能不能新建一个word窗口,嵌套在Ole容器中实在难看,况且“保存”等按钮都不可用,也不能恢复到原始状态(灰灰的颜色)。