PDA

View Full Version : آموزش: استفاده از ms-word در دلفی



jst
پنج شنبه 25 فروردین 1390, 17:19 عصر
با سلام خدمت همه دوستان
در یک پروژه لازم بود خروجی یک query رو داخل فایل ورد نمایش بدهم .علی رغم وجود مقالات مختلف در سایتها , هیچ نمونه کاملی که بتوان این کار رو با کیفیت بالا توسط اون انجام داد پیدا نشد . کد زیر با جستجو در اینترنت و اندکی تغییر توسط اینجانب این کار رو به خوبی انجام می دهد .امیدوارم مورد استفاده دوستان عزیز قرار بگیرد
کافیست یک یونیت جدید ایجاد و محتوای زیر رو در اون کپی کنید و فایل ایجاد شده رو به پروژه اضافه و از تابع GRidToword استفاده کنید (لازم به توضیح است که مقدار FormatNum در تایع عددی است که جهت نوع فرمت جدول خروجی در نظر گرفته شده که عدد 22 مناسب ترین فرمت می باشد .):

unit Unit_gridtoword;

interface

uses SysUtils, StdCtrls,Classes, Graphics,
Db, Grids, DBGrids, ComObj, BaseGrid, AdvGrid, DBAdvGrid,wordxp;

procedure GridToWord (Grid :TdbGrid ; FormatNum :integer);

implementation

procedure GridToWord (Grid :TdbGrid ; FormatNum :integer);
var
x :integer ;
y: integer ;
Word : Olevariant ;
GColCount : integer ;
GRowCount : integer;
begin
Word := CreateOLEobject('Word.Application') ;

(* چنانچه نخواسته باشید پنجره ورد در هنگام ساخت فایل باز باشد می توانید مقدار زیر را FALSE در نظر بگیرید *)
Word.Visible := True ;


Word.Documents.Add ;


GColCount := Grid.Columns.Count ;
GRowCount := Grid.DataSource.DataSet.RecordCount ;
Word.ActiveDocument.Range.Font.Size := Grid.Font.Size;
Word.ActiveDocument.Range.Font.NAME := Grid.Font.NAME;
Word.ActiveDocument.PageSetup.Orientation := 1 ;
Word.ActiveDocument.Tables.Add( Word.ActiveDocument.Range,GRowCount+1,GColCount);
Word.ActiveDocument.Range.InsertAfter('Date ' + Datetimetostr(Now));
Word.ActiveDocument.Range.Tables.Item(1).AutoForma t(FormatNum,1,1,1,1,1,0,0,0,1);


for y := 1 to GColCount
do Word.ActiveDocument.Tables.Item(1).Cell(1,y).Range .InsertAfter(Grid.Columns[y-1].Title.Caption) ;

x :=1 ;
with Grid.DataSource.DataSet do begin
First ;
while not Eof do begin
x := x + 1 ;
for y := 1 to GColCount
do Word.ActiveDocument.Tables.Item(1).Cell(x,y).Range .InsertAfter(FieldByName(Grid.Columns[y-1].FieldName).Asstring);
Next ;
end;
end;
Word.ActiveDocument.Range.Tables.Item(1).UpdateAut oFormat ;
end;
end.




عبارت زیر هم برای ذخیره خودکار فایل و خروج از ورد استفاده می شود
Word.activeDocument.SaveAs('C:\TEST.Doc',False) ;
Word.Quit(False)

rezaansari87
چهارشنبه 21 دی 1390, 10:19 صبح
سلام
با تشكر از برنامه مفيدتان
خيلي ممنون

hp1361
جمعه 13 اردیبهشت 1392, 00:13 صبح
unit Unit_gridtoword;

interface

uses SysUtils, StdCtrls,Classes, Graphics,
Db, Grids, DBGrids, ComObj, BaseGrid, AdvGrid, DBAdvGrid,wordxp;

procedure GridToWord (Grid :TdbGrid ; FormatNum :integer);

implementation

procedure GridToWord (Grid :TdbGrid ; FormatNum :integer);
var
x :integer ;
y: integer ;
Word : Olevariant ;
GColCount : integer ;
GRowCount : integer;
begin
Word := CreateOLEobject('Word.Application') ;



(* چنانچه نخواسته باشید پنجره ورد در هنگام ساخت فایل باز باشد می توانید مقدار زیر را FALSE در نظر بگیرید *)


Word.Visible := True ;




Word.Documents.Add ;


GColCount := Grid.Columns.Count ;
GRowCount := Grid.DataSource.DataSet.RecordCount ;
Word.ActiveDocument.Range.Font.Size := Grid.Font.Size;
Word.ActiveDocument.Range.Font.NAME := Grid.Font.NAME;
Word.ActiveDocument.PageSetup.Orientation := 1 ;
Word.ActiveDocument.Tables.Add( Word.ActiveDocument.Range,GRowCount+1,GColCount);
Word.ActiveDocument.Range.InsertAfter('Date ' + Datetimetostr(Now));
Word.ActiveDocument.Range.Tables.Item(1).AutoForma t(FormatNum,1,1,1,1,1,0,0,0,1);


for y := 1 to GColCount
do Word.ActiveDocument.Tables.Item(1).Cell(1,y).Range .InsertAfter(Grid.Columns[y-1].Title.Caption) ;

x :=1 ;
with Grid.DataSource.DataSet do begin
First ;
while not Eof do begin
x := x + 1 ;
for y := 1 to GColCount
do Word.ActiveDocument.Tables.Item(1).Cell(x,y).Range .InsertAfter(FieldByName(Grid.Columns[y-1].FieldName).Asstring);
Next ;
end;
end;
Word.ActiveDocument.Range.Tables.Item(1).UpdateAut oFormat ;
end;
end.


عبارت زیر هم برای ذخیره خودکار فایل و خروج از ورد استفاده می شود



Word.activeDocument.SaveAs('C:\TEST.Doc',False) ;
Word.Quit(False)

eshge89
چهارشنبه 23 بهمن 1392, 07:35 صبح
سلام ممنون از راهنمایی تون
من یه فرمت نامه در word دارم و می خوام توسط یک query این فایل word را پر و ازش پرینت تهیه کنم
ممنون می شم به همراه مثال راهنمایی کنید .
خیلی خیلی فوریه
درضمن شاید تعداد ارسال نامه واسه 100 نفر باشه می خوام 100 نامه رو به صورت پیوسته در یک فایل نمایش بده

khoshblagh
پنج شنبه 24 بهمن 1392, 00:22 صبح
با تشکر از کار ارزشمند جناب jst
حالا فرض کنید بعضی از ستونهای این گرید را به هر علت نخواهید که به فایل ورد ارسال شود . در این صورت چکاری باید انجام داد؟ من سعی کردم با visible=false نمودن آن ستونها سعی در جلوگیری در ارسال آن به فایل ورد شوم ، ولی علیرغم تاثیر این کار در نمایش گرید ولی در هنگام ارسال به ورد باز هم آن ستونها منتقل گردید. آیا میشود این مشکل را حل نمود؟ متشکرم