Форум: "Corba";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];
ВнизРабота с Word Найти похожие ветки
← →
Death © (2005-01-10 17:57) [0]Такой вопрос:
Есть у меня массив с данными и шаблон документа Word (Word2000/XP), например
======================================
Фамилия:
Имя:
Отчество:
=====================================
мне нужно с массива скинуть в Word значения чтобы вышло так:
1 страница ============================
Фамилия: Иванов
Имя: Иван
Отчество: Иванович
2 страница ============================
Фамилия: Петров
Имя: Петр
Отчество: Петрович
.
.
.
Иванов, Петров и т.д. берутся с масива.
Пробывал через OLE и закладок в Word:
...
TDan = record
fio,
nam,
par: string;
end;
...
var
Arr: array[0..100] of TDan;
...
w.editGoto("закладка");
w.insert(Arr[1].fio);
не выходит.
Как это можно сделать. Киньте пример на мыло или в форум.
← →
GanibalLector © (2005-01-10 23:58) [1]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type TDan = record
fio,
nam,
par: string;
end;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Arr: array of TDan;
implementation
uses ComObj;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var WordApp :Variant;
Doc1,Doc2,BookmarkName:OleVariant;
i:integer;R:OleVariant;
begin
WordApp := CreateOleObject("Word.Application");
WordApp.Documents.add;
WordApp.visible:=false;
Doc1:=WordApp.ActiveDocument;
for i:=0 to length(Arr)-1 do begin
WordApp.Documents.Open("e:\worddoc.doc");
Doc2:=WordApp.ActiveDocument;
BookmarkName:="zk1";
if Doc2.Bookmarks.Exists(BookmarkName) then
begin
R := Doc2.Bookmarks.Item(BookmarkName).Range;
R.InsertAfter(Arr[i].fio);
R.Font.Size:=10.5;
R.Font.Name:="Bookman Old Style";
R.Font.Bold:=1;
R.Font.Italic:=1;
end;
BookmarkName:="zk2";
if Doc2.Bookmarks.Exists(BookmarkName) then
begin
R := Doc2.Bookmarks.Item(BookmarkName).Range;
R.InsertAfter(Arr[i].nam);
R.Font.Size:=10.5;
R.Font.Name:="Bookman Old Style";
R.Font.Bold:=1;
R.Font.Italic:=1;
end;
BookmarkName:="zk3";
if Doc2.Bookmarks.Exists(BookmarkName) then
begin
R := Doc2.Bookmarks.Item(BookmarkName).Range;
R.InsertAfter(Arr[i].par);
R.Font.Size:=10.5;
R.Font.Name:="Bookman Old Style";
R.Font.Bold:=0; // ;)
R.Font.Italic:=1;
end;
Doc2.Select;
WordApp.Selection.Copy;
WordApp.Selection.Collapse($00000000); //wdCollapseEnd
Doc1.activate;
WordApp.Selection.paste;
if i<>length(Arr)-1 then WordApp.Selection.InsertBreak;
WordApp.DisplayAlerts := 0;
Doc2.close($00000000);
end;
WordApp.Selection.HomeKey($00000006,EmptyParam);
WordApp.visible:=true;
R:=UnAssigned;
Doc1:=UnAssigned;
Doc2:=UnAssigned;
BookmarkName:=UnAssigned;
WordApp :=UnAssigned;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
setlength(Arr,2);
Arr[0].fio:="GanibalLector";
Arr[0].nam:="CooL";
Arr[0].par:="BOY";
Arr[1].fio:="ICQ:949531";
Arr[1].nam:="ICQ:751407";
Arr[1].par:="WOW";
end;
end.
← →
GanibalLector © (2005-01-11 00:00) [2]Хотя,я бы все это в потоке сделал.Добавил бы еще форму для вывода процента выполнения.Ну и,много еще чего...
З.Ы.Дерзай ;)
← →
GanibalLector © (2005-01-11 00:02) [3]По поводу [1].
По пути должен лежать файл : e:\worddoc.doc
с тремя закладками : zk1 zk2 zk3
← →
YurikGL © (2005-01-11 10:10) [4]
> GanibalLector © (11.01.05 00:02) [3]
Я бы без шаблона делал... сразу бы выкидывал и "имя" и "Иванов"
← →
GanibalLector © (2005-01-11 20:32) [5]2 YurikGL
>Я бы без шаблона делал
Дык покажи ...Посмотрим.
← →
YurikGL © (2005-01-12 08:55) [6]GanibalLector © (11.01.05 20:32) [5]
http://delphimaster.net/view/10-1105369061/
← →
GanibalLector © (2005-01-12 09:21) [7]2 YurikGL © (12.01.05 08:55) [6]
Не понял.Я пытаюсь понять,как бы ты делал без закладок,когда выходное кол-во документов не известно.Может он 1,а может 10,а может и 100 ???
← →
YurikGL © (2005-01-13 13:16) [8]
> GanibalLector © (12.01.05 09:21) [7]
если описывать пример Death ©
то ИМХО шаблон не нужен... если, конечно, не предполагается, что пользователь будет что-то менять в шаблоне...
В общих чертах:
Открываем ворд, создаем документ....
Для все элементов массива начало
Вставляем " ============================#13"
Вставляем текст "Фамилия"+mas[i].fam+#13
Вставляем текст "Имя"+mas[i].fam+#13
Вставляем текст "Отчество"+mas[i].fam+#13
Вставляем разрыв страницы
конец
Кстати, если использовать шаблоны, то зачем из программы потом шрифтами управлять? Я имею в видуR.Font.Size:=10.5;
R.Font.Name:="Bookman Old Style";
R.Font.Bold:=1;
R.Font.Italic:=1;
Можно же изначально в шаблоне в нужном месте нужный шрифт поставить...
← →
GanibalLector © (2005-01-16 02:07) [9]>Кстати, если использовать шаблоны, то зачем из программы потом шрифтами управлять?
А хрен его знает.Не подумал ;)
>если описывать пример Death то ИМХО шаблон не нужен
Да,согласен.Получится весьма красочный документ из ФИО на каждой странице.Весело ;)
← →
YurikGL © (2005-01-16 08:49) [10]
> GanibalLector © (16.01.05 02:07) [9]
В целом о выборе между шаблоном и не шаблоном могу сказать так:
Если работаешь без шаблона, то всегда есть вероятность того, что на конкретной машине могут быть какие-нибудь хитрые настройки шрифтов-абзацев по умолчанию и если их напрямую не прописать типа:R.Font.Size:=10.5;
R.Font.Name:="Bookman Old Style";
R.Font.Bold:=1;
R.Font.Italic:=1;
то на разных машинах сгенерированный документ может отличаться. Поэтому, если программа рассчитана на создание строгих документов и планируется ее распространение в другие точки а не только для внутреннего пользования, то лучше использовать шаблоны. Шаблоны еще лучше использовать тогда, когда нужно формировать действительно сложный документ с колонтитулами, заголовками, титульными листами и т.п.
Если стоит задача просто формировать текст, которой потом можно править и все не очень строго и далеко программа не поедет, то шаблоны нафиг не нужны.
Страницы: 1 вся ветка
Форум: "Corba";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.039 c