Pergunta

Obviamente, a maneira correta de nosso aplicativo gerar um documento do Word baseado em um modelo é incentivar os usuários do administrador (que cuidarão dos modelos) para incorporar os campos de mesclagem corretos ou os favoritos no documento do modelo.

No entanto, no passado, encontramos nosso usuário típico de administrador que normalmente não usa o MailMerge ou nenhum dos outros recursos "avançados" do Word é significativamente adiado ao usar campos de mesclagem. Tentamos fazer isso por eles, produzindo documentação, muitas capturas de tela etc. Mas é tudo "complicado" para eles.

Eles têm dezenas de modelos (todos apenas tipos diferentes de letras realmente simples) e desejam modificá -los com frequência com frequência.

O que eles realmente gostariam é ser capaz de apenas marcar campos com um delimitador simples como uma cinta encaracolada, que efetivamente marca um campo de mesclagem caseiro em nosso aplicativo (embora a palavra seja alheia ao seu significado) como em:

Caro {Customerurname}

Em seguida, podemos simplesmente pegar o (s) campo (s) com várias linhas de código como em:

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

Isso parece grosseiro, mas lindamente simples (para o usuário final).

Alguém mais seguiu esse caminho? Algo errado com isso? Aconselhá -los a não usar o personagem "{" e "}" em outras partes do texto normal do documento, mas isso não é realmente uma limitação significativa.

Velocidade? Embrulhar o campo de mesclagem em duas linhas? Outros problemas?

Foi útil?

Solução

Isso faz parte do meu código que eu costumava encontrar e substituir. Eu tentei seu código primeiro, mas isso não funcionou. Isso é baseado no código VBA que a palavra gera quando você grava uma 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)

Usei esse código porque os documentos precisavam ser compatíveis com os formatos de arquivo binário do Office. Se você pode usar o formato Office 2007, não precisa instalar o Word. Apenas descompacte o documento, encontre o arquivo word document.xml, faça um String.Replace("[OldValue]", "New value"), salve o arquivo e abaixe -o de volta a um pacote (arquivo docx). O código que exibi aqui é bem lento porque estou automatizando o Word. Abertura da palavra, editar 2 documentos com 6 campos e fechar o aplicativo leva 4 segundos no meu PC.

Outras dicas

E se o usuário quiser usar aparelhos encaracolados? Eu acho que você deveria fornecer uma maneira de escapar deles, por exemplo /{/} ou {{}} etc.

Você precisa garantir que sua lógica de substituição seja insensível ao caso, por exemplo, {Customerurname} e {Customerurname} devem representar o mesmo campo. Pode ser até opcionalmente permitir espaços entre palavras como {sobrenome do cliente}.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top