Примитивный MailMerge с использованием только что разделенных имен полей - PullRequest
3 голосов
/ 12 октября 2009

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

3 голосов
/ 12 ноября 2009

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

1 голос
/ 12 октября 2009

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

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

...