我有一个模板文档,其中包含一些段落和表格,其中包含与之相关的一些样式。
我需要根据序列从模板文档中选择元素,然后将它们附加到我的新文档的正文中。下面是我执行复制的代码。我不知何故需要复制与元素相关的样式。虽然应用了某些样式,但字体大小和表格边框等内容不会复制到新文档中。任何帮助将非常感激。感谢
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));
}
}
}
}
答案 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
个孩子复制到Run
到Text
,以便复制格式。
答案 2 :(得分:0)
你的问题的解决方案将会相当大,所以我只是要说清楚需要做什么,你可以为此编写代码并在遇到问题时回来。
正如@ tr4nc3所提到的,考虑将父项复制到Text
,如果要复制整个段落,请将Paragraph
对象从源复制到目标,否则复制Run
对象应该就够了。
如果存在将样式应用于段落的情况,则您必须获取该段落的ParagraphStyle.Val
并使用该引用从{{1}复制Style
对象到目标对象。
我知道这是一些需要做的事情,但是,如果你使用Open XML Productivity Tool它会让你的生活更轻松。