2016-12-22 9 views
0

Я использую Delphi 7 для обработки документа слияния документов, уже созданного вне delphi и фиксированного слиянием полей, моя цель - отредактировать (изменить) это поле слияния через delphi 7.Редактирование поля слияния в документе Word Программно

Позвольте просто сказать, что у меня есть поле слияния с именем 'field1', мне нужно изменить, чтобы имя поля слияния 'field2'.

Я пробовал следующее, чтобы открыть и заменить (изменить) поле слияния, но я только заменю текст, поле слияния на самом деле все равно остается прежним до замены.

procedure openword; 
var 
    WordApp: OleVariant; 
begin 
    WordApp := CreateOleObject('Word.Application'); 
    WordApp.Visible := True; 
    WordApp.Documents.Open('C:\Test.doc'); 
end; 

procedure editmergefield; //replace 
Var 
    WordApp : OleVariant; 
begin 
    WordApp := GetActiveOleObject('Word.Application'); 
    WordApp.Selection.Find.ClearFormatting; 
    WordApp.Selection.Find.Replacement.ClearFormatting; 
    WordApp.Selection.Find.Execute(
    'Field1',True,True,False,False,False,False,1,False,'Field2',2); 
end; 

ответ

1

У меня есть 2007 документ Word, содержащий два MailMerge поля, Title и Last_Name. Следующий код D7 изменяет имя первого из них на First_name.

procedure TForm1.Button1Click(Sender: TObject); 
var 
    AFileName : String; 
    MSWord, 
    Document : OleVariant; 
    S : String; 
    mmFields : MailMergeFields; 
    mmField : MailMergeField; 
begin 
    AFileName := 'd:\aaad7\officeauto\Dear.Docx'; 

    MSWord := CreateOleObject('Word.Application'); 
    MSWord.Visible := True; 
    Document := MSWord.Documents.Open(AFileName); 

    // The MSWord and Document objects are wrapped in OleVariants 
    // For debugging purposes, I find it easier to work with the objects 
    // defined in the MS Word type library import unit, e.g. Word2000.Pas 
    // So, the following lines access the document's MailMerge object 
    // and its mailmerge fields as interface objects 

    mmFields := IDispatch(Document.MailMerge.Fields) as MailMergeFields; 
    Assert(mmFields <> Nil); // checks that the mmFields object is not Nil 

    mmField := mmFields.Item(1); // This is the first mail merge field in the document 

    // The mmField's Code field is a Range object, and the field name 
    // is contained in the range's Text property 

    S := mmField.Code.Text; // Should contain 'MERGEFIELD "Title"'  
    S := StringReplace(S, 'Title', 'First_Name', []); 
    mmField.Code.Text := S; 
    Caption := S; 
end; 
+0

Я попробовал ваш код и он работает, в первую я не могу сказать разницу, потому что отображается поле слияния еще написал название, но когда я открываю вручную через Слово для редактирования поля, то я понимаю, что это уже было изменено , вам просто нужно выбрать поле обновления, чтобы он написал First_Name, независимо от того, выбираю ли я обновление или нет, это значение уже указывает на поле Имя, это решило мой вопрос. –

Смежные вопросы