Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.10.10;
Скачать: [xml.tar.bz2];

Вниз

Как можно присоединить пару документов Word.   Найти похожие ветки 

 
Xmen   (2010-07-12 16:00) [0]

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


 
KilkennyCat ©   (2010-07-12 18:35) [1]

Во-первых, пара - это не много, так что двойка тебе.
Во-вторых, соединить -  это не присоединить, оценку снижаем до кола.
В-третьих, если документы одинаковые, то зачем их много?


 
Andy BitOff ©   (2010-07-12 20:13) [2]

http://delphimaster.net/view/1-1275582894/


 
Xmen   (2010-07-13 09:01) [3]

Во-первых, пара - это не много?! это условно написал если пару файлов получится соединить то и получится и других присоединить.
Во-вторых, соединить -  это не присоединить, может быть не спорю я не очень силен по - русскому языку.
В-третьих, если документы одинаковые, то зачем их много? Потому что одинаковые шаблоны но в них данные меняются (ф.и.о., сумма, пеня, число). И таких документов где то 26000.
Теперь по порядку.
Есть Excel документ там есть список должников по электроэнергию.
Ф.И.О., сумма, пеня, общая сумма, число, номер абонента.
Есть шаблон Word документа там есть переменные. Я сделал прогу который читает Excel документ и выбивает данные в шаблон Word документа вместо переменных и сохраняет в файл. У меня Этих файлов получается много и их нужно присоединить по 100 файлов (в одном доке 1 лист) предупредительного письма)


 
Leonid Troyanovsky ©   (2010-07-13 10:09) [4]


> Xmen   (13.07.10 09:01) [3]

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

Читай справку ворда про документ слияния.
Программировать ничего не нужно, все уже украдено до нас.

--
Regards, LVT.


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


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


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


 
Leonid Troyanovsky ©   (2010-07-13 12:28) [6]


> Xmen   (13.07.10 11:36) [5]

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

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

--
Regards, LVT.


 
Dennis I. Komarov ©   (2010-07-13 12:39) [7]


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

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


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

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

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


 
Xmen   (2010-07-13 13:47) [9]


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

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


 
Dennis I. Komarov ©   (2010-07-13 14:12) [10]


> Xmen   (13.07.10 13:47) [9]

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


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

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

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


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


> Xmen   (13.07.10 09:01) [3]

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


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

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


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

Как говорил эксел файле есть данные, есть ворд документ шаблон где есть переменные которых нужно указать. ворд документ содержит текст предупреждения там нужно поменять для каждого абонента данные. Я так сделал прогу беру данные из экселя беру шаблон наполняю данным и сохраняю в файле. Вот код функции не мои из примера.
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.


 
Leonid Troyanovsky ©   (2010-07-13 16:23) [15]


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

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

--
Regards, LVT.


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

Нашел по поиску и хотел под себя использовать но не получается вот код и ошибка.
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;


 
Andy BitOff ©   (2010-07-14 13:38) [17]

> Xmen   (14.07.10 10:29) [16]

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


 
Xmen   (2010-07-14 14:55) [18]


> 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 15:36) [19]

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

Вот это работает?
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 15:58) [20]


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

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


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

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


 
Xmen   (2010-07-14 16:14) [22]

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


 
Leonid Troyanovsky ©   (2010-07-14 18:40) [23]


> Xmen   (13.07.10 16:14) [14]

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

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

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

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

--
Regards, LVT.


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

у меня вот так получился может кому небуд пригодится  
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;



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.10.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.005 c
2-1279194682
Patrick
2010-07-15 15:51
2010.10.10
Макроподстановка.


11-1225192492
samir105
2008-10-28 14:14
2010.10.10
Искажаются некоторые Unicode символы!


2-1279609451
Vladimir
2010-07-20 11:04
2010.10.10
Зарисовка формы


15-1278388277
boriskb
2010-07-06 07:51
2010.10.10
Проект закона об Интернете


15-1279017288
Styx
2010-07-13 14:34
2010.10.10
Функция сходства для положения объектов в 3D





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский