OpenXML 2.5 - WordProcessing - 如何在创建新文档时从模板文档中复制样式?

时间:2014-02-10 17:03:52

标签: c# .net ms-word openxml openxml-sdk

我有一个模板文档,其中包含一些段落和表格,其中包含与之相关的一些样式。

我需要根据序列从模板文档中选择元素,然后将它们附加到我的新文档的正文中。下面是我执行复制的代码。我不知何故需要复制与元素相关的样式。虽然应用了某些样式,但字体大小和表格边框等内容不会复制到新文档中。任何帮助将非常感激。感谢

   Dictionary<string, string> sequence = GetSequence();
            using (WordprocessingDocument templateDocument = WordprocessingDocument.Open(sourceFileLocation, false))
            {
                Body templateBody = templateDocument.MainDocumentPart.Document.Body;
                using (
                    WordprocessingDocument wordDoc = WordprocessingDocument.Create(destinationFileLocation,
                        WordprocessingDocumentType.Document))
                {
                    MainDocumentPart mainPart = wordDoc.AddMainDocumentPart();
                    mainPart.Document = new Document();
                    Body wordDocDocBody = mainPart.Document.AppendChild(new Body());
                   //don't think the below two lines work as I intended.
                    ThemePart themePart1 = templateDocument.MainDocumentPart.ThemePart;
                    mainPart.AddPart(themePart1);

                    foreach (var item in sequence)
                    {
                     var block = templateBody.Elements().TakeWhile(x => x.InnerText == item.Key);
                        foreach (var blockItem in block)
                        {
                            wordDocBody.Append(blockItem.CloneNode(true));
                        }
                    }
                }
            }

3 个答案:

答案 0 :(得分:1)

以下代码将具有固定名称的样式(在本例中为“canned&#39;表样式”)从一个Word文档复制到另一个Word文档。

void CopyTableStyles( WordprocessingDocument source, WordprocessingDocument destination )
        {
            var sourceStyles = source.MainDocumentPart.StyleDefinitionsPart.RootElement;
            var tableStyle = sourceStyles.Descendants<Style>()
                                .Where<Style>( s => s.StyleName.Val == "Light List - Accent 11")
                                .First<Style>();
            if ( tableStyle != null )
            {
                var destinationStyles = destination.MainDocumentPart.StyleDefinitionsPart.RootElement;
                destinationStyles.AppendChild( tableStyle.CloneNode( true ) );
                destination.MainDocumentPart.StyleDefinitionsPart.PutXDocument();
            }
            return;
        }

您应该能够从这里开始工作,使其更加健壮,更适合您的需要。

编辑:抱歉,PutXDocument是一种扩展方法,最初取自Open XML Developer网站上的Eric White的一个示例。

public static void PutXDocument(this OpenXmlPart part)
{
    XDocument xdoc = part.GetXDocument();
    if (xdoc != null)
    {
        // Serialize the XDocument object back to the Package.
        using (XmlWriter xw = XmlWriter.Create( part.GetStream( FileMode.Create, FileAccess.Write )))
        {
            xdoc.Save( xw );
        }
    }
}

上面的代码在我当前的&#34;技巧包中的OpenXmlPart静态扩展类中#34; - 我怀疑自从阅读怀特先生提供的博客文章/例子后我还没有改变它。

答案 1 :(得分:0)

在此行中:var block = templateBody.Elements().TakeWhile(x => x.InnerText == item.Key);您只选择Text个对象。因此,格式化被忽略了。您还需要将此Text对象的父项复制到新文档。您可能需要将Paragraph个孩子复制到RunText,以便复制格式。

答案 2 :(得分:0)

你的问题的解决方案将会相当大,所以我只是要说清楚需要做什么,你可以为此编写代码并在遇到问题时回来。

正如@ tr4nc3所提到的,考虑将父项复制到Text,如果要复制整个段落,请将Paragraph对象从源复制到目标,否则复制Run对象应该就够了。

如果存在将样式应用于段落的情况,则您必须获取该段落的ParagraphStyle.Val并使用该引用从{{1}复制Style对象到目标对象。

我知道这是一些需要做的事情,但是,如果你使用Open XML Productivity Tool它会让你的生活更轻松。