Question

Il est évident que la bonne façon pour notre application pour générer un document Word basé sur un modèle est d'encourager les utilisateurs admin (qui s'occuper les modèles) pour intégrer les champs de fusion corrects ou signets dans le document de modèle.

Cependant, dans le passé, nous avons trouvé notre utilisateur typique d'administration qui utilisent habituellement ne pas MailMerge ou l'une des autres caractéristiques « avancées » dans Word est considérablement rebutés par avoir à utiliser des champs de fusion. Nous avons essayé de le faire pour eux, produire des documents, beaucoup de captures d'écran, etc. Mais il est tout « Checklist » pour eux.

Ils ont des dizaines de modèles (tous à différents types de lettres très simples), et veulent les modifier raisonnablement fréquemment.

Qu'est-ce qu'ils aimeraient vraiment est d'être en mesure de marquer simplement les champs avec un séparateur simple comme une accolade, qui marque effectivement un champ de fusion maison à notre application (bien que la Parole est inconscient de sa signification) comme dans:

  

Cher {CustomerSurname}

Ensuite, nous pouvons simplement prendre le champ (s) avec plusieurs lignes de code comme dans:

w = New Word.Application
d = w.Documents.Open(...)
Dim mergedContent As String = d.Content.Text
mergedContent = mergedContent.Replace("{CustomerSurname}", Customer.Surname)
mergedContent = mergedContent.Replace("{CustomerPostcode}", Customer.Postcode)
d.Content.Text = mergedContent

Cela se sent brut, mais merveilleusement simple (pour l'utilisateur final).

Quelqu'un d'autre allé dans cette voie? Tout ce qui ne va pas? Nous les conseillons de ne pas utiliser le « { » et « } » caractère ailleurs dans le texte normal du document, mais ce n'est pas vraiment une limitation importante.

Vitesse? Enroulant le champ de fusion entre deux lignes? D'autres problèmes?

Était-ce utile?

La solution

Ceci est une partie de mon code que je l'habitude de trouver et remplacer. J'ai essayé d'abord votre code, mais cela ne fonctionne pas. Ceci est basé sur le code VBA que Word génère lorsque vous enregistrez une macro.

range = document.Range()

With range.Find
 .Text = "{" & name & "}"
 .Replacement.Text = NewValueHere
 .Forward = True
 .Wrap = Word.WdFindWrap.wdFindContinue
 .Format = False
 .MatchCase = True
 .MatchWholeWord = False
 .MatchWildcards = False
 .MatchSoundsLike = False
 .MatchAllWordForms = False
End With
range.Find.Execute(Replace:=Word.WdReplace.wdReplaceAll)

J'ai utilisé ce code, car les documents devaient être compatibles avec les formats de fichiers binaires Office. Si vous pouvez utiliser le format Office 2007 vous n'avez pas besoin d'avoir Word installé. Il suffit de dézipper le document, trouver le mot \ fichier document.xml, faire un String.Replace("[OldValue]", "New value"), enregistrez le fichier zip et revenir à un paquet (fichier .docx). Le code que nous affichons est assez lent parce que je suis l'automatisation de Word. Mot d'ouverture, édition 2 documents avec 6 champs et la fermeture de l'application prend 4 secondes sur mon pc.

Autres conseils

Que faire si l'utilisateur ne veut utiliser des accolades? Je pense que vous devez fournir un moyen de leur échapper par exemple /{/} ou {{}} etc.

Vous devez vous assurer que votre remplacement logique est insensible à la casse, par exemple à la fois {CustomerSurname} et {} Customersurname devrait être autorisé à représenter le même domaine. Peut être même le cas échéant laisser des espaces entre les mots comme {nom client}.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top