Примитивный 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

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

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

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

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 секунды на моем компьютере.

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

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

Другие вопросы по тегам