Delphi и Word.
я думаю он разрешит все вопросы связанные с работой с вордом
procedure TForm1.N3Click(Sender: TObject); //ПРИКАЗ НА ОТЧИСЛЕНИЕ
var len,a,b:OleVariant;
i:integer;
FileName:OleVariant;
begin
Stop;
FiLeName:=ShablonName+'приказ на отчисление.doc';
for i:=1 to 2 do
WordApplication1.Documents.Open(FileName,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam);
WordDocument1.ConnectKind:=ckAttachToInterface;
WordDocument1.ConnectTo(WordApplication1.ActiveDocument);
len:=Length(WordDocument1.Range.Text); //DATE
for i:=1 to len-4 do
begin
a:=i;
b:=i+4;
if WordDocument1.Range(a,b).Text='DATE' then
begin
WordDocument1.Range(a,b).InsertAfter(MaskEdit1.Text);
WordDocument1.Range(a,b).Cut;
break;
end;
end;
len:=Length(WordDocument1.Range.Text); //NAME
for i:=1 to len-4 do
begin
a:=i;
b:=i+4;
if WordDocument1.Range(a,b).Text='NAME' then
begin
WordDocument1.Range(a,b).InsertAfter(Edit7.Text+' '+Edit8.Text+' '+Edit9.Text);
WordDocument1.Range(a,b).Cut;
break;
end;
end;
len:=Length(WordDocument1.Range.Text); //SPEC
for i:=1 to len-4 do
begin
a:=i;
b:=i+4;
if WordDocument1.Range(a,b).Text='SPEC' then
begin
WordDocument1.Range(a,b).InsertAfter(Edit12.Text);
WordDocument1.Range(a,b).Cut;
break;
end;
end;
len:=Length(WordDocument1.Range.Text); //GROUP
for i:=1 to len-5 do
begin
a:=i;
b:=i+5;
if WordDocument1.Range(a,b).Text='GROUP' then
begin
WordDocument1.Range(a,b).InsertAfter(Edit11.Text);
WordDocument1.Range(a,b).Cut;
break;
end;
end;
len:=Length(WordDocument1.Range.Text); //DAT2
for i:=1 to len-4 do
begin
a:=i;
b:=i+4;
if WordDocument1.Range(a,b).Text='DAT2' then
begin
WordDocument1.Range(a,b).InsertAfter(MaskEdit2.Text);
WordDocument1.Range(a,b).Cut;
break;
end;
end;
len:=Length(WordDocument1.Range.Text); //DECAN
for i:=1 to len-5 do
begin
a:=i;
b:=i+5;
if WordDocument1.Range(a,b).Text='DECAN' then
begin
WordDocument1.Range(a,b).InsertAfter(Edit1.Text+' '+Edit2.Text+' '+Edit3.Text);
WordDocument1.Range(a,b).Cut;
break;
end;
end;
if (Image1.Picture.Height>0) and (CheckBox1.Checked) then
begin
Clipboard.Assign(Image1.Picture); //@}
len:=Length(WordDocument1.Range.Text);
for i:=1 to len-1 do
begin
a:=i;
b:=i+1;
if WordDocument1.Range(a,b).Text='@' then
begin
WordDocument1.Range(a,b).paste;
break;
end;
end;
end;
WordDocument1.Disconnect;
WordApplication1.Disconnect;
Play;
end;
Все бы хорошо, но процесс замены меток на данные из формы занимает от 2 до 5 секунд, независимо от мощности компа!Я прекрасно понимаю, что поиском меток можно заниматься и в фоновом режиме, а не при нажатии кнопок, но это все неважно! Меня интерисует почему все так долго происходит. Дело в Office или в используемых мною операциях, например:
WordDocument1.Range(a,b).Text='@';
WordDocument1.Range(a,b).paste;
После того как Word закрылся у моей проги может появиться нужда снова открыть DocumentWord. Но на сей раз система выдает некритическую ошибку "Сервер RCP недоступен" и обламывает меня!Если же WordDocument не закрывать, то все работает и можно еще сколько угодно раз запустить документы.
Вот с этим багом я сталкивался. Просто ставит меня в тупик. Мы с коллегой бились, но ничего не придумали. Главное, что у Excel такого глюка нет! А у ворды, если само приложение не закрывать, то документы можно и закрывать и открывать, а вызов приложения срабатывает только один раз за время жизни твоего процесса. Если юзер закрывает WordApplication, то прям хоть программу закрывай.... ;о((
Прога у меня занимается тем, что создает отчеты. Для этого она находит в вордовском шаблоне метку(например NAME) и на ее место вставляет что-нить из полей формы.
А почему бы не использовать EK_RTF?
Все бы хорошо, но процесс замены меток на данные из формы занимает от 2 до 5 секунд, независимо от мощности компа...
Чтобы небыло тормозов при замене надо отключать проверку орфографии и грамматики...
WordApplication1.Options.CheckSpellingAsYouType := False;
WordApplication1.Options.CheckGrammarAsYouType := False;
Вот с этим багом я сталкивался. Просто ставит меня в тупик. Мы с коллегой бились, но ничего не придумали. Главное, что у Excel такого глюка нет! А у ворды, если само приложение не закрывать, то документы можно и закрывать и открывать, а вызов приложения срабатывает только один раз за время жизни твоего процесса. Если юзер закрывает WordApplication, то прям хоть программу закрывай.... ;о((
В начале делаешь так:
WordApplication1.Documents.Open(FileName,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam);
WordDocument1.ConnectKind:=ckAttachToInterface;
WordDocument1.ConnectTo(WordApplication1.ActiveDocument);
причем у WordApplication должно быть изначально задано, что он сначала или создает новый процесс или конатится к уже существующему.
После всех операций делай так:
WordDocument1.Disconnect;
WordApplication1.Disconnect;
и все на 5+. Бился над этим три дня - ответ пришел во сне. Вывод: надо больше спать - полезно и для ума и для здоровья.
Чтобы небыло тормозов при замене надо отключать проверку орфографии и грамматики...
WordApplication1.Options.CheckSpellingAsYouType := False;
WordApplication1.Options.CheckGrammarAsYouType := False;
Что-то не канает!А эта самая проверка орфографии отключается только для вставляемого текста или для всего документа (потому что в самом ворде проверка орфографии работает на загляденье)?Может я ее не в том месте вставил (до того как открыл документ,после того, как открыл документ, а для верности еще и когда подцепился к нему)? Время немного сократилось, но совсеееем на чуток!Какая еще вата может быть?
Какая еще вата может быть?
попробуй такой алгоритм
S: WideString;
...
begin
...
S := WordDocument1.Range.Text;
...
I := Pos('DATE', S);
if I > 0 then begin
Delete(S, I, 4);
Insert(MaskEdit1.Text, S, I);
end;
//и так далее
...
WordDocument1.Range.Text := S;
...
end;