OpenXml Sdk - копирование разделов docx в другой docx

Я пробую следующий код. Требуется fileName (файл docx с множеством разделов), и я пытаюсь перебирать каждый раздел, получая имя раздела. Проблема в том, что у меня получаются нечитаемые файлы docx. Это не ошибка, но я думаю, что делаю что-то не так с получением элементов в разделе.

public void Split(string fileName) {
            using (WordprocessingDocument myDoc =
                WordprocessingDocument.Open(fileName, true)) {
                string curCliCode = "";
                MainDocumentPart mdp = myDoc.MainDocumentPart;

                foreach (var element in mdp.Document.Body.ChildElements) {
                    if (element.Descendants().OfType<SectionProperties>().Count() == 1) {
                        //get the name of the section from the footer
                        var footer = (FooterPart) mdp.GetPartById(
                                                      element.Descendants().OfType<SectionProperties>().First().OfType
                                                          <FooterReference>().First().
                                                          Id.Value);
                        foreach (Paragraph p in footer.Footer.ChildElements.OfType<Paragraph>()) {
                            if (p.InnerText != "") {
                                curCliCode = p.InnerText;
                            }
                        }
                        if (curCliCode != "") {
                            var forFile = new List<OpenXmlElement>();
                            var els = element.ElementsBefore();
                            if (els != null) {
                                foreach (var e in els) {
                                    if (e != null) {
                                        forFile.Add(e);
                                    }
                                }
                                for (int i = 0; i < els.Count(); i++) {
                                    els.ElementAt(i).Remove();
                                }
                            }
                            Create(curCliCode, forFile);
                        }
                    }
                }

            }
        }
        private void Create(string cliCode,IEnumerable<OpenXmlElement> docParts) {
            var parts = from e in docParts select e.Clone();
            const string template = @"\Test\toSplit\blank.docx";
            string destination = string.Format(@"\Test\{0}.docx", cliCode);
            File.Copy(template, destination,true);
            /* Create the package and main document part */
            using (WordprocessingDocument myDoc =
                WordprocessingDocument.Open(destination, true)) {
                MainDocumentPart mainPart = myDoc.MainDocumentPart;
                /* Create the contents */
                foreach(var part in parts) {
                    mainPart.Document.Body.Append((OpenXmlElement)part);
                }

                /* Save the results and close */
                mainPart.Document.Save();
                myDoc.Close();
            }
        }

Кто-нибудь знает, в чем может быть проблема (или как правильно скопировать раздел из одного документа в другой)?


person jle    schedule 11.01.2011    source источник
comment
Есть ли хорошие примеры подобных вещей в OpenXml SDK?   -  person jle    schedule 11.01.2011


Ответы (2)


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

Я бы взял файл, который, как вы знаете, работает, и скопировал все разделы в шаблон. Теоретически два файла должны быть идентичными. Выполните для них сравнение файла document.xml внутри файла docx, и вы увидите разницу.

Кстати, я предполагаю, что вы знаете, что docx на самом деле является zip; измените расширение на «zip», и вы сможете получить фактические файлы xml, составляющие формат.

Что касается инструментов сравнения, я использую Beyond Compare от Scooter Software.

person Chris B. Behrens    schedule 11.01.2011
comment
Инструмент повышения производительности Open XML SDK 2.0 имеет встроенную опцию сравнения в качестве другой опции. - person amurra; 19.01.2011

Подход, подобный тому, что вы делаете, будет работать только для простых документов (то есть тех, которые не содержат изображений, гиперссылок, комментариев и т. Д.). Чтобы справиться с этими более сложными документами, взгляните на http://blogs.msdn.com/b/ericwhite/archive/2009/02/05/move-insert-delete-paragraphs-in-word-обработка-документов-using-the-open-xml-sdk.aspx и результирующий API DocumentBuilder (часть проекта PowerTools для Open XML на CodePlex).

Чтобы разбить docx на разделы с помощью DocumentBuilder, вам все равно нужно сначала найти индекс абзацев, содержащих элементы sectPr.

person JasonPlutext    schedule 11.01.2011