.net Interop. Вставка слов из docx без испорченного форматирования - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть проблема, с которой я столкнулся уже больше года.Я создал приложение Forms на VB.net, которое позволяет пользователю вводить некоторую информацию и выбирать элементы, которые представляют собой docx-файлы с таблицами со специальным форматированием, изображениями и другими особенностями форматирования в них.

В концепрограммное обеспечение создает документ Word через Office.Interop, используя информацию, предоставленную пользователем в текстовых полях в формах, и элементы, которые они выбрали (например, создает таблицу в Word, перечисляя выбор пользователя с некоторой дополнительной информацией), а затем добавляет содержимоеиз нескольких docx-файлов в зависимости от выбора пользователя к документу, созданному с помощью Interop.

Проблема в том, что для этого мне пришлось использовать довольно грязный метод: я открываю соответствующие docx-файлы, выбираю все содержимое(Range.Wholestory ()) и скопируйте его (Range.Copy ()).Затем я вставляю это содержимое из буфера обмена в свой недавно созданный документ со следующей опцией:

Selection.PasteAndFormat (wdFormatOriginalFormatting)

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

Первоначально я пытался использовать метод Selection.InsertFile и повторил попытку сегодня, но он полностью искажает форматирование.

Когда содержимоеdocx вставляется таким образом, что в нем нет ни форматирования исходного документа, ни файла, созданного мной с помощью программы.Например, значения SpaceBefore и SpaceAfter неверны, даже если я явно определяю их в своем созданном файле.Изменение форматирования впоследствии невозможно, поскольку исходные файлы содержат много специального форматирования и могут постоянно изменяться.

Еще один фактор, который усложняет задачу: я не могу сохранить файл до того, как он будет представлен пользователю,использование временной папки - не вариант в среде, в которой развернуто это приложение, поэтому в основном все происходит в ОЗУ.

Резюме:

По сути, я хочу создатьтот же результат, что и в моем методе «Копирование и вставка» с использованием OriginalFormatting БЕЗ использования буфера обмена.Проблема в том, что метод InsertFile не предоставляет опцию для форматирования.

Любая идея или помощь будет принята с благодарностью.

Редактировать:

Параметр FormattedText, предложенный Rich Michaels, дает тот же результат, что и метод InsertFile.Вот соответствующая часть того, что я сделал (слово Microsoft.Office.Interop.Word.Application):

#Opening the source file
Dim doctemp As Microsoft.Office.Interop.Word.Document
doctemp = word.Documents.Open(doctempfilepath)

#Selecting whole document; this is what I did for the "Copy/Paste"-Method, too
doctemp.Range.WholeStory()

Dim insert_range As wordoptions.Range
doc_destination.Activate()

#Jumping to the end and selecting the range
word.Selection.EndKey(Unit:=Microsoft.Office.Interop.Word.WdUnits.wdStory)
insert_range = word.Selection.Range

#Inserting the text
insert_range.FormattedText = doctemp.Range.FormattedText

doctemp.Close(False)

Это проблема: picture of the problem

1 Ответ

0 голосов
/ 12 сентября 2018

Используйте свойство Range.FormattedText. Он не касается буфера обмена и поддерживает исходное форматирование. Процесс идет ...

Установите диапазон в исходном документе, который вы хотите «скопировать» и установите точку вставки в документе-адресате, а затем,

DestinationRange.FormattedText = SourceRange.FormattedText
...