Невозможно заполнить элемент управления содержимым в Word с помощью OpenXML

Я новичок в OpenXML и собираюсь заняться этим вопросом. Помощь будет очень признательна.

Обзор заключается в том, что я пытаюсь заполнить шаблон содержимого документа Word через asp.net.

Я легко смог заполнить поля с помощью CustomXML, НО документ, который я пытаюсь заполнить, также сопоставлен с библиотекой документов SharePoint. Поэтому, когда я загружаю документ в библиотеку SharePoint, он автоматически заполняет столбцы из элементов управления содержимым в документе Word. Теперь использование настраиваемого XML разрушает эту настройку. А использование OpenXML для заполнения данных не работает, когда элементы управления сопоставлены с SharePoint.

Пожалуйста, помогите с образцом кода или правильным направлением.


person Ravi Patel    schedule 08.08.2012    source источник


Ответы (1)


Именно это мы и сделали в нашем проекте :) Вам повезло.

сначала вам нужно создать приемник событий для этой библиотеки документов. и вам нужно реализовать ItemUpdated и ItemAdded. см. http://www.dotnetcurry.com/ShowArticle.aspx?ID=649 http://blogs.msdn.com/b/brianwilson/archive/2007/03/05/part-1-event-handlers-everything-you-need-to-know-about-microsoft-office-sharepoint-portal -server-moss-event-handlers.aspx

// код для приемника событий .. Это даст вам имя элемента управления содержимым и его значения

 Dictionary<string, string> results = new Dictionary<string, string>();
            using (Stream stream = file.OpenBinaryStream(SPOpenBinaryOptions.SkipVirusScan)) {

                using (WordprocessingDocument doc = WordprocessingDocument.Open(stream, true)) {
                    var contentControls = doc.MainDocumentPart
                        .GetXDocument()
                        .Descendants(w + "sdt");

                    foreach ( var contentControl in contentControls ) 
                    {
                        string key = (string)contentControl.Descendants(w + "sdtPr").Elements(w + "alias").Attributes(w + "val").FirstOrDefault();
                        string val = GetTextFromContentControl(contentControl);
                        results[key] = val;
                    }

 }

static string GetTextFromContentControl(XElement contentControlNode) {
            return contentControlNode.Descendants(w + "p")
                .Select
                (
                    p => p.Elements()
                          .Where(z => z.Name == r || z.Name == ins || z.Name == br)
                          .Descendants()
                          .Where(z => z.Name == w + "t" || z.Name == w + "br")
                          .StringConcatenate(element => (string)element + (element.Name == w + "br" ? Environment.NewLine : "")) + Environment.NewLine
                ).StringConcatenate();
        }
person Raheel    schedule 09.08.2012