PDA

View Full Version : كار با فايلهاي word و ويرايش بخشي از آنها !



FiACKER
دوشنبه 31 فروردین 1388, 18:52 عصر
سلام

من يه فايل doc دارم كه نياز هست كه بخشي از اين فايل ورد رو كه نوشته شده Sherkat$ رو به اسمه يه شركت تغيير بدم !
در واقع مي خوام نامه هاي شركت رو به صورت اتوماتيك و با وارد كردن اسمه شركت در برنامه ي من و ويرايش فايل ورده مورده نظر، پرينت بگيرم !


ايا همچين كاري ممكن هست يا بايد از report دلفي استفاده كنم‌!؟

يا اگه شما تجربه ي اين كار رو دارين ، بگين چه كاري بهتره ؟ يا راهه حله بهتري سراغ داريد...

vcldeveloper
دوشنبه 31 فروردین 1388, 20:06 عصر
ايا همچين كاري ممكن هست يا بايد از report دلفي استفاده كنم‌!؟
بله، ممکن هست. با استفاده از رابط COM ارائه شده توسط MS Word، می تونید فایل را در آن باز کنید، ویرایش کنید، و ذخیره کنید.
درباره اش چندین کد در سایت موجود هست.

FiACKER
سه شنبه 01 اردیبهشت 1388, 00:41 صبح
ممنون

براي ويرايش و پرينت كدوم رو پيشنهاد مي دين ؟
FastReport يا word رو ؟

vcldeveloper
سه شنبه 01 اردیبهشت 1388, 03:26 صبح
ویرایش و پرینت چی؟

FiACKER
سه شنبه 01 اردیبهشت 1388, 04:14 صبح
من مي خوام يه متني باشه كه فقط قسمتي از اون رو تغيير بدم و بعد پرينتش بگيرم.

مثال :



جناب اقاي احمدي
با سلام ، خوبي‌؟

احترما شركت [SherkatName] در تاريخ [EndDate] كار خود را به اتمام رسانده است. لطفا دستور بفرمائيد دستمزد شركت نامبرده به حسابشان واريز گردد.


با تشكر fiacker مدير كل


حالا مي خوام اون [SherkatName] رو و [EndDate] رو به چيزي كه در بانكم هست تغيير بدم و بعد پرينتش بگيرم.

فرمت نامه بايد جوري باشه كه اون كسي كه مي خواد با سيستم كار كنه هر وقت خودش خواست متنه نامه رو هم تغيير بده. پس من فقط بايد اسم شركت رو و تاريخ رو تغيير بدم. حالا اين نبايد مهم باشه كه تويه بقيه متنه نامه چي نوشته شده !

البته اگه همچين چيزي نمي شه ، اگه پيشنهادي داريد بفرماييد...

ممنون

merced
سه شنبه 01 اردیبهشت 1388, 11:17 صبح
مي توني تو فايل وردت بوكمارك تعريف كني و در محل بو مارك ها بنويسي يا چيزي كه اونجاست رو بخوني
Bookmark جستجو كن

MSHService
سه شنبه 01 اردیبهشت 1388, 11:22 صبح
سلام
برای نامه های ریاست جمهوری که میاست برای هر کدوم یه متن تایپ بشه و دمه در خونه مردم فرستاده شه برای بانکمون این برنامه رو نوشتم.
کد زیر متن اصلیشه. خودت بیزحت هر چی رو میخواهی ازش استخراج کن.ا
یه WordDocumentو WordFont و WordApplication بنداز رو فرم.

var
Docs, Template, NewTemplate, ItemIndex: OleVariant;
mem1:TMemo;
j,i:integer;
StrSpace,ShobeS:string;
Add,Add1,Add2,Add3,Add4,Add5,SendADD:String;
lett:Array[0..6] of string;

procedure setfont;
begin

WordFont.ConnectTo(WordDocument.Sentences.Get_Last .Font);
if ChkBoxUnderline.checked then WordFont.Underline := 2;
if ChkBoxBold.checked then WordFont.Bold := 1;
if ChkBoxItalic.Checked then WordFont.Italic := 1;
if ChkBoxEmboss.Checked then WordFont.Emboss := 1;
if ChkBoxEngrave.checked then WordFont.Engrave := 1;
if ChkBoxShadow.checked then WordFont.shadow := 1;
if ChkBoxDoublestrike.checked then WordFont.DoubleStrikeThrough := 1;
if ChkBoxStrike.checked then WordFont.StrikeThrough := 1;
WordFont.Size := StrToInt(Size.text);
if Fonttype.Itemindex >= 0 then
WordFont.Name := FontType.Items[FontType.Itemindex];
end;

begin
try
Template := EmptyParam;
NewTemplate := True;
ItemIndex := 1;
try
Wordapplication.Connect;
except
MessageDlg('Word may not be installed', mtError, [mbOk], 0);
Abort;
end;
Wordapplication.Visible := True;
WordApplication.Caption := 'Delphi automation';
{Create new document}
Template := EmptyParam;
NewTemplate := False;
if ChkBoxNewDoc.Checked then
begin
Docs := WordApplication.Documents;
Docs.Add(NewTemplate := True);
{Assign WordDocument component}
WordDocument.ConnectTo(WordApplication.Documents.I tem(ItemIndex));
end;
{Turn Spell checking of because it takes a long time if enabled and slows down Winword}
WordApplication.Options.CheckSpellingAsYouType := False;
WordApplication.Options.CheckGrammarAsYouType := False;
{Insert data}
//DBImgFishImg.CopyToClipboard;
//WordDocument.Sentences.Last.Paste; //------------
StrSpace:='%'+Trim( Edit2.Text)+'S';
WordDocument.PageSetup.TopMargin:=2.5;
//WordDocument.PageSetup.
//WordFont.Name:='Traffic';
//--------------------------------------
for i :=1 to StrToInt(Trim(suiSpinRepeat.Text)) do begin
with DataDB do
begin // Format(StrSpace,[Trim(ADOTNormal.FieldByName('ShobeMehr').AsString)]);
suiDBLkupCBoxShoab.KeyValue:=trim(ADOQMainShobeCod e.AsString);
ShobeS:=Trim(suiDBLkupCBoxShoab.Text);
SendADD:=' ÂÏÑÓ ÝÑÓÊäÏå:' + ' ÌíÑÝÊ-ÎíÇÈÇä ØÇáÞÇäí-ãÏíÑíÊ ÔÚÈ ÈÇä˜ ÏÑ ÌäæÈ ˜ÑãÇä-9-03482213078 ';
Add:=' ÂÏÑÓ íÑäÏå: ' + Trim(ADOQMainAddress.AsString) ;
add1:='; ÌäÇÈ '+Trim(ADOQMainFirstName.AsString) +' ' +Trim(ADOQMainLastName.AsString);
lett[0]:= Format(StrSpace,[ ADOQMainInternalCode.AsString +'/'+ADOQMainReqNo.AsString]);
lett[1]:= Format(StrSpace,[CorrectFarsiDate(PrintNormal)]);
lett[2]:= Format('%95S',[ADOQMainFirstName.AsString +' ' +ADOQMainLastName.AsString]);
SetFont;
WordDocument.Range.InsertAfter('' + #13);
WordDocument.Range.InsertAfter('' + #13);
WordDocument.Range.InsertAfter('' + #13);
WordDocument.Range.InsertAfter(lett[1]+ #13);
WordDocument.Range.InsertAfter(lett[0]+ #13);
WordDocument.Range.InsertAfter(''+ #13);
WordDocument.Range.InsertAfter(''+ #13);
WordDocument.Range.InsertAfter('' + #13);
WordDocument.Range.InsertAfter('' + #13);
WordDocument.Range.InsertAfter('' + #13);
WordDocument.Range.InsertAfter('' + #13);
WordDocument.Range.InsertAfter('' + #13);
WordDocument.Range.InsertAfter(' '+ShobeS+#13);//( ' '+ ADOQMainFirstName.AsString +' ' +ADOQMainLastName.AsString+ #13);

for j := 1 to 6 do //1..26
WordDocument.Range.InsertAfter('' + #13);
WordDocument.Range.InsertAfter(lett[2]+ #13);
for j := 1 to 17 do
WordDocument.Range.InsertAfter('' + #13);
WordDocument.Range.InsertAfter(Format('%60S',[ADOQMainFirstName.AsString +' ' +ADOQMainLastName.AsString])+ #13);
add4:=copy(add,1,70);
WordDocument.Range.InsertAfter(''+ #13); //-----

WordDocument.Range.InsertAfter(SendADD + #13);
WordDocument.Range.InsertAfter(''+ #13);
add2:=copy(add+add1,1,70);
if length(add+add1)>70 then begin
add2:=add2+'_';
add3:=' _';
end;
add3:=add3+copy(add+add1,71,70);

WordDocument.Range.InsertAfter(add2 + #13);
WordDocument.Range.InsertAfter(add3 + #13);
for j := 1 to 12 do
WordDocument.Range.InsertAfter(' ' + #13);

if AddDbPrint.Checked then begin
ADOQMain.Edit;
ADOQMainEghdamNo.AsString:='1';//1-> Ersal Be Post
ADOQMainEghdamDate.AsString:=PrintNormal;
ADOQMain.Post;
end;//if
end;
end;
////--------------
BtnCloseWord.Enabled := True;
BtnPrint.Enabled := True;
BtnPreview.Enabled := True;
except
on E: Exception do
begin
ShowMessage(E.Message);
WordApplication.Disconnect;
end;
end;
end;
براي پرینت هم
WordDocument.PrintOut;
موفق باشی.

vcldeveloper
سه شنبه 01 اردیبهشت 1388, 19:26 عصر
من مي خوام يه متني باشه كه فقط قسمتي از اون رو تغيير بدم و بعد پرينتش بگيرم.
FastReport؛ چون نیازی به نصب Word روی اون سیستم نداره، نیازی هم به آشنا بودن با رابط COM مربوط به MS Word نداره. برای این مدل کارها هم خودش راهکارهایی ارائه میکنه، مثل پشتیبانی از Variables در گزارش.
در نهایت، امکان ارسال خروجی تولید شده به فرمت های مختلف مثل Word. PDF، و غیره را داره.

reza_Nazem
پنج شنبه 03 اردیبهشت 1388, 00:02 صبح
دوستان من برا کار با word از روشی که در تاپیک 7 گفته شده استفاده کردم حالا برای ذخیره فایل مورد نظر تو دیتابیس کسی ایده ای داره؟

vcldeveloper
پنج شنبه 03 اردیبهشت 1388, 05:06 صبح
حالا برای ذخیره فایل مورد نظر تو دیتابیس کسی ایده ای داره؟
می تونید بصورت Blob آن را در بانک ذخیره کنید.

reza_Nazem
چهارشنبه 09 اردیبهشت 1388, 18:29 عصر
ممنون از جوابتون ولي مشكل من همينه ايا راهي است كه در هنگام بستن پنجره word بدون ذخيره سازي فايل در هارد خود فايل word را در يك memorystrean بريزم كه بتونم در يك blob ذخيره كنم

چون وقتي از اين روش استفاده كنيم دقيقا برنامه word باز مي شود و من راهي براي مديريت ذخيره اين فايل نتونستم پيدا كنم