Pregunta

Es evidente que la forma correcta para nuestra aplicación para generar un documento de Word basado en una plantilla es animar a los usuarios administradores (que cuidará de las plantillas) para insertar los campos de combinación correctas o marcadores en el documento de plantilla.

Sin embargo, en el pasado hemos encontrado nuestro usuario admin típica que normalmente no utiliza MailMerge o cualquiera de las otras características "avanzadas" en Word se pone significativamente fuera por tener que utilizar campos de fusión. Hemos intentado hacer por ellos, la producción de documentación, un montón de capturas de pantalla, etc. Pero todo es "incómoda" para ellos.

Tienen docenas de plantillas (todos simplemente diferentes tipos de letras muy simples), y querrán modificarlos con una frecuencia razonable.

Lo que realmente me gustaría es ser capaz de simplemente marcar los campos con un delimitador simple como una llave, que en la práctica supone un campo de combinación casera a nuestra aplicación (aunque la palabra no es consciente de su importancia) como en:

  

Estimado {CustomerSurname}

A continuación, podemos simplemente captar el campo (s) con varias líneas de código como en:

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

Esto se siente crudo, pero maravillosamente simple (para el usuario final).

¿Alguien más ha ido por este camino? Nada de malo en ello? Nos no aconseja a utilizar el "{" y "}" carácter otra parte del texto normal del documento, pero que en realidad no es una limitación significativa.

velocidad? Envolver el campo de combinación a través de dos líneas? Otros problemas?

¿Fue útil?

Solución

Esta es una parte de mi código que he utilizado para buscar y reemplazar. Probé su código principio, pero que no funcionó. Esto se basa en el código VBA que genera la palabra cuando se graba una 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)

He utilizado este código porque los documentos necesarios para que sean compatibles con los formatos de archivo binario de Office. Si puede utilizar el formato de Office 2007 que no es necesario tener instalado Palabra. Simplemente descomprima el documento, encontrar el archivo de la palabra \ document.xml, hacer un String.Replace("[OldValue]", "New value"), guardar el archivo zip y de nuevo a un solo paquete (docx). El código que se muestran aquí es bastante lento porque estoy automatizando Palabra. La apertura de textos, edición de documentos 2 con 6 campos y cerrar la aplicación tarda 4 segundos en mi pc.

Otros consejos

¿Qué pasa si el usuario quiere utilizar llaves? Creo que debería proporcionar una manera de escapar de ellos, por ejemplo, /{/} o {{}} etc.

Es necesario asegurarse de que su reemplazar la lógica es sensible a mayúsculas, por ejemplo, tanto {CustomerSurname} y {} Customersurname se debe permitir que representan el mismo campo. Pueden permitir incluso opcionalmente espacios entre palabras como el apellido {Cliente}.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top