我在Word模板中有一个富文本框contentControl。我试图将RTF数据插入ContentControl并生成一个Word文档。正如所述,我尝试了AltChunk
。这将与SdtBlock
一起使用。由于SdtBlock
的父亲为Body
,因此我们可以直接将AltChunk
插入身体。如果word文档具有多个富文本框contentControls,则word将该控件保存为SdtRun
。 SdtRun
的父亲是Paragraph
,它的父母是Body。如果我们试图做类似使用OpenXML将RTF和HTML插入到富文本框内容控件
SdtRun contentControl = (SdtRun)wordprocessingDocument.MainDocumentPart.RootElement.Descendants<SdtRun>().FirstOrDefault(x => x.Descendants<Tag>().Any(y => y.Val == "richtextbox"));
contentControl.Parent.Parent.InsertAfter(altChunk, contentControl); //contentControl.Parent.Parent - Returns body of document
抛出异常 操作无效由于对象的当前状态
所以我试图用Paragraph
Paragraph contentControl = (Paragraph)wordprocessingDocument.MainDocumentPart.RootElement.Descendants<Paragraph>().FirstOrDefault(x => x.Descendants<Tag>().Any(y => y.Val == "richtextbox"));
contentControl.Parent.InsertAfter(altChunk, contentControl); //contentControl.Parent - Returns body of document
此代码以RTF格式插入数据。但问题是我无法插入到Rich TextControl的正确位置,因为我们正在对Paragraph
进行操作。
完整的代码下面贴
string templatePath = @"Template1.docx";
string newFile = @"Template1_Processed.docx";
System.IO.File.Copy(templatePath, newFile, true);
using (WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Open(newFile, true))
{
Paragraph sdtElement = (Paragraph)wordprocessingDocument.MainDocumentPart.RootElement.Descendants<Paragraph>().FirstOrDefault(x => x.Descendants<Tag>().Any(y => y.Val == "richtextbox"));
string innerText = @"{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}}{\colortbl ;\red139\green0\blue0;}\viewkind4\uc1\pard\cf1\f0\fs24 test\par}";
string altChunkId = "myId";
MainDocumentPart mainDocPart = wordprocessingDocument.MainDocumentPart;
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(innerText));
// Create alternative format import part.
AlternativeFormatImportPart formatImportPart =
mainDocPart.AddAlternativeFormatImportPart(
AlternativeFormatImportPartType.Rtf, altChunkId);
// Feed HTML data into format import part (chunk).
formatImportPart.FeedData(ms);
AltChunk altChunk = new AltChunk();
altChunk.Id = altChunkId;
sdtElement.Parent.InsertAfter<AltChunk>(altChunk, sdtElement);
SdtElement contentControl = (SdtElement)wordprocessingDocument.MainDocumentPart.RootElement.Descendants<SdtElement>().FirstOrDefault(x => x.Descendants<Tag>().Any(y => y.Val == "richtextbox"));
contentControl.Remove();
wordprocessingDocument.MainDocumentPart.CreateRelationshipToPart(formatImportPart);
sdtElement = (Paragraph)wordprocessingDocument.MainDocumentPart.RootElement.Descendants<Paragraph>().FirstOrDefault(x => x.Descendants<Tag>().Any(y => y.Val == "richtextbox1"));
if (sdtElement != null)
{
innerText = @"<html><head></head><body><h1>HELLO</h1></body></html>";
altChunkId = "myId1";
ms = new MemoryStream(Encoding.UTF8.GetBytes(innerText));
// Create alternative format import part.
formatImportPart =
mainDocPart.AddAlternativeFormatImportPart(
AlternativeFormatImportPartType.Html, altChunkId);
// Feed HTML data into format import part (chunk).
formatImportPart.FeedData(ms);
altChunk = new AltChunk();
altChunk.Id = altChunkId;
sdtElement.Parent.InsertAfter(altChunk, sdtElement);
contentControl = (SdtElement)wordprocessingDocument.MainDocumentPart.RootElement.Descendants<SdtElement>().FirstOrDefault(x => x.Descendants<Tag>().Any(y => y.Val == "richtextbox1"));
contentControl.Remove();
wordprocessingDocument.MainDocumentPart.CreateRelationshipToPart(formatImportPart);
wordprocessingDocument.MainDocumentPart.Document.Save();
wordprocessingDocument.Close();
}
}
附加模板 的屏幕截图,并生成word文档
由于我们是后插入到Paragraph
,这是越来越插入非常旁Paragraph
。所以我们不能将数据插入文档中富文本数据的正确位置。
任何人都可以帮我解决这个问题/建议任何替代方法来实现相同的?
其实,你可以有一个的docx文件的多个数据块级的富文本内容控件(通过Word或其他方式创建)。 – JasonPlutext 2014-08-29 10:08:24