Примитивный 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} должны иметь одинаковое поле. Может быть даже опционально разрешить пробелы между словами, такими как {Фамилия клиента}.