Примитивный MailMerge, использующий только имена полей с разделителями

StackOverflow https://stackoverflow.com/questions/1554532

Вопрос

Очевидно, что правильный способ для нашего приложения создать документ Word на основе шаблона — это побудить пользователей-администраторов (которые будут следить за шаблонами) встраивать правильные поля слияния или закладки в документ шаблона.

Однако в прошлом мы обнаружили, что наш типичный пользователь-администратор, который обычно не использует MailMerge или какие-либо другие «продвинутые» функции в Word, значительно отталкивается от необходимости использовать поля слияния.Мы постарались сделать это за них, подготовили документацию, множество скриншотов и т. д.Но для них это все «муторно».

У них есть десятки шаблонов (все это просто разные виды очень простых букв), и они захотят довольно часто их изменять.

Чего бы им действительно хотелось, так это иметь возможность просто помечать поля простым разделителем, например фигурной скобкой, который фактически отмечает самодельное поле слияния в нашем приложении (хотя Word не обращает внимания на его значение), например:

Уважаемый {CustomerSurname}

Затем мы можем просто выбрать поле(я) с помощью нескольких строк кода, например:

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

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

Кто-нибудь еще шел по этому пути?Что-нибудь не так?Мы бы посоветовали им не использовать символы «{» и «}» где-либо еще в обычном тексте документа, но на самом деле это не является существенным ограничением.

Скорость?Перенос поля слияния в две строки?Другие проблемы?

Это было полезно?

Решение

Это часть моего кода, которую я использовал для поиска и замены.Сначала я попробовал ваш код, но он не сработал.Это основано на коде VBA, который Word генерирует при записи макроса.

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)

Я использовал этот код, поскольку документы должны были быть совместимы с форматами двоичных файлов Office.Если вы можете использовать формат Office 2007, вам не обязательно устанавливать Word.Просто разархивируйте документ, найдите файл word\document.xml, выполните String.Replace("[OldValue]", "New value"), сохраните файл и заархивируйте его обратно в один пакет (файл docx).Код, который я здесь показал, работает довольно медленно, поскольку я автоматизирую Word.Открытие Word, редактирование двух документов с 6 полями и закрытие приложения на моем компьютере занимает 4 секунды.

Другие советы

Что, если пользователь захочет использовать фигурные скобки?Я думаю, вам следует предоставить способ избежать их, например. /{/} или {{}} и т. д.

Вам необходимо убедиться, что ваша логика замены нечувствительна к регистру, например, {CustomerSurname} и {Customersurname} должны иметь право представлять одно и то же поле.Можно даже при желании разрешить пробелы между словами, например {Фамилия клиента}.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top