PDA

View Full Version : نحوه export از Qreport به word



MOHSEN731
جمعه 25 اردیبهشت 1383, 23:29 عصر
با سلام
من یک گزارش با qreport‌ در دلفی 5 طراحی کردم که لیست حقوق کارکنان را چاپ می کند حال می خواهم تا کاربر این امکان را داشته باشد تا گزارش را از qreport به نرم افزار word تبدیل کند آیا کامپوننتی برای اینکار وجود دارد (Qreport to Word)
:?: :?: :?: ممنون

ahmad sajjad
یک شنبه 21 تیر 1383, 22:37 عصر
یعنی کسی نیست که جواب این سوال رو بلد باشه
اگه کسی بلده بگه تا ما هم یاد بگیریم

nasr
یک شنبه 21 تیر 1383, 23:20 عصر
با QRtextFilter می تونی بصورت Text وارد Word کنی

اگه نتونستی بگو تا یه نمونه برنامه برات ارسال کنم

_alish_
سه شنبه 23 تیر 1383, 15:16 عصر
البته با دلفی 5 و رورد 97 انجام دادم ولی در دلفی 6و7 اول ایرارد می گیرد که اگر دوباره پارامترها را بنویسید درست می شه
البته فابل اچ تی ام ال اون نتونستن Upload کنم past کردم خدا کنه همه چیز افتاده باشه


باword 97 این را باز کنید

راهنمـا

OleServer Word



--------------------------------------------------------------------------------


متغیر های ضروری
vParam: OleVariant

cDoc: string;

باز کردن Document درون word


نام فایل+مسیرفایل


به یک متغیر Olevariant نیاز است


برای باز کردن فایل doc بدون پارامتر(با این کار word نیز بطور خودکار باز خواهد شد.)




اتصال component ، worddocument1 به صفحه باز شده درون word


نمایش پنجره word
CDoc:=extractfilepath(application.exename)+'PageA4 .doc ';

vParam:=cDoc;

WordApplication1.Connect;

WordApplication1.Documents.Open(vparam, EmptyParam, EmptyParam,

EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,

EmptyParam);

WordDocument1.ConnectTo(WordApplication1.ActiveDoc ument);


WordApplication1.visible:=false;

vParam:=false;






روشی برای بردن متن به صفحه بازشده درون Word استفاده از ClipBoard میباشد.

برای قرار دادن هر Field Record بهتر است یک متن پیش ساخته داشته باشیدو پس از باز کردن آن با دستور بالا واستفاده از BookMark در Word جایگاه هر کدام را تعیین کنید.شما می توانیدبه صفحه خود با امکانات Wordجلوه زیبا دهید.


نکته 1: باید برای bookmark این تابع را در برنامه خود اضافه نمایید.

نکته 2: توجه داشته باشید در صورت استفاده از صفحه پیش سا خته پس از وارد کردن فیلدها bookmark ها از بین نروند و یا کاربر متن را بر روی صفحه پیش ساخته ذخیره ننماید تا bookmarkها از بین روند.(من برای جلوگیری از این کار فایلهای مربوطه را readonlyنموده ام).

نکته 3 : به علت اینکه پس از استفاده از bookmark آنها حذف می شوند.پس به کاربر پیغام دهید پس از استفاده از آن آنرا ببندد.برای همین من در تابع bookmark از boolean استفاده کرده ام که در صورت بروز استثناء به کاربر پیغام خطا دهم




استفاده از BookMark :

function Tinptfrm.GotoBookmark(Bookmark : string):boolean;

var

What : OLEVariant;

Which : OLEVariant;

Count : OLEVariant;

Name : OLEVariant;

Begin

try

What := wdGoToBookmark;

Which :=unAssigned;

Count :=unAssigned;

Name := Bookmark;

WordApplication1.Selection.GoTo_(What, Which, Count, Name);

GotoBookMark:=True;

Except

messageDlg('متن پیش فرض (چاپ قبلی)را ببندید',MTError,[MBOK],0);

GotoBookMark:=false;

WordApplication1.visible:=true;

end;

end;


اگر bookmark وجود داشت


درستور مربوطه متن انتخاب شده بوسیله تابع bookmark را با متن درون بانک جایگزین میکند و نوع فونت و سایز آن مطابق متن bookmark در می آید
if gotobookmark('matn')=false then exit;

WordApplication1.ActiveDocument.Application.Select ion.Set_Text(Dmod.master.fieldvalues['matn']);








قرار دادن Header

توسط این دستورمیتوان کار View/Header and footer… درون word را به طور اتومات از درون برنامه انجام داد

wdSeekCurrentPageFooter برای footer

WordApplication1.ActiveDocument.ActiveWindow.Activ ePane.View

.SeekView := wdSeekCurrentPageHeader;





نکته: درون پنجره header نمیتوان از bookmark استفاده کرد پس بهتر است از Set_Text ،typetext ویا ازclipboard استفاده کنید.


Save نکردن متن بدون سوال از کاربر:

SaveChanges : OLEVariant;

OriginalFormat : OLEVariant;

RouteDocument : OLEVariant;

...

SaveChanges := wdDoNotSaveChanges;

OriginalFormat := unAssigned;

RouteDocument := unAssigned;

WordApplication1.ActiveDocument.close(SaveChanges, OriginalFormat, RouteDocument);






تا بع MoveRight

این تابع برای خلاصی از انتخاب و حرکت مکانما به سمت راست استفاده میشود

procedure Tinptfrm.MoveRight(Count : integer);

var

MoveUnit : OleVariant;

vCount : OleVariant;

Extended : OleVariant;

begin

MoveUnit :=EmptyParam;

vCount := Count;

Extended := unassigned;

WordApplication1.selection.MoveRight(MoveUnit, vCount, Extended);

end;




برای انتخاب تمام متن یک document
WordApplication1.ActiveDocument.Select




کپی متن انتخابی درون clipboard

past از clipboard به صفحه
WordApplication1.ActiveDocument.Application.Select ion.Copy;

WordApplication1.ActiveDocument.Application.Select ion.Paste;








Print:

WordDocument1.PrintOut((

EmptyParam, EmptyParam, EmptyParam,

EmptyParam,EmptyParam,EmptyParam,

EmptyParam, EmptyParam, EmptyParam,

EmptyParam,EmptyParam,EmptyParam,

(EmptyParam,EmptyParam);




بستن صفحه :

WordDocument1.Close(vParam);

WordDocument1.Disconnect;




اضافه کردن صفحه New:

(WordApplication1.Documents.Add(EmptyParam, EmptyParam;



انتخاب ، فونت ، سایز ،استیل :

من در مورد تغییر سایز متن فارسی نتوانستم به طور مستقیم کاری کنم زیرا متن انگلیسی ساز آن با شماره وارد شده یزرگ و کوچک میشود ولی متن فارسی را من با bookmarkیا از طریق زیر بزرگ و کوچک میکردم
var

S: Selection;

d:pagesetup;

begin

S := WordApplication1.Selection;

S.Font.Bold := integer(True);

s.Font.Size:=18;

s.Font.Name:='lotus’;

S.TypeText(‘TEXT’);;

S.Font.Bold := integer(False);

s.Font.Size:=18;

s.Font.Name:='lotus’;

S.TypeText(‘مصطفی’(


این روش خصوصیت یک متن را مثل bookmark درون متغییرهای قرار داده



متن را از حالت انتخاب در آورده deselect


ایجاد پاراگراف جدید



متن را در کنار متن قبلی قرار میدهد


Var

Fontsize:single;

Fontname:widestring;

Fontbold : Integer;


fontsize:=WordDocument1.Range.Font.Get_Size;

fontname:=WordDocument1.Range.Font.Get_Name;

fontbold:=WordDocument1.Range.Font.Get_Bold;

moveright(1);

WordApplication1.ActiveDocument.Application.Select ion.InsertParagraph;

WordDocument1.Range.Font.set_Size(fontsize);

WordDocument1.Range.Font.set_Name(fontname);

WordDocument1.Range.Font.Set_Bold(fontbold);

WordApplication1.ActiveDocument.Application.Select ion.InsertAfter(str);

تراز کردن متن:

از دو طرف
WordApplication1.Selection.ParagraphFormat.Alignme nt:=wdAlignParagraphJustify;

تنظیم طول پنجره Header:

WordApplication1.ActiveDocument.PageSetup.Set_Head erDistance(2);


نوشتن متن :

تایپ شده

انتخاب شده s:selection


قرار دادن بعد یا قبل متن
WordApplication1.ActiveDocument.Application.Select ion.TypeText(str

);

S := WordApplication1.Selection;

s.Set_Text(str

);

WordApplication1.ActiveDocument.Application.Select ion.InsertBefore(str);








Find/Replace :

Var

SearchText, ReplaceText, Wrap, All: OleVariant;

TextRange: Range;

Begin

{ Replace text }

SearchText := 'alish';

ReplaceText := 'asd';

Wrap := wdFindContinue;

All := wdReplaceAll;

WordDocument1.Content.Find.Execute(SearchText, EmptyParam, EmptyParam, EmptyParam,

EmptyParam, EmptyParam, EmptyParam, Wrap,

EmptyParam, ReplaceText, All);




بستن word :

destructor Tinptfrm.quit;

var

SaveChanges : OLEVariant;

OriginalFormat : OLEVariant;

RouteDocument : OLEVariant;

begin

SaveChanges := wdDoNotSaveChanges;

OriginalFormat := unAssigned;

RouteDocument := unAssigned;

Wordapplication1.Quit(SaveChanges, OriginalFormat, RouteDocument);

end;


saveas :

procedure Tinpfrm.SaveAs(Filename : string);

begin

OLEVariant(wordapplication1).ActiveDocument.SaveAs (FileName);

end;




این موارد را کامل تست نکرده ام فقط یکبار انجام داده و نتیجه گرفته ام و حالا تقریباً دارم ذهنی آنها را تایپ میکنم شاید مقداری اشتباه باشد.


فرمت یک پاراگراف:

With WordApplication1.ActiveDocument.Application.Select ion.ParagraphFormat do
begin
LeftIndent = InchesToPoints(0);
RightIndent = InchesToPoints(0);
SpaceBefore = 0;
SpaceAfter = 0;
LineSpacingRule = wdLineSpaceSingle;
Alignment = wdAlignParagraphLeft;
WidowControl = True;
KeepWithNext = False;
KeepTogether = False;
PageBreakBefore = False;
NoLineNumber = False;
Hyphenation = True;
FirstLineIndent = InchesToPoints(0);
OutlineLevel = wdOutlineLevelBodyText;
End;

قرار دادن break :

WordApplication1.ActiveDocument.Application.Select ion.InsertBreak:=wdPageBreak یا wdSectionBreakNextPage

ایجاد جدول :
WordApplication1.ActiveDocument.Tables.Add(WordApp lication1.ActiveDocument.application.Selection.Ran ge,3,3);




اگر اشتباه وجود داشت به بزرگواری خودتان ببخشید.

MOHSEN731
شنبه 27 تیر 1383, 18:02 عصر
ممنون از بزرگواریت :flower: