![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как можно присоединить пару документов Word. [D7, XP]
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.
Конкретно где нужно читать.
Спасибо за ранее!