Domanda

Ovviamente il modo corretto per la nostra applicazione per generare un documento di Word basato su un modello è quello di incoraggiare gli utenti di amministrazione (che si occuperà dei modelli) per incorporare i campi o segnalibri unione corretti nel documento modello.

Tuttavia, in passato abbiamo trovato il nostro tipico utente amministratore che di solito non fa uso di MailMerge o una qualsiasi delle altre funzioni "avanzate" in Word è significativamente scoraggiare da dover utilizzare i campi di fusione. Abbiamo cercato di farlo per loro, la produzione di documentazione, un sacco di screenshot, ecc Ma è tutto "poco pratici" per loro.

Hanno decine di modelli (tutti solo diversi tipi di lettere molto semplici), e vorranno modificarli ragionevolmente frequente.

Quello che sarebbe davvero come è quello di essere in grado di marcare solo campi con un semplice delimitatore come una parentesi graffa, che segna in modo efficace un campo unione fatta in casa per la nostra applicazione (anche se Word è ignaro al suo significato) come in:

  

Caro {CustomerSurname}

Allora possiamo solo prendere il campo (s) con diverse righe di codice come in:

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

Questo si sente grezzo, ma splendidamente semplice (per l'utente finale).

Qualcun altro ha intrapreso questa strada? Tutto ciò che non va? Vi consigliamo loro di non utilizzare il carattere "{" e "}" altrove nel testo normale del documento, ma che non è in realtà una limitazione significativa.

velocità? Avvolgendo il campo unione tra due linee? Altri problemi?

È stato utile?

Soluzione

Questa è una parte del mio codice che ho usato per trovare e sostituire. Ho provato il codice prima, ma che non ha funzionato. Questo si basa sul codice VBA che Word genera quando si registra 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)

Ho usato questo codice, perché i documenti necessari per essere compatibile con i formati di file binari di Office. Se è possibile utilizzare il formato di Office 2007 non è necessario avere installato Word. Basta decomprimere il documento, trovare il file word \ document.xml, fare un String.Replace("[OldValue]", "New value"), salvare il file zip e di nuovo a un unico pacchetto (file docx). Il codice ho esposto qui è piuttosto lento perché sto automazione di Word. Che apre Word, la modifica di documenti 2 con 6 campi e chiudendo l'applicazione prende 4 secondi sul mio pc.

Altri suggerimenti

Che cosa succede se l'utente non vuole usare le parentesi graffe? Credo che si dovrebbe fornire un modo per sfuggire loro, ad esempio /{/} o {{}} ecc

È necessario assicurarsi che il vostro posto di logica è case insensitive per esempio sia {CustomerSurname} e {} Customersurname dovrebbe essere consentito di rappresentare lo stesso campo. Può essere anche consentire facoltativamente spazi tra le parole come {} cognome del cliente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top