我已经在 InfoPath 表单中设置了富文本框,我的程序通过 Infopath XML 解析如下:
XPathNavigator formNameNode = root.SelectSingleNode("/my:myFields/my:Responses/my:Q1", nsMgr);
string response1 = formNameNode.InnerXml;
然后使用以下代码打开一个 word 文档并获取一个名为 response1 的纯文本内容控件:
using (WordprocessingDocument myDoc =
WordprocessingDocument.Open(ms, true))
{
MainDocumentPart mainPart = myDoc.MainDocumentPart;
List<OpenXmlElement> sdtList = InfoPathToWord.GetContentControl(mainPart.Document, "response1");
InfoPathToWord.AddRichText(0, response1, ref mainPart, ref sdtList);
}
然后代码调用 InfoPathToWord.AddRichText 如下:
public static void AddRichText(int id, string rtfValue,
ref MainDocumentPart mainPart, ref List<OpenXmlElement> sdtList)
{
if (sdtList.Count != 0)
{
id++;
string altChunkId = "AltChunkId" + id;
AlternativeFormatImportPart chunk =
mainPart.AddAlternativeFormatImportPart(
AlternativeFormatImportPartType.Xhtml, altChunkId);
using (MemoryStream ms = new MemoryStream(System.Text.Encoding.Default.GetBytes(rtfValue)))
{
chunk.FeedData(ms);
ms.Close();
}
AltChunk altChunk = new AltChunk();
altChunk.Id = altChunkId;
InfoPathToWord.ReplaceContentControl(sdtList, altChunk);
}
}
最后 altChunk 替换了“response1”
public static void ReplaceContentControl(
List<OpenXmlElement> sdtList, OpenXmlElement element)
{
if (sdtList.Count != 0)
{
foreach (OpenXmlElement sdt in sdtList)
{
OpenXmlElement parent = sdt.Parent;
parent.InsertAfter(element, sdt);
sdt.Remove();
}
}
}
问题是它替换了文本,但格式不正确并显示“?” 输出文本中的字符。不确定它是否是由于编码引起的,我也尝试过System.Text.Encoding.UTF8.GetBytes(rtfValue), System.Text.Encoding.ASCII.GetBytes(rtfValue)
,但这似乎没有帮助。
请有人告诉我我做错了什么。
提前致谢。
马夫