Автоматизация Word 2010: «Перейти в закладки» - PullRequest
6 голосов
/ 06 мая 2011

У меня есть программа, написанная на Delphi-7, которая открывает новый документ Word, основанный на шаблоне.
Как только документ открыт, автоматизация переходит к закладке (предопределенной в шаблоне) и добавляет туда некоторый текст.
Следующий код прекрасно работает в Word 2003, но вызывает сообщение об ошибке invalid variant operation в Word 2010 (для ясности я пропустил блоки try/except) .

wrdapp:= CreateOleObject ('Word.Application');
wrdDoc:= wrdapp.documents.add (wrdApp.Options.DefaultFilePath[wdUserTemplatesPath] + '1.dot'
wrdApp.selection.goto (wdGotoBookmark, unassigned, unassigned, 'B1')

Если заменить третью строку на

wrdDoc.bookmarks.item ('B1').select

программа отлично работает в Word 2003, но все еще вылетает в Word 2010.

Какой правильный код Word 2010 для перехода к закладке?

Ответы [ 3 ]

5 голосов
/ 07 мая 2011

В Word 2010 есть ошибка, связанная с загрузкой Normal.dotm (и, может быть, плагины тоже, кто знает?). Когда вы запускаете Word 2010, как обычно, вы видите заставку, и Word выполняет некоторую инициализацию, включая загрузку Normal.dotm. Когда вы запускаете Word с помощью автоматизации - CreateOleObject('Word.Application') - он не ожидает загрузки Normal.dotm и сразу же возвращается. Но выполнение операций, когда Normal.dotm все еще загружается, похоже, приводит к сбою Word. Чтобы решить эту проблему, я создал цикл, который просто ждет загрузки шаблона. Вы также можете выбрать задержку, чтобы дать Word время для инициализации, но пока цикл работает.

Примерно так:

wrdapp := CreateOleObject('Word.Application');

//loop that waits for the normal template to load
while wrdapp.Templates.Count = 0 do
  Sleep(200);

//continue operations

PS: у меня нет Delphi, поэтому код может содержать ошибки, но вы поняли

0 голосов
/ 19 мая 2011

Привет, надеюсь, это поможет вам. Я использую D2010 и Office 2010

Что я делаю: если я нашел имя закладки, я вставляю слово Document в эту точку

Часть моего кода:


try
  Template    := EmptyParam;
  NewTemplate := true;
  ItemIndex   := 1;
  try
     Wdapplication.Connect;
  except
     Screen.Cursor := crDefault;
     MessageDlg('No se detecta Word Puede no estar instalado(1) o versi?n incorrecta de Word', mtError, [mbOK], 0);
     Abort;
     result := False;
  end;
  Wdapplication.Visible := true; // False;
  WdApplication.Caption := 'Kalemat automation';
  {Turn Spell checking of because it takes a long time if enabled and slows down Winword}
  WdApplication.Options.CheckSpellingAsYouType := false;
  WdApplication.Options.CheckGrammarAsYouType := false;
  lbInfo.Lines.Add('Word connected');
except
  on E: Exception do begin
     ShowMessage(E.Message);
     WdApplication.Disconnect;
     result := False;
     Exit;
  end;
end;

//-
if wdapplication.Documents.Count > 0 then begin
  Screen.Cursor         := crDefault;
  MessageDlg(
     'Por Favor cierre todos sus Word-documentos antes de proseguir...', mtWarning,
     [mbRetry], 0);
  wdApplication.Visible := true;
  WdApplication.Disconnect;
     result := False;
  exit;
end
else begin
  with WdApplication do begin
     //      OnQuit             := WordAppQuit;
     //      OnChangeDocument   := WordDocChange;
     //      OnOpenDocument     := WordDocOpen;
     //      OnPreCloseDocument := WordPreClose;
     //      OnCloseDocument    := WordDocClose;
     //      DisableSystemCloseBox;
  end
end;
{Create new document}
Template     := EmptyParam;
NewTemplate  := false;
oNewDocument := ModEsc;

// abre documento 
lbInfo.Lines.Add('Abriendo escritura '+ModEsc);

WdApplication.Documents.AddOld(oNewDocument, NewTemplate);
// Conecta con al instancia de Word
WdDocument.ConnectTo(WdApplication.Documents.Item(ItemIndex));
sBookMarkName := 'FPROEMIO';
lbInfo.Lines.Add('Busca marcador Proemio');
if WdDocument.Bookmarks.Exists(sBookMarkName) then begin
  //     ShowMessage(' -Existe: '+sBookMarkName);
  owhat := wdGotoBookMark;
  owhich := unAssigned;
  ocount := unAssigned;
  //-->>>      //     ShowMessage(' -Ve a..: '+sBookMarkName);
  //-->>>      //   Ve a ese marcados addendum

  wdDocument.GoTo_(oWhat, oWhich, OCount, sBookMarkName);

  //     ShowMessage(' GoTo_.. ya estoy en: '+sBookMarkName);
  //   Lo encontre
  oRange       := '';
  oConformConv := false;
  oLink        := false;
  oattachment  := false;
  fl_Name      := proemi;
  lbInfo.Lines.Add('Insertando Proemio '+Proemi);
  if not FileExists(fl_name) then begin
     Screen.Cursor := crDefault;
     lbInfo.Lines.Add('No Existe Documento PROEMIO ');
     MessageDlg('Documento FPROEMIO NO EXISTE, Revise el modelo de escritura', mtError, [mbRetry], 0);
  end
  else
    wdDocument.Bookmarks.Item(sBookMarkName).Range.InsertFile(Fl_Name, oRange, oConformConv, oLink, oattachment);
  //     ShowMessage(' -.. inserte el addendum');
end
else begin
  lbInfo.Lines.Add('No Existe Marcador PROEMIO ');
end;
0 голосов
/ 07 мая 2011

Я думаю, вы должны заменить константы в вызове "GoTo_" переменными.Вот так:

...
var 
  vWhat, vBookmark:OleVariant;
begin
  ...
  vWhat:=wdGoToBookmark;
  vBookmark:='B1';
  wrdApp.Selection.GoTo_(vWhat,emptyParam,emptyParam,vBookmark);
  ...
end;
...