我在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