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

Очевидно, что правильный способ для нашего приложения создать документ 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

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

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

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


person hawbsl    schedule 12.10.2009    source источник


Ответы (2)


Это часть моего кода, которую я использовал для поиска и замены. Сначала я попробовал ваш код, но это не сработало. Это основано на коде 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, редактирование 2 документов с 6 полями и закрытие приложения на моем компьютере занимает 4 секунды.

person ZippyV    schedule 12.11.2009

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

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

person Autodidact    schedule 12.10.2009