Копировать текст с маркерами в OpenXml - PullRequest
0 голосов
/ 12 октября 2011

У меня следующая проблема:

Текст необходимо скопировать из одного текстового редактора в другой текстовый документ.Исходный документ не всегда доступен при вставке текста в целевую часть.Текст сериализуется и извлекается позже.

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

Вот пример кода:

Public Sub SerializeParagraphsBetweenBookmark(ByVal stream As Stream)
    Dim wordDoc = WordprocessingDocument.Open(_fileLocation, True)
    Dim paragraphsFromBookmarks As IEnumerable(Of Paragraph)
    Using (wordDoc)
        paragraphsFromBookmarks = GetAllParagraphFromBookmarks(wordDoc)
    End Using
    SerializeParagraphsToFile(paragraphsFromBookmarks, stream)
End Sub

Private Sub SerializeParagraphsToFile(ByVal paragraphsFromBookmarks As IEnumerable(Of Paragraph), stream As Stream)
    ' the IEnumerable of paragraphs must be converted to an IEnumerable of strings before it can be converted
    Dim serializableIEnumerable = paragraphsFromBookmarks.Select(Function(x) x.OuterXml).ToList()
    Dim binSerializer As New BinaryFormatter()
    binSerializer.Serialize(stream, serializableIEnumerable)
End Sub

Затем, когда я их получаю, я добавляю их вцелевой файл выглядит так:

Public Sub InsertParagraphsInDocument(paragraphs As IEnumerable(Of Paragraph))
    Dim wordDoc = WordprocessingDocument.Open(_fileLocation, True)
    Using (wordDoc)
        Dim rootElement = wordDoc.MainDocumentPart.RootElement
        Dim bookmark = rootElement.Descendants(Of BookmarkStart).FirstOrDefault(Function(x) x.Name.Value.Equals(_pasteBookmark))
        Dim paragraphsList = paragraphs.ToList()
        For i As Integer = paragraphsList.Count - 1 To 0 Step -1
            bookmark.Parent.InsertAfterSelf(paragraphsList(i))
        Next
    End Using
End Sub

Код ничего особенного, и любые предложения по улучшению приветствуются.

Я знаю, что маркеры хранятся в NumberingDefinitionsPart Часть MainDocument, но моя проблема в том, как узнать, какие AbstractNum и NumberingInstance вставить в этот NumberingDefinitionsPart?

1 Ответ

0 голосов
/ 14 ноября 2011

Я нашел ответ сам, похоже, мне пришлось синхронизировать часть определения нумерации между двумя файлами.

Я написал инструмент, который делает это, поэтому, если кому-то интересно, проверьте его: http://www.lucbos.net/2011/11/wordprocessing-serialization-move.html

...