Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как можно присоединить пару документов Word. [D7, XP]


Страницы:   1 2

Xmen ©   (2010-07-12 16:00:00) 

Привет мастерам!
Как можно присоединить пару документов Word.
Есть одинаковые документы док, из Делфи вбиваю шаблон док данные и получается много ворд файлов вот эти файлы нужно присоединить и сохранить в одном файле.


Xmen   (2010-07-16 14:06:00) [1]

у меня вот так получился может кому небуд пригодится  
procedure SlivWord(start_num:integer; end_num:integer);
var wordd:variant;
   path:string;
   i,j:Integer;
   wdStory:olevariant;
begin
path:= ExtractFilePath(Application.ExeName);
 copyfile(pchar(path+'\shablon\debtor.doc'),pchar(path+'\temp\debtor.doc'),false);
 wordd:=CreateOleObject('word.application');
 wdStory:=6;
 wordd.ChangeFileOpenDirectory(path+'\temp\');
 wordd.documents.open('debtor.doc', ReadOnly := False);
 j:= start_num+end_num-1;
 for i:=start_num to j do
  begin
   wordd.Selection.EndKey(wdStory);
   wordd.Selection.InsertFile('doc'+inttostr(i)+'.doc', '', False, False, False);
  end;
 wordd.Documents.Item('debtor.doc').Activate;
 Wordd.ActiveDocument.Save;
 wordd.Documents.Close;
 wordd.Quit;
 wordd:=Unassigned;


Leonid Troyanovsky   (2010-07-14 18:40:00) [2]


> Xmen   (13.07.10 16:14) [14]

> Как говорил эксел файле есть данные, есть ворд документ
> шаблон где есть переменные которых нужно указать. ворд документ
> содержит текст предупреждения там нужно поменять для каждого
> абонента данные.

За время, проведенное на этом форуме + испытания нагугленного
на помойках кода, можно было: подготовить пару тысяч писем,
распечатать коверты, уведомления и даже разослать все.

Неужели трудно пустить Ворд, выбрать Сервис-Письма и рассылки-
Слияние и ответить на вопросы мастера?

Если, конечно, это мазохизм, то я пас, каждый волен развлекаться.

--
Regards, LVT.


Xmen   (2010-07-14 16:14:00) [3]

Сделал так  wdStory:=6;
прого далше прошло и новая ошибка
wordd.Documents.Item(path+'\out\main.doc').Activate;
неверное имя файла.


Xmen   (2010-07-14 16:02:00) [4]

wordd.Selection.EndKey(wdStory);
ругается "Неверный параметр"
wdStory как нужно объявить?


Xmen   (2010-07-14 15:58:00) [5]


> Точнее, для особо одаренных ;)

вот это понравился :)
из за поисков  я уже не понимаю нечего.


Andy BitOff   (2010-07-14 15:36:00) [6]

Я не понимаю зачем загаживать буфер обмена? Может у юзера там важные данные, а ты ему их затираешь.

Вот это работает?
for i:=1 to N do begin
WordApp.Selection.EndKey(wdStory);
WordApp.Selection.InsertFile(TmpFilePath+inttostr(i), '', False, False, False);
end;


Точнее, для особо одаренных ;)
path:= ExtractFilePath(Application.ExeName);
wordd:=CreateOleObject('word.application');
wordd.documents.open(FileName := path+'\out\main.doc', ReadOnly := False);
for i:=1 to 5 do
 begin
  wordd.Selection.EndKey(wdStory);
  wordd.Selection.InsertFile(path+'\out\doc'+inttostr(i)+'.doc', '', False, False, False);
 end;
wordd.Documents.Item(path+'\out\main.doc').Activate;
Wordd.ActiveDocument.Save;


Xmen   (2010-07-14 14:55:00) [7]


> Andy BitOff ©   (14.07.10 13:38) [17]
> > Xmen   (14.07.10 10:29) [16]Нашел, блин. Сыщик. Тебе 2
> дня назад ссылку дали в [2].

Да так правильно  будет но ни как не получается использовать код.
 path:= ExtractFilePath(Application.ExeName);
 wordd:=CreateOleObject('word.application');
 wordd.documents.open(FileName := path+'\out\main.doc', ReadOnly := False);
 for i:=1 to 5 do
  begin
   wordd:=CreateOleObject('word.application');
   wordd.documents.open(FileName := path+'\out\doc'+inttostr(i)+'.doc', ReadOnly := False);
   Wordd.Selection.WholeStory;
   Wordd.Selection.Copy;
   Wordd.ActiveWindow.Close;
   //vr:=wdStory;
   //wordd.Selection.EndKey(vr,EmptyParam);
   wordd.selection.paste;
   Wordd.ActiveDocument.Save;
   Wordd.ActiveDocument.Close(Saves:=0);
  end;

 wordd.Documents.Item(path+'\out\main.doc').Activate;
 Wordd.ActiveDocument.Save;


Andy BitOff   (2010-07-14 13:38:00) [8]

> Xmen   (14.07.10 10:29) [16]

Нашел, блин. Сыщик. Тебе 2 дня назад ссылку дали в [2].


Xmen   (2010-07-14 10:29:00) [9]

Нашел по поиску и хотел под себя использовать но не получается вот код и ошибка.
procedure TMainForm.Button1Click(Sender: TObject);
var wordd:variant;
   path:string;
   i:Integer;
   vr, wdStory, wdDoNotSaveChanges:olevariant;
begin
 path:= ExtractFilePath(Application.ExeName);
 wordd:=CreateOleObject('word.application');
 wordd.documents.open(FileName := path+'\end\main.doc', ReadOnly := False);
 for i:=1 to 5 do
  begin
   wordd:=CreateOleObject('word.application');
   wordd.documents.open(FileName := path+'\out\doc'+inttostr(i)+'.doc', ReadOnly := False);
   Wordd.Selection.WholeStory;
   Wordd.Selection.Copy;
   wordd.Documents.Item(path+'\end\main.doc').Activate;(-Неверное имя файла-)
   //vr:=wdStory;
   //wordd.Selection.EndKey(vr,EmptyParam);
   wordd.selection.paste;
   wordd.Documents.Item(path+'\out\doc'+inttostr(i)+'.doc').Activate;
   Wordd.ActiveDocument.Close(Saves:=0);
  end;
 wordd.Documents.Item(path+'\end\main.doc').Activate;
 Wordd.ActiveDocument.Save;
end;


Leonid Troyanovsky   (2010-07-13 16:23:00) [10]


> Anatoly Podgoretsky ©   (13.07.10 14:50) [13]

Да и Эксель сгодится, хотя Акцесс, конечно, лучше.

--
Regards, LVT.


Xmen   (2010-07-13 16:14:00) [11]

Как говорил эксел файле есть данные, есть ворд документ шаблон где есть переменные которых нужно указать. ворд документ содержит текст предупреждения там нужно поменять для каждого абонента данные. Я так сделал прогу беру данные из экселя беру шаблон наполняю данным и сохраняю в файле. Вот код функции не мои из примера.
var
 MainForm: TMainForm;
 W:variant;

implementation

{$R *.dfm}

Function CreateWord:boolean;
begin
CreateWord:=true;
try
W:=CreateOleObject('Word.Application');
except
CreateWord:=false;
end;
end;
Function VisibleWord (visible:boolean):boolean;
begin
VisibleWord:=true;
try
W.visible:= visible;
except
VisibleWord:=false;
end;
End;
Function AddDoc:boolean;
Var Doc_:variant;
begin
AddDoc:=true;
try
Doc_:=W.Documents;
Doc_.Add;
except
AddDoc:=false;
end;
End;
Function SetTextToDoc(text_: string;InsertAfter_: boolean): boolean;
var Rng_:variant;
begin
SetTextToDoc:=true;
try
Rng_:=W.ActiveDocument.Range;
if InsertAfter_
 then Rng_.InsertAfter(text_)
 else Rng_.InsertBefore(text_);
except
SetTextToDoc:=false;
end;
End;
Function SaveDocAs(file_:string):boolean;
begin
SaveDocAs:=true;
try
W.ActiveDocument.SaveAs(file_);
except
SaveDocAs:=false;
end;
End;

Function CloseDoc:boolean;
begin
CloseDoc:=true;
try
W.ActiveDocument.Close;
except
CloseDoc:=false;
end;
End;

Function CloseWord:boolean;
begin
CloseWord:=true;
try
W.Quit;
except
CloseWord:=false;
end;
End;
Function OpenDoc (file_:string):boolean;
Var Doc_:variant;
begin
OpenDoc:=true;
try
 Doc_:=W.Documents;
 Doc_.Open(file_);
except
 OpenDoc:=false;
end;
End;
Function StartOfDoc:boolean;
begin
StartOfDoc:=true;
try
 W.Selection.End:=0;
 W.Selection.Start:=0;
except
 StartOfDoc:=false;
end;
End;
Function PasteTextDoc (text_:string):boolean;
begin
PasteTextDoc:=true;
Try
 W.Selection.Delete;
 W.Selection.InsertAfter (text_);
except
 PasteTextDoc:=false;
end;
End;

Function FindAndPasteTextDoc
(findtext_,pastetext_:string): boolean;
begin
FindAndPasteTextDoc:=true;
try
 W.Selection.Find.Forward:=true;
 W.Selection.Find.Text:= findtext_;
 if W.Selection.Find.Execute then begin
  W.Selection.Delete;
  W.Selection.InsertAfter (pastetext_);
 end else FindAndPasteTextDoc:=false;
except
 FindAndPasteTextDoc:=false;
end;
End;

Function FindTextDoc (text_:string):boolean;
begin
FindTextDoc:=true;
Try
 W.Selection.Find.Forward:=true;
 W.Selection.Find.Text:=text_;
 FindTextDoc := W.Selection.Find.Execute;
except
 FindTextDoc:=false;
end;
End;
Function PrintDialogWord:boolean;
Const wdDialogFilePrint=88;
begin
PrintDialogWord:=true;
try
 W.Dialogs.Item(wdDialogFilePrint).Show;
except
 PrintDialogWord:=false;
end;
End;

procedure TMainForm.SpeedButton1Click(Sender: TObject);
var F: TSearchRec;
   done: integer;
   path:string;
begin
path:= ExtractFilePath(Application.ExeName);
ChDir(path+'in');
Label5.Caption:=path+'in';
ListBox1.Items.Clear;
done := FindFirst(path+'in\*.xls',faArchive,F);
while done = 0 do
 begin
   ListBox1.Items.Add(F.Name);
   done := FindNext(F);
 end;
end;

procedure TMainForm.RzBitBtn1Click(Sender: TObject);
const
  xlCellTypeLastCell = $0000000B;
var
  exl:OleVariant;
  WorkBook, Sheet : Variant;
  path:string;
  fio,maxalla,kocha,ab_kod,qarz,penya,sumqarz, xatN, yil, kun, oy, mydata:string;
  i,x,r:integer;
begin
   yil:=Copy(DBDateTimeEditEh1.Text,7,4);
   oy:=Copy(DBDateTimeEditEh1.Text,4,2);
   kun:=Copy(DBDateTimeEditEh1.Text,1,2);
   if oy='01' then oy:= 'январь';
   if oy='02' then oy:= 'февраль';
   if oy='03' then oy:= 'март';
   if oy='04' then oy:= 'апрель';
   if oy='05' then oy:= 'май';
   if oy='06' then oy:= 'июнь';
   if oy='07' then oy:= 'июль';
   if oy='08' then oy:= 'август';
   if oy='09' then oy:= 'сентябрь';
   if oy='10' then oy:= 'октябрь';
   if oy='11' then oy:= 'ноябрь';
   if oy='12' then oy:= 'декабрь';
   mydata:='"'+kun+'"  '+oy+'  ';

   if not (DBDateTimeEditEh1.Text = '  .  .    ') then
     begin
       chdir(Label5.Caption);
       path:= ExtractFilePath(Application.ExeName);
       exl:=CreateOleObject('Excel.Application');
       Workbook:=exl.Application.WorkBooks.Add(Label5.Caption+'\'+Edit3.Text);
       exl.ActiveSheet.UnProtect(Password:='mohira');
       Sheet:=WorkBook.WorkSheets[1];
       Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
       x := exl.ActiveCell.Row;
       i:=0;
       repeat
        for r := 5 to x do
          begin
           maxalla:=exl.Cells.Item[r,1].Value;
           kocha:=exl.Cells.Item[r,2].Value;
           fio:=exl.Cells.Item[r,3].Value;
           ab_kod:=exl.Cells.Item[r,4].Value;
           qarz:=exl.Cells.Item[r,5].Value;
           penya:=exl.Cells.Item[r,6].Value;
           sumqarz:=exl.Cells.Item[r,7].Value;
           xatN:=inttostr(strtoint(Edit1.Text)+i);
           CreateWord;
           OpenDoc(ExtractFileDir(application.ExeName)+'\shablon.doc');

           StartOfDoc; FindAndPasteTextDoc('###maxalla&',maxalla);
           StartOfDoc; FindAndPasteTextDoc('###kocha&',kocha);
           StartOfDoc; FindAndPasteTextDoc('###fio&',fio);
           StartOfDoc; FindAndPasteTextDoc('###fio2&',fio);
           StartOfDoc; FindAndPasteTextDoc('###ab_kod&',ab_kod);
           StartOfDoc; FindAndPasteTextDoc('###qarz&',qarz);
           StartOfDoc; FindAndPasteTextDoc('###penya&',penya);
           StartOfDoc; FindAndPasteTextDoc('###sumqarz&',sumqarz);
           StartOfDoc; FindAndPasteTextDoc('###yil&',yil);
           StartOfDoc; FindAndPasteTextDoc('###data&',mydata);
           StartOfDoc; FindAndPasteTextDoc('###yil2&',yil);
           StartOfDoc; FindAndPasteTextDoc('###data2&',mydata);
           StartOfDoc; FindAndPasteTextDoc('###xat&',xatN);
           StartOfDoc; FindAndPasteTextDoc('###maxalla2&',maxalla);
           StartOfDoc; FindAndPasteTextDoc('###kocha2&',kocha);
           StartOfDoc; FindAndPasteTextDoc('###fio3&',fio);
           StartOfDoc; FindAndPasteTextDoc('###fio4&',fio);
           StartOfDoc; FindAndPasteTextDoc('###ab_kod2&',ab_kod);
           StartOfDoc; FindAndPasteTextDoc('###qarz2&',qarz);
           StartOfDoc; FindAndPasteTextDoc('###penya2&',penya);
           StartOfDoc; FindAndPasteTextDoc('###sumqarz2&',sumqarz);
           StartOfDoc; FindAndPasteTextDoc('###yil3&',yil);
           StartOfDoc; FindAndPasteTextDoc('###data3&',mydata);
           StartOfDoc; FindAndPasteTextDoc('###yil4&',yil);
           StartOfDoc; FindAndPasteTextDoc('###data4&',mydata);
           StartOfDoc; FindAndPasteTextDoc('###xat2&',xatN);
           SaveDocAs(ExtractFileDir(application.ExeName)+'\out\doc'+xatN+'.doc');
           CloseDoc;
           inc(i);
   
           if i=5 then Exit;
          end;
       until exl.Cells.Item[r,2].Value='';
       Exl.Quit;
       Exl := Unassigned;
     end
   else
    begin
      ShowMessage('Äàííûå íå ïîëíûå!');
    end;
end;
 
файл сохраняется в отдельных файлах. проста настаивають чтобы в файле было по 100.


Anatoly Podgoretsky   (2010-07-13 14:50:00) [12]

Кстати тут не Эксель нужен, а Акцесс и Ворд для слияния.


Anatoly Podgoretsky   (2010-07-13 14:50:00) [13]


> Xmen   (13.07.10 09:01) [3]

Файл нужен один, последовательно выводишь в него данные и печатаешь. С точки зрения пользователя, выглядит как печать одного файла


ixen   (2010-07-13 14:19:00) [14]

> Да нет это чтобы напечатать было легко и файлов было меньше.

а ты печатаешь потом в ручную что ли? Не проще ли сразу на печать отправлять, как документ сформировал, сохранил.. и документы обзывать сразу можно по ФИО. Хотя я бы не делал сохранения документов, а добавлял строчку в БД с данными человека. Потом если жокумент понадобится его всегда можно распечатать вновь... зачем хранить эти файлы?


Dennis I. Komarov   (2010-07-13 14:12:00) [15]


> Xmen   (13.07.10 13:47) [9]

Не вижу в этом ничего хорошего...
Чем легче напечатать 100 листов, чем 100 раз 1?
Чем хуже 26000 файлов, чем 260 но в 100 раз больше?


Xmen   (2010-07-13 13:47:00) [16]


> А затем чтобы один лист посмотреть открывать документ из
> 100 листов?

Да нет это чтобы напечатать было легко и файлов было меньше.


Двенадцать   (2010-07-13 12:44:00) [17]

создать, открыть, скопировать, вставить

так макрос кажет
   Selection.WholeStory
   Selection.Copy
   Windows("Документ2").Activate
   Selection.PasteAndFormat (wdPasteDefault)


Dennis I. Komarov   (2010-07-13 12:39:00) [18]


> У меня Этих файлов получается много и их нужно присоединить
> по 100 файлов (в одном доке 1 лист) предупредительного письма)

А затем чтобы один лист посмотреть открывать документ из 100 листов?


Leonid Troyanovsky   (2010-07-13 12:28:00) [19]


> Xmen   (13.07.10 11:36) [5]

> Конкретно где нужно читать.

http://office.microsoft.com/ru-ru/training/RZ001120568.aspx

--
Regards, LVT.


Xmen   (2010-07-13 11:36:00) [20]


> Leonid Troyanovsky ©   (13.07.10 10:09) [4]
> > Xmen   (13.07.10 09:01) [3] >  У меня Этих файлов получается
> много и их нужно присоединить > по 100 файлов (в одном доке
> 1 лист) предупредительного письма)Читай справку ворда про
> документ слияния.Программировать ничего не нужно, все уже
> украдено до нас.--Regards, LVT.


Конкретно где нужно читать.
Спасибо за ранее!


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо